人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: やねうらお
●カテゴリ:コンピュータ
✍キーワード:as COLOR Excel NeXT イベント
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kiyotoi
●50ポイント

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

はてな

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


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Calculate

End Sub

◎質問者からの返答

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


2 ● kiyotoi
●50ポイント

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

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

条件によって、

CountColor関数と

Worksheet_SelectionChangeイベントプロシージャ

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


失礼しました。


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

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

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

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


セル色を変更して、

[Enter]キーをたたくと

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

◎質問者からの返答

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

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

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

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

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

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

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

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

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

長々とすみません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ