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文抜けた後も変数生きてますけども。
ただ、個人的にはこの書き方のほうが最初にどこで出てきたのかがわかりやすいので、これに気付いてからはこう書いてます。