いたちめです。
僕がVBAの高速化させることを楽しんだ記録、備忘録を兼ねてます。
今回はコピペでできるもの、変数でできるものの二つを紹介します。
目次
簡単高速化!のコピペとその意味
誰でもできるコピペから始めます。
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
この三行をです。
これを「sub」の直下とかVBAの変数を定義したりしたあとにコピペします。
で、「end sub」の前には、
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
これで元に戻します。
かなりざっくりした説明
Application.ScreenUpdating = False
画面表示をOFFにする。
Sheet1からsheet2へ移動したり、別ブックを開いたり、セルに入力したりなどの画面移動がとまる。動いてんじゃねぇてこと。
Application.EnableEvents = False
通知機能をOFFにする。
アプリケーションからのイベント通知するプロパティ、いちいち確認いらねぇから!っててこと。
Application.Calculation = xlCalculationManual
計算方式を手動計算に切り替える。
セルごとの計算を自動計算から手動計算に切り替えて、計算問題は面倒だから後回しするってこと。
注意というか当たり前のことなんだけど。
計算方式の高速化は「自動計算から手動計算」に変更するので、
セルに数式を入れているいる場合、それが計算されないままマクロが終了するってこと。
例えば、
A1セルとB1セルに マクロでそれぞれ「1」を入力
C1セルに数式「=sum(A1:B1)」が入力されてるとき。
こういったものがあるときは、「計算方式の高速化」のコピペは外しておいた方がいいですね☆
変数を決めてValiant型からの脱出
VBAを始めると「変数ってなんだ?」ってなりますが、イメージは箱。AMAZONの箱。
でValiant(バリアント)って万能な箱、なんでも入る箱。ただし、デカい。
デカくて重たい箱だから、メモリを食い散らかす。
万能なんだけど重たい箱を使うより、入れたいものにあったサイズの箱を使う。
これが変数を宣言するっていう変数を決めること。
何にも決めてないと、いつだってデカい箱を使う。
プラカラー一つを段ボール箱で送ってくれるAMZON様みたいにね。
たとえば
i = 12345
みたいに何も変数を宣言していないときや
Dim i as Valiant
i = 12345
Valiant型で変数を宣言したとき、これは数字でもいけるし文字でもいける。
対して、
Dim i as long
i = 12345 って変数を決めてあげるとiは数値で12,345となり
Dim i as string
i = 12345 って変数を決めてあげるとiは文字で12345となる。
この違いです。数値のときは別にlongじゃなくても構いません。
例題で実践してみよう♪
下記のVBAを適当に標準モジュールに添付して、コピペと変数の宣言をやってみよう☆
Sub 実践してみよう()
ThisWorkbook.Activate
Sheets("sheet1").Select
Range("A1").Value = 1
Sheets("sheet2").Select
Range("A2").Value = 2
Sheets("sheet3").Select
Range("A3").Value = Sheets("sheet1").Range("A1") + Sheets("sheet2").Range("A2")
End sub
正解でも最適解でもないけど、僕なりの高速化として
Sub 実践してみよう me()
Dim sh1 As Worksheet
Set sh1 = ThisWorkbook.Sheets("sheet1")
Dim sh2 As Worksheet
Set sh2 = ThisWorkbook.Sheets("sheet2")
Dim sh3 As Worksheet
Set sh3 = ThisWorkbook.Sheets("sheet3")
Application.ScreenUpdating = False
Application.EnableEvents = False
sh1.Activate
sh1.Range("A1").Value = 1
sh2.Range("A2").Value = 2
sh3.Range("A3").Value = sh1.Range("A1") + sh2.Range("A2")
sh1.Activate
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
僕なりのこだわり。
シートとセルで変数を宣言しておく
入力をするシートやセルが決まっていても名前を変更したりすると、
その記載を全て変更するので、めんどくせぇ。
実にめんどくせぇ。
何度となく変更していけば、このめんどくせぇってのがわかります。
なので、もれなくシートは全て。変動しやすいセルについてはなるべく変数を宣言します。
今回の例題みたいに短く、少ないシートのときはいいですけどね。