久々に書いてみたら忘れていた Excel VBA のイディオム集
久々に書いたら思い出せなくなっていた Excel VBA のイディオムをまとめておく。
目次
配列の生成と push()
JavaScript でいうところの Array.prototype.push()
がやりたい。
' 配列は「変数名()」で宣言する
Dim myArr() As String
' Index 0 で初期化しておく
ReDim myArr(0)
Dim ws As Variant
For Each ws In Worksheets ' 何かループするモノ
' 最終要素に値を追加する
myArr(UBound(myArr)) = x.Name
' 配列の長さを拡張する
ReDim Preserve myArr(UBound(myArr) + 1)
Next x
' ループを1回以上通ると、ループ内で1つ余分に要素を作ってしまうので、最終要素を削除する
If UBound(myArr) > 0 Then
ReDim Preserve myArr(UBound(myArr) - 1)
End If
- 配列の宣言時に
ReDim myArr(0)
で初期化 myArr(UBound(myArr)) = value
でpush()
相当Redim Preserve myArr(UBound(myArr) + 1)
で配列の長さを拡張する- 最後に余った最終要素を
ReDim Preserve myArr(UBound(myArr) - 1)
で削る
という流れ。
配列の .length
を知る
JavaScript でいうところの Array.length
が知りたい。
' 配列を用意。この配列にデータが入っているとして…
Dim myArr() As String
' 要素数を求める
Dim length As Integer
length = UBound(myArr) - LBound(myArr) + 1
If length = 0 Then
MsgBox "配列の要素数が 0 個です"
End If
UBound()
と LBound()
の差に +1
して求める。要素数が0個の時、UBound()
は -1
を返すので。
ある文字列が、指定の文字列を含んでいるかどうか
SQL でいう LIKE
、JavaScript でいう String.prototype.includes()
相当。
' 検索対象の文字列を用意する
Dim myStr As String: myStr = "My Excel VBA String"
' 変数 myStr に、文字列 "Str" が含まれているか
If myStr Like "*Str*" Then
' 文字列 "Str" を含んでいる
End If
ループの書き方
Do While
とか For Each In
とか、VBA はループの書き方が多くていつも迷う。
Dir()
は呼ぶ度にファイル名を返し、なくなったら空文字を返すので Do While
で継続条件を示すのが良い。
Dim file As String: file = Dir(path) ' 変数 path で対象のディレクトリを指定する
Do While file <> ""
' 1つのファイル名が取得できたので、あとはよしなに…
MsgBox file
' ループの最後で、次のファイルを取得する
file = Dir()
Loop
シートを順に回す時なんかは For Each In
が楽。
' ループで使用する変数を用意しておく。対象のモノによっては型を Variant にしないとエラーが出るかも
Dim worksheet As Variant
' ワークシートを順に探索する
For Each worksheet In ActiveWorkbook.Worksheets
' あとはよしなに…
MsgBox worksheet.name
Next
JavaScript だと worksheets.forEach(worksheet => console.log(worksheet.name))
なノリで、worksheet
を仮引数で受け取れるのだが、VBA の場合は Dim
でイチイチ宣言しておいてあげないといけないのがダルいところ。
デバッグ出力したい
Debug.Print "文字列"
という風に書くと、「イミディエイトウィンドウ」に出力される。文字列か数値など、素のまま出力できるモノしか指定できないので、配列とかを雑に確認しようとして Debug.Print myArr
とかしたくても無理な点には注意。
以上。JavaScript ばっかり書いてて VBA 忘れてきていた…。