【VB、VBA】Withステートメントの注意点【使わない方が良い?】

VB系の言語にはWithステートメントというものがあります。オブジェクト名を省略して記述できる構文で、コードを洗練させたりできます。

しかし、過度の使用や誤ったアプローチは可読性を損ない、保守性を低下させる可能性があります。

この記事では、Withステートメントの注意点、過度な使用は避けるべき理由などについて説明します。

Withステートメントとは

Withステートメントを使用することで、特定のオブジェクトの名前を複数回指定することなく、プロパティやメソッドを呼び出すことができます。

下記のコードはWithステートメントを使用した例です。Withで指定したオブジェクトはEnd Withまでの間、名前を省略してピリオド(.)から始まる式で記述ができます。

With MyButton
    .Caption = "sample"
    .Left = 100
    .Visible = True
End With

Withを使用するメリット

Withステートメントを使用することによるメリットを以下に挙げます。

  1. オブジェクト名の省略による冗長さの軽減
  2. 実行速度の向上(一部のケースで)

Withを使用するデメリット

Withステートメントを使用することによるデメリットを以下に挙げます。

  1. コードの可読性の低下

Withの過度な使用を避けるべき理由

Withステートメントを適切に使用すればすっきりとした見やすいコードを書けるのですが、無暗に使用するとデメリットが大きくなってしまいます。

可読性が著しく下がる

Withの範囲が広いと、途中でWithが何を指しているのか忘れてしまうことがあります。頭のワーキングメモリーが低い私のような人間にとっては、コードを読む間ずっとWithの指すオブジェクトを覚えておくのは厳しいことです。

Withステートメントは入れ子にすることもできるのですが、そういった使い方は最悪です。Withの指しているオブジェクトが一層分かりづらくなり混乱を招くだけとなります。

そもそも、Withステートメントを使用することでネストが1段深くなるということが微妙だと思います。

オブジェクト名の省略で冗長さを無くす意味はあまりない

メリットで挙げた「オブジェクト名を省略できるので冗長さが無くなる」件については、書き方によってはプログラマの自己満足になるだけです。

Withステートメントの中で複数のオブジェクトを操作する場合、オブジェクト名を省略するものとしないものが出てきて、記述に一貫性が無くなります。このような場合は、読み手にとってはオブジェクト名の省略はしない方が親切になると思います。

Withでコード量を減らしてすっきりさせても、読みにくければ意味がありません。

' ↓Withの中で複数のオブジェクトを操作しているため、一貫性がなく読みづらい。
With MyButton
    .Caption = "sample"
    .Left = 100
    .Visible = True
    MyLabel.Caption = "Label"
    MyText.Text = "hoge"
End With

別の書き方でもできる

VB6やVBAでは、Withを使用することでパフォーマンスを上げることができるという話があるのですが、別にWithを使用しなくても一時変数に代入することで同じことを実現できます。

' Withを使用した書き方
Dim i As Long
With ThisWorkbook.Sheets(1)
    For i = 1 To 10000
        .Cells(1, 1).Value = i
    Next
End With

上のコードは下のコードのように書き換えることができます。

' Withを使用せず、変数にオブジェクトを代入して使用する書き方
Dim i As Long
Dim mySheet As Worksheet
Set mySheet = ThisWorkbook.Sheets(1)
    
For i = 1 To 10000
    mySheet.Cells(1, 1).Value = i
Next

両方のコードのパフォーマンスは同等です。

Withを使用しない書き方の方がオブジェクト名を省略しないので、変数名を適切に設定すれば可読性は高くなります。

一時変数が増えるというデメリットもありますが、ネストが深くならないのは大きなメリットになると思います。

Withを使っても良いと思うパターン

Withステートメントの中で、指定したオブジェクトしか操作しないのであれば使っても良いと思います。その場合は、冗長さを無くした読みやすいコードになると思います。

使いどころとしては、オブジェクトの初期化を行うような部分でしょうか。

' Withで指定したオブジェクトしか操作しないときは積極的に使用して良いと思います。
With MyButton
    .Caption = "sample"
    .Left = 100
    .Visible = True
End With

最後に

Withステートメントは、VB系のプログラミング言語で非常に便利な機能ですが、その適切な使用方法を理解することが重要です。

過度なWithステートメントの使用は可読性を損なう可能性があることを忘れずに、コードの保守性を向上させるために慎重に検討しましょう。

タイトルとURLをコピーしました