仕事でVBAのプログラムを書く事があるのですが、その度にVBAの文法が頭から抜けてしまっていて、前に調べた内容を調べ直しながら作業する事が多いので、今回はよく使用する文法についてサンプルプログラムを作成してみました。
条件分岐と繰り返しのサンプル
どの言語でもとりあえず条件分岐と繰り返しは把握しておきたいですね。
' 機能 : 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
' 機能 : 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
' 機能 : 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
' 機能 : 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
セルに値を入力する場合のサンプル
' 引数に指定した値を指定したシート名の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ファイルを開く(閉じる)場合のサンプル
' 対象のExcelファイルを操作する
'
' 引数 : excelFilePath 対象のExcelファイルのパス
' 返り値 : なし
Function OperateTargetExcelFile(ByVal excelFilePath As String)
Workbooks.Open (excelFilePath)
bookName = ActiveWorkbook.Name
' True → ファイルを保存する
' False → ファイルを保存しない
Workbooks(bookName).Close SaveChanges:=False
End Function
特定フォルダ配下のファイルに対して一律処理する場合のサンプル
' 指定したフォルダ直下のファイル名を取得して表示する
'
' 引数 : 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で始める業務自動化プログラミング入門
■VBAのコーディング規約が気になってきた場合は・・
Excel VBAコーディング ガイドライン案