![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
添付画像のように、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の支店の数なども、都度増やしたり減らしたりして、カウントのシートに反映させたいので、どうにかサクサク更新して作業が軽くなるような方法はないでしょうか。
![「ExcelのマクロVBA動作を軽くする方」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/c/543099712_60ce5f66bebd8/M.jpg)
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も見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
排他的論理和 BCC(水平パリテ...
-
c言語でsinx=0(0<x<5)をニュー...
-
VBAで・・・
-
骨折リスク評価のFRAXについて...
-
エクセルで特定のセルのみを任...
-
変化させるセルが変化しない
-
C言語の課題で助けてください
-
再帰呼び出しの計算量
-
Vb6.0で三角関数が使えない
-
モジュラス103の計算とは何でし...
-
相性占いのソース
-
数値計算の高速化 (cos, sin, exp)
-
計算式の考え方?HSP
-
VBAの再計算が反映されない件に...
-
BASIC:行列式の値を求めるプロ...
-
傾いた四角形内の範囲の条件式
-
VB6.0でのバイナリデータの扱い...
-
C# C1FlexGrid SUBTOTAL で計算式
-
CとFORTRANの計算速度はどちら...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
mod でうまく
-
めちゃきれい
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
バッチファイルでウインドウを...
-
モジュラス103の計算とは何でし...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
60進数の四則計算
-
プログラムの質問
-
VBでReplace
-
数値計算の高速化 (cos, sin, exp)
-
C言語についてです。 再帰を使...
-
Javaを使った行列計算
-
C言語のプログラミングの問題で...
-
エクセルで特定のセルのみを任...
-
matlab計算での進捗状況を知りたい
-
CとFORTRANの計算速度はどちら...
-
matlabで計算終了
おすすめ情報
式は、=CountColor(sheet1!C:C,A1)です。