見出し画像

VBA開発する人でも意外と知らないこと

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で除算したときのエラー画面

そのため、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コードを書くことができるでしょう。


もしよろしければサポートをお願いします。今後の執筆のかてにします。