ここから本文です

指定した文字色のセルの個数を求めるために ---------------------- Function CO...

アバター

ID非公開さん

2017/8/1321:21:32

指定した文字色のセルの個数を求めるために
----------------------
Function COUNTCOLOR(data As Range, color As Integer)
Count = 0
For Each c In data
If c.Font.ColorIndex = color

Then
Count = Count + 1
End If
Next c
COUNTCOLOR = Count
End Function
-----------------------
というユーザー定義関数を使っていたのですが、範囲を広くすると、何処かに文字を入力するたびに重くなってしまいます。
範囲を広くしても重くならないようにはできないでしょうか。
よろしくお願いします。

閲覧数:
163
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

sk_********さん

2017/8/1408:32:03

ユーザー定義関数で指定した範囲に変化があると、その都度、この処理を行っています。
オブジェクトを操作するマクロの中で、特にFontが絡むものは処理に時間がかかります。参照範囲を広くすると、時間がかかるのは仕方のないことだと思います。

時間を短くしたければ、次のような考え方はどうでしょうか。

1.マクロにする
ユーザー定義関数ではなく、必要な時に、処理を実行するマクロにするのはどうでしょう。

2.ユーザー定義関数にフラグをつける
先のユーザー定義関数を少し改変しました。

Function COUNTCOLOR(data As Range, ByVal color As Integer, ByVal f As Boolean) As Long
If Not f Then Exit Function: Dim c As Range
For Each c In data
If c.Font.ColorIndex = color Then COUNTCOLOR = COUNTCOLOR + 1
Next c
End Function

3つ目の引数をつくり、その引数がTRUEの時だけ、処理を実行する。
使い方は、3つ目の引数をセル参照にし、そのセルをトリガーにする。
この関数の1つ目の引数のセル範囲参照を変更するときは、
3つ目の引数をFLASEにしておき、
色付きフォントセルをカウントしたい時だけセルを
3つ目の引数をTRUEにし、処理を実行する。
(画像参照)

ユーザー定義関数で指定した範囲に変化があると、その都度、この処理を行っています。...

アバター

質問した人からのコメント

2017/8/14 21:39:18

できました!
ありがとうございました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる