Help us understand the problem. What is going on with this article?

【VBA】変数の宣言と代入を1行で行う

VBAでは変数の宣言時に代入できない?

――長いこと、そう思っていました。
For文のカウンタもブロックスコープがないから事前に宣言しなきゃいけないのに、行数増えて嫌だなって。
オブジェクトの変数ならアーリーバインドでDim fso as New FileSystemObjectみたいに記述できるけど、
Object型を指定してCreateObject(ProgID)するレイトバインディングじゃどうしても複数行に跨るよなって。
まあNewしてもコンストラクタに引数渡せないから、外から渡す値が必要な初期化処理は別の行になるんですけど。

元々Java屋なので、宣言と初期化が別の行なのは、すごく違和感があったんですよ。
それを見た目だけでも改善する記述法に今更出会えたので、同じことで不満を感じてる人に届けばいいなって。

' 通常の書き方
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim str As String
str = "ABC"

' 1行での書き方
Dim fso As FileSystemObject: Set fso = New FileSystemObject
Dim str As String: str = "ABC"

' ループカウンタの宣言も1行でできちゃう!
Dim i As Integer: For i = 0 To Ubound(Split("A/B/C", "/"))
Next

' For Eachでも大丈夫
Dim str As Variant: For Each str In Split("A/B/C", "/")
Next

_は行を分割する記号で、:は行を結合する記号です。1

まあオブジェクトの場合、コンストラクタに引数渡せないから、外から渡す値が必要な初期化処理は別の行になるんですけど。
あとFor文に関しては、ブロックスコープが利いてるわけじゃないので、1行で書いてもFor文抜けた後も変数生きてますけども。
ただ、個人的にはこの書き方のほうが最初にどこで出てきたのかがわかりやすくてありがたいんで、これ知ってからはこう書いてます。

11295
底辺Java系ポエマー。レガシーコードばっか触っていたが、最近やっとJava8っぽいコードに慣れてきた。いい加減Git使えるようになりたいが大体SVNの案件しか来ない。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away