あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

ExcelVBA - ElseIfの書き方

ExcelVBA - ElseIfの書き方

VBAでは"ElseIf"。これが分かっていればいいのだが、他の言語と混ざっているとハマる。

    '動く
    If (aa = True) And (bb = False) Then
      objCB.Click
    ElseIf (aa = False) And (bb = True) Then
      objCB.Click
    End If
    
    If (aa = True) And (bb = False) Then
      Debug.Print "tf"
    Else If (aa = False) And (bb = True) Then
    '↑分離するとダメ。構文エラー.
      Debug.Print "ft"
    End If
    
    If (aa = True) And (bb = False) Then
      Debug.Print "tf"
    ElsIf (aa = False) And (bb = True)
    '↑構文エラーが出ないが、ElsIfが関数として認識され、関数無いエラー.
      Debug.Print "ft"
    End If

For文の回数

条件文が、”未満”ではなく”以下”で回ることに注意。Cのfor文

for (i=0;i

と同等でない。0からLengthで回す場合はTo指定に-1すること。

For i = 0 To objIE.document.getElementById("id1").Length - 1
  objIE.document.getElementById("id1")(i).Text
Next

チェックボックスの入力の仕方

通常のチェックボックスエレメントは

Dim flag As Boolean
flag = objIE.document.getElementById("ID").Checked

で取得、設定できる。
が、ごくまれに反映されないことがある。
その場合、Clickメソッドを使う。こっちのほうが万能感あり。
http://billboardtop100.net/2011/03/excel-vba-ie-internet-explorer-checkbox-radio-onclick.html
が非常に役に立った。

'Checkedの上書きで効果が無いチェックボックスに対してON/OFFする
Sub IEInputCheckBox(ByRef objCB As Variant, value As Boolean)
  If objCB.Type = "checkbox" Then
   If objCB.Checked = True Then
      If value = False Then
        objCB.Click
      End If
   Else
      If value = True Then
        objCB.Click
      End If
   End If
  End If
End Sub

プルダウン項目の取得

プルダウンメニュー(ドロップダウンボックス)の選択は、Valueで値を直接指定するか、SelectedIndexで番号を指定する。
文字列で指定したい場合は一つ一つチェックする。

'ドロップダウンボックスの値を取得して選ぶ.
Dim ret As String
Dim arr As Variant
Dim sss As String
sss = "HOGE" & "FUGA" ' 文字列の連結は &.
arr = objIE.document.getElementById("ID1")
For i = 0 To arr.Length - 1
  ret = InStr(arr(i).Text, sss)
  If ret <> 0 And IsNull(ret) = False Then
    arr.SelectedIndex = i
    Exit For
  End If
Next

デバッグ

Excelマクロエディタではブレイクポイントもウォッチもあるので、ローカル変数でDOMエレメントの中身をよくよく見るのが大事。
デバッグ出力はDebug.Printでエディタのイミディエイトウィンドウに表示されるが、Run時にリセットされないのでいちいち手で消す。なんだか間抜け。

配列はデバッガでItem 1, Item 2...で表示されるが、実体は配列のはず。For Each文でアクセスするのがスマート。
添え字で指定するときは、その親の名前に(n)で指定する、はず。

Dim arr As Variant
arr = objIE.document.getElementById("ID1")
For i = 0 To arr.Length - 1
  Debug.Print CStr(i) & " : " & arr(i).Text
Next