
添付画像のように、sheet1の支店の数を、カウントのシートで数えています。
(特定の文字と文字色をカウントしています)
マクロは以下のように設定しています。
Public Function CountColor(ByVal area As Range, ByVal colorCell As Range) As Long
Dim targetRange As Range
Dim wkCount As Long
wkCount = 0
For Each targetRange In area
If targetRange.Font.Color = colorCell.Font.Color Then
If targetRange.Value = colorCell.Value Then
wkCount = wkCount + 1
End If
End If
Next
CountColor = wkCount
End Function
ですが、sheet1で支店を追加したり、フィルターをかけたり等の作業をすると、動作がとても重くなります。
sheet1の支店の数なども、都度増やしたり減らしたりして、カウントのシートに反映させたいので、どうにかサクサク更新して作業が軽くなるような方法はないでしょうか。

No.2ベストアンサー
- 回答日時:
こんにちは
>どうにかサクサク更新して作業が軽くなるような方法はないでしょうか。
速度を上げるためのアイデアを以下にいくつか…
1)すでに指摘が出ている内容はもっともな内容です。
組み込み関数等では未使用範囲は計算をスキップしているようですが、VBAの場合は指定範囲全部を計算しますので、範囲を狭めることで計算回数を大きく減らせます。
2)セルにアクセスすると時間がかかるので回数を減らす。
具体的には、colorCell.Font.Color、colorCell.Valueにループで毎回アクセスしていますが、固定値なのでループ外で最初に変数に格納しておくようにするだけで速度はさらに上がります。
(ほぼ半分以下になります)
3)ループで1セルずつチェックせずにFIND、FINDNEXTで検索する方が速いかと予想しましたが、どうやらそうでもないらしく、簡単なテストを行ったところではご提示のままよりは大分速くなりますが、1)と2)の組み合わせの方がさらに速くなるようです。
4)ワークシート関数のCountIfでカウントするのが最も速そうなので、これで実現できるように、全体の仕組みを以下のように変えます。
考え方としては、計算にかかる時間を分散して一部を事前に計算しておいて単純なCOUNTIF計算が可能な形式にしておくことと、VBAよりも速いと考えられる組み込み関数を利用することでしょうか。
・Sheet1に作業列を用意します(どこでも良い)
・color値は10進8桁で表示できるので、「文字列+color値(前0で8桁固定)」を返す関数を用意しておく。(関数を、仮にCとする)
・関数Cで、A列の値を「文字列+color値」として作業列に記入する。
( =C(A1)のような要領)
・実際にカウントする関数は、=COUNTIF(Sheet1!作業列, C(A1)) 等として入力。
※ 簡単なテストしかしていませんが、最後の4)の方法が最も速いと思われます。
※ ただし、No1様のご指摘にもありますが、色を変えても関数の監視対象外なので、色の編集操作を反映させるには少々注意が必要になります。
念のため、Sheet1のDeActivateなどで、再実行しておくのも手かもしれません。
(まぁ、この点に関しては、現状でも似たところがあると思いますので・・・)
No.1
- 回答日時:
大きなお世話かもしれませんが、文字の色に意味を持たせるのは、やめた方が良いですよ!!例えば、色を変えただけでは再計算が行われないので、タイミングによっては、間違った表示になっていることがあります。
さて、本題の処理を軽くする件です。
集計範囲を「C:C」のように列を丸ごと指定しているようですが、これだと未使用の行に対してもカウント判定を行ってしまうので、余計な時間を要しているのではないでしょうか。
対応策としては、集計範囲を「C1:C200」のように限定するとか・・・。
もしくは、関数側で未使用行を対象外にするとか・・・。
関数側で対応するなら、こんな感じですかね。
For Each targetRange In Intersect(area, area.Worksheet.UsedRange)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
数値+演算子+数値を計算したい!
-
VBAの再計算が反映されない件に...
-
C言語についての質問です。 ル...
-
再帰呼び出しの計算量
-
決定木を用いて、ソーティング...
-
素数を自動的に作る
-
ActionScriptでアナログ時計
-
Word2007 図の属性一括変更(行...
-
プログラミングの課題で分から...
-
モジュラス103の計算とは何でし...
-
assemble bit単位演算の質問
-
先行評価と遅延評価
-
C言語にて、指数の計算をするプ...
-
エクセルVBA 他の仕事を止...
-
Matlabでのinverse(逆関数)の...
-
fortran dlog2
-
情報処理 ポインタ渡しによる...
-
エクセル VBAで 再計算を...
-
Cプログラムの動作
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
モジュロ
-
バッチファイルでウインドウを...
-
Visual C++でdebugとreleaseで...
-
y=(x^2 +3x+1)^4を微分の定義を...
-
入射角反射角
-
スレッド処理からダイアログを...
-
60進数の四則計算
-
Javaと他言語比較について
-
VBAで関数をつくる
-
C言語 Σをつかったプログラム
-
CRC8を教えてください
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
おすすめ情報
式は、=CountColor(sheet1!C:C,A1)です。