2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-11-10

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で除算した場合にエラーが発生します。

スクリーンショット 2024-11-10 215946.png

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?