質問: wkcount end function ですが、sheet1で支店を追加したり、フィルターをかけたり等の作業をすると、動作がとても重くなります。 sheet1の支店の数なども、都度増やしたり減らしたりして、カウントのシートに反映させたいので、どうにかサクサク更新して作業が軽くなるような方法はないでしょうか。
回答: こんにちは >どうにかサクサク更新して作業が軽くなるような方法はないでしょうか。 速度を上げるためのアイデアを以下にいくつか... 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などで、再実行しておくのも手かもしれません。 (まぁ、この点に関しては、現状でも似たところがあると思いますので・・・)