VBAの開発をされる方も、最近は書籍を読み込むのではなく、特定の業務に必要な知識だけをネットや生成AIから得て学ぶ方が増えているようです。しかし、そうした学習方法だけでは、VBAの基礎的なルールや知識が抜け落ちることがあります。
そこで、今回は「基礎的でありながらも見落としがちなVBAのポイント」を独断と偏見でご紹介します。もしかしたら、あなたの知らないことも含まれているかもしれません。
1.一行で複数の宣言を行う場合、それぞれに型を明示する必要がある
VBAでは、データ型を宣言しない場合はVariant型になるため、基本的にはデータ型を宣言すべきです。しかし、時々次のように書かれているコードを目にします。
Dim i, j As Long
この例では、変数iもjもLong型で宣言したつもりかもしれませんが、実際にはiはVariant型、jのみLong型として宣言されています。一行で複数の変数を宣言する場合は、必ず各変数ごとに型を明示しましょう。
Dim i As Long, j As Long
2.オブジェクト変数がNothingであることを確認する場合に使用する演算子
オブジェクト変数を開放するときに「Set rng = Nothing」のように書きますが、条件分岐でオブジェクト変数がNothingかどうかことを確認する際には、「=」ではなく「Is」を使用します。
If rng = Nothing Then
オブジェクト変数の比較には「Is」を使うのが正しい方法です。(というか、誤ってる方法だとエラーになります。)
If rng Is Nothing Then
3.文字列を結合する演算子 & は、前後にスペースを入れ忘れると行末でエンターキーを押したときにエラーとなる場合がある
文字列を結合する際に「&」演算子を用いますが、この際に演算子の前後にスペースを入れないと、行末でEnterキーを押したときにエラーとなる場合があります。例えば、次のようなコードがあったとします。
Dim headerRow As Long
Range ("A" &headerRow) 'エラーになる
このコードはエラーになりますが、次のように演算子の前後にきちんとスペースを入れれば、行末で改行してもエラーが出ません。
Dim headerRow As Long
Range ("A" & headerRow) 'エラーにならない
前後にスペースを入れ忘れるとエラーになる(=自動で前後にスペースを挿入してくれない)のは、1)「&」が型宣言文字であることと、2)VBAでは16進数リテラルは以下のように「&H」をプレフィックスに使用して指定することが原因です。
「&」を多用しているコード行がコンパイルエラーになり、なぜエラーになっているかわからない場合には、「&」の前後にスペースが入っているか確認しましょう。
詳細な解説は、「エクセルの神髄」様の下記の記事をご参照ください。
参考【エクセルの神髄】様 文字列結合&でコンパイルエラーになる理由
4.And演算子で短絡評価(ショートサーキット評価)を行わない
VBAでは0で除算した場合にエラーが発生します。
そのため、0除算をし得る場合にはエラー回避をする必要があります。
しかし、下記のようなコードでは、エラーが発生します。
Dim x As Long
x = 0
If x <> 0 And (10 / x > 2) Then
Debug.Print "条件を満たす"
End If
エラーが発生する理由は、VBAの And 演算子は短絡評価(ショートサーキット評価)を行わないため、条件式の両方の部分が評価されるためです。
短絡評価【ショートサーキット評価】とは、論理演算子の評価の仕方の一つで、左辺の評価で値が確定したら右辺の評価を省略する方式。
そのため、0除算を回避するためには、下記のように記載します。
Dim x As Long
x = 0
If x <> 0 Then
If (10 / x > 2) Then
Debug.Print "条件を満たす"
End If
End If
参考【エクセルの神髄】様 Select Caseでの短絡評価(ショートサーキット)の使い方
短絡評価がないVBAでは、特にAndやOrを含む複雑な条件式を扱う際に、エラー回避のため評価の順序に注意を払いましょう。
以上、いかがでしたでしょうか?
これらの細かいポイントを意識することで、より安定したVBAコードを書くことができるでしょう。