Excelで同じ色のセルを数える次のようなCountColor関数を書きました。しかし、セルの変更に対してはイベントが発生しないのか、その変更したセルをCountColor関数で参照しているセルの再計算が行なわれません。(色のついたセルをコピーした場合はWorkSheet.SelectionChangeハンドラ等で捕捉できるのですが。) 何かいい方法はないでしょうか?


Function CountColor(baseColor As Range, rRange As Range) As Integer
Dim c As Integer
Dim color As Long
color = baseColor.Interior.ColorIndex
For Each rCell In rRange
If (rCell.Interior.ColorIndex = color) Then c = c + 1
Next rCell
CountColor = c
End Function

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/08/22 19:42:22
  • 終了:--

回答(2件)

id:kiyotoi No.1

kiyotoi回答回数9ベストアンサー獲得回数02005/08/22 21:58:12

ポイント50pt

CountColor関数を利用しているワークシートに、以下のようなイベントプロシージャを定義するという方法ではいかがでしょう?


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 Calculate

End Sub

id:yaneurao

回答ありがとうございます。ですが、質問のほうにも書かせていただいている通り、セルの色の変更はWorkSheet.SelectionChangeハンドラでは捕捉できません。よって、その方法ではダメなのです。

2005/08/25 01:28:34
id:kiyotoi No.2

kiyotoi回答回数9ベストアンサー獲得回数02005/08/25 08:48:27

ポイント50pt

http://www.hatena.ne.jp/1124707342#

人力検索はてな - Excelで同じ色のセルを数える次のようなCountColor関数を書きました。しかし、セルの変更に対してはイベントが発生しないのか、その変更したセルをCountColor関数で参照し..

条件によって、

CountColor関数と

Worksheet_SelectionChangeイベントプロシージャ

で計算されるときもあれば計算されないときもあるようです。


失礼しました。


先のWorksheet_SelectionChangeイベントプロシージャは残したまま、

CountColor関数の変数宣言の直後に

「Application.Volatile」ステートメント

を追加してみてください。


セル色を変更して、

[Enter]キーをたたくと

再計算されることをExcel 2003で確認しました。

id:yaneurao

回答ありがとうございます。

Application.Volatileで、CountColor関数を自動再計算関数にして、Worksheet_SelectionChangeで選択範囲変更に対しても再計算を促すようにして、Enterキー等で選択範囲を移動させれば)CountColorが再計算されるということですね。

確かにこれでほぼ期待通りなので、これにて回答をしめきりたいと思います。ありがとうございました。

しかし、以下が私の悩みどころです。

自動再計算関数が呼び出されるのは、イベント発生時となっていると思います。すなわち、セル内容が数値的に変更されたときであって、色の変更はイベントが発生しないため、自動再計算関数にしてもCountColorが呼び出されることはありません。

つまり、「セルの色を変更した後、そのまま集計してしまうヒューマンエラーをどう防ぐか?」

また、自動再計算関数にしてしまいますと、ワークシート上のすべてのCountColor(セルの色をカウントするため結構CPU負荷がかかります)をセル変更毎に呼び出すため、非常に入力レスポンスが悪くなってしまいます。しかも今回の場合は選択範囲が変更されるごとに再計算していますから、カーソルキーを押すごとに非常にCPU負荷がかかります。これをどう防ぐかが非常に悩みどころです。

CountColorの引数として監視するセル範囲をRangeとして取っているのですから、ここのセル範囲の変更に対してCountColorが呼び出されるべきで、色変更に対しても当然このCountColorが呼び出されなければならないと私は考えます。しかしExcelの設計理念は残念ながらそうはなっていないようです。

結局のところ集計前にCtrl+Alt+F9による強制再計算をさせるか、集計用のボタンを別に用意して、そこでApplication.CalculateFullを実行するしかなさそうです。

長々とすみません。

2005/08/25 10:47:35
  • id:yaneurao
    解決策が見つかりました!!

    自分のblogのほうに書かせてもらったところ解決策が見つかりましたのでご紹介しておきます。
    http://d.hatena.ne.jp/yaneurao/20050829

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません