Excel VBAの文法まとめ

仕事でVBAのプログラムを書く事があるのですが、その度にVBAの文法が頭から抜けてしまっていて、前に調べた内容を調べ直しながら作業する事が多いので、今回はよく使用する文法についてサンプルプログラムを作成してみました。

### 条件分岐と繰り返しのサンプル

どの言語でもとりあえず条件分岐と繰り返しは把握しておきたいですね。

```vbnet 
' 機能   : If文の書き方を確認する
'
' 引数　 : mathScore 数学の点数(条件1)
'        : physicsScore 物理の点数(条件2)
' 返り値 : なし
Function CheckIfDescription(ByVal mathScore As Long, ByVal physicsScore As Long)

    ' 否定の表現は<> または、 Not 条件式
    
    If mathScore = 100 And physicsScore = 100 Then
       MsgBox ("数学と物理の両方100点だったようです。")
    ElseIf 50 <= mathScore Or 50 <= physicsScore Then
       MsgBox ("少なくとも数学と物理のどちらかが50点以上だったようです。")
    ElseIf mathScore >= 0 And physicsScore >= 0 Then
       MsgBox ("数学と物理の両方0点以上です。")
    Else
       MsgBox ("マイナスの値が入力されました。")
    End If
    
End Function
```

```vbnet 
' 機能   : For文の書き方を確認する
'
' 引数　 : finishNumber 終了値
' 返り値 : 加算結果
Function CheckForDescription(ByVal finishNumber As Long) As Long

    Dim count As Long
    Dim result As Long: result = 0

    For count = 1 To 100
        result = result + 1
        
        If count = finishNumber Then
            
            ' 返り値を設定する
            CheckForDescription = result
            
            Exit For
        
        End If
        
    Next count
    
    CheckForDescription = result
    
End Function
```

```vbnet 
' 機能   : While文の書き方を確認する
'
' 引数　 : finishNumber 終了値
' 返り値 : 加算結果
Function CheckWhileDescription(ByVal finishNumber As Long) As Long

    Dim count As Long: count = 1
    Dim result As Long: result = 0

    Do While count <= finishNumber
    
        result = result + 1
        count = count + 1
    
    Loop
    
    CheckWhileDescription = result
    
End Function
```

```vbnet 
' 機能   : ForEach文の書き方を確認する
'
' 引数　 : なし
' 返り値 : なし
Function CheckForEachDescription()

    Dim collection As collection
    Set collection = New collection

    ' コレクションにデータを追加
    With collection
        .Add Item:="犬", Key:="dog"
        .Add Item:="猫", Key:="cat"
    End With

    For Each animal In collection
    
        MsgBox (animal)
    
    Next animal
    
End Function
```

### セルに値を入力する場合のサンプル

```vbnet 
' 引数に指定した値を指定したシート名のA1セルに入力する
'
' 引数　 : sheetName 対象のシート名
'        : value 設定する値
' 返り値 : なし
Function SetValue(ByVal sheetName As String, ByVal value As String)
    
    ' 行の指定
    Dim row As Long: row = 1
    ' 列の指定
    Dim col As Long: col = 1

    Worksheets(sheetName).Cells(row, col) = value
        
End Function
```

### 他のExcelファイルを開く(閉じる)場合のサンプル

```vbnet 
' 対象のExcelファイルを操作する
'
' 引数　 : excelFilePath 対象のExcelファイルのパス
' 返り値 : なし
Function OperateTargetExcelFile(ByVal excelFilePath As String)

    Workbooks.Open (excelFilePath)
    
    bookName = ActiveWorkbook.Name

    ' True  → ファイルを保存する
    ' False → ファイルを保存しない
    Workbooks(bookName).Close SaveChanges:=False
    
End Function
```

### 特定フォルダ配下のファイルに対して一律処理する場合のサンプル

```vbnet 
' 指定したフォルダ直下のファイル名を取得して表示する
'
' 引数　 : folderPath 対象フォルダのパス
' 返り値 : なし
Function GetFileNameRecursively(ByVal folderPath As String)

    Dim fileName As String
    Dim subFolder As Object
    
    fileName = Dir(folderPath & "\*.*")
    
    Do While fileName <> ""
        
        MsgBox (fileName)
        
        ' Dir関数は引数を省略した場合
        ' 直前の引数が指定されたものとして処理する
        fileName = Dir()
    
    Loop
    
    With CreateObject("Scripting.FileSystemObject")
    
        ' サブフォルダを取得し、その数だけ再帰的に処理を実行する
        For Each subFolder In .GetFolder(folderPath).SubFolders
            Call GetFileNameRecursively(subFolder.Path)
        Next subFolder
        
    End With
    
End Function
```

### 参考資料

■VBAの書き方についての入門資料が欲しい場合は・・
[Excelマクロ／VBAで始める業務自動化プログラミング入門](http://www.atmarkit.co.jp/ait/articles/1402/03/news143.html)

■VBAのコーディング規約が気になってきた場合は・・
[Excel VBAコーディング ガイドライン案](http://qiita.com/mima_ita/items/8b0eec3b5a81f168822d)