Purpose
VBAでよく使うコードパーツを目的別に整理し、使用経験と不具合事例を記録してナレッジを蓄積する
Background
VBA開発では「フォルダー選択」「ログ出力」「データ変換」など、繰り返し使うコードパーツがある。それぞれのパーツについて、いつ・どこで使ったか、どんな不具合に遭遇したかを記録することで、チーム全体の開発効率と品質が向上する。
パーツ分類と使用履歴
ログ出力関係
テキストファイルへのログ書き込み
概要: 処理の開始・終了時刻、エラー内容、処理件数などをテキストファイルに記録する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub WriteLog(logMessage As String)
Dim logPath As String
Dim fileNum As Integer
logPath = ThisWorkbook.Path & "\log.txt"
fileNum = FreeFile
Open logPath For Append As #fileNum
Print #fileNum, Now & " - " & logMessage
Close #fileNum
End Sub
▶#### Sources
- Microsoft公式: ファイル入出力ステートメント
Excelシートへのログ記録
概要: 専用のログシートに実行履歴を1行ずつ追記する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub WriteLogToSheet(logMessage As String)
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("ログ")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(lastRow, 1).Value = Now
ws.Cells(lastRow, 2).Value = logMessage
End Sub
Debug.Printによるイミディエイト出力
概要: デバッグ用に変数の値や処理の進行状況をイミディエイトウィンドウに出力する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
変換関係
文字列から日付への変換
概要: ユーザー入力やCSVから読み込んだ文字列を日付型に変換する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function ConvertToDate(dateStr As String) As Date
On Error Resume Next
ConvertToDate = CDate(dateStr)
If Err.Number <> 0 Then
ConvertToDate = DateSerial(1900, 1, 1) '既定値
Err.Clear
End If
On Error GoTo 0
End Function
▶#### Sources
- Microsoft公式: CDate関数
全角・半角変換
概要: 全角文字を半角に、または半角を全角に変換する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function ToHalfWidth(str As String) As String
ToHalfWidth = StrConv(str, vbNarrow)
End Function
Function ToFullWidth(str As String) As String
ToFullWidth = StrConv(str, vbWide)
End Function
▶#### Sources
- Microsoft公式: StrConv関数
CSV・TSV読み込みとパース
概要: カンマ区切りやタブ区切りのテキストファイルを読み込み、配列に格納する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function ReadCSV(filePath As String) As Variant
Dim lines As Variant
Dim fileNum As Integer
Dim content As String
fileNum = FreeFile
Open filePath For Input As #fileNum
content = Input$(LOF(fileNum), fileNum)
Close #fileNum
lines = Split(content, vbCrLf)
ReadCSV = lines
End Function
JSON・XMLパース
概要: API応答やファイルから取得したJSON/XMLをパースしてデータを取り出す
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### Sources
- VBA-JSONライブラリ(GitHub)
- MSXML2ライブラリリファレンス
ブック・ファイル操作関係
ブックの新規作成
概要: 新しいExcelブックを作成する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub CreateNewWorkbook()
Dim wb As Workbook
Set wb = Workbooks.Add
wb.SaveAs ThisWorkbook.Path & "\新規ブック.xlsx"
End Sub
ブックの複製(コピー)
概要: 既存のブックをテンプレートとして複製し、新しいファイル名で保存する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub CopyWorkbook(sourcePath As String, destPath As String)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile sourcePath, destPath
Set fso = Nothing
End Sub
ブックを開く・閉じる
概要: 既存のブックを開いて操作し、保存して閉じる
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub OpenAndCloseWorkbook(filePath As String)
Dim wb As Workbook
Set wb = [Workbooks.Open](http://Workbooks.Open)(filePath)
'処理を記述
wb.Close SaveChanges:=True
End Sub
ブックの保存(名前を付けて保存)
概要: ブックを指定したパスとファイル名で保存する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub SaveWorkbookAs(wb As Workbook, savePath As String)
wb.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
End Sub
フォルダー選択ダイアログ
概要: ユーザーにフォルダーを選択させて、そのパスを取得する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function SelectFolder() As String
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
If [fd.Show](http://fd.Show) = -1 Then
SelectFolder = fd.SelectedItems(1)
Else
SelectFolder = ""
End If
End Function
▶#### Sources
- Microsoft公式: FileDialogオブジェクト
ファイル選択ダイアログ
概要: ユーザーにファイルを選択させて、そのパスを取得する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function SelectFile() As String
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
fd.Filters.Add "Excelファイル", "*.xlsx;*.xls"
If [fd.Show](http://fd.Show) = -1 Then
SelectFile = fd.SelectedItems(1)
Else
SelectFile = ""
End If
End Function
ファイル・フォルダの存在確認
概要: 指定したパスにファイルやフォルダーが存在するか確認する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function FileExists(filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
FileExists = fso.FileExists(filePath)
Set fso = Nothing
End Function
Function FolderExists(folderPath As String) As Boolean
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
FolderExists = fso.FolderExists(folderPath)
Set fso = Nothing
End Function
▶#### Sources
- Microsoft公式: FileSystemObjectリファレンス
シート操作関係
シートの追加
概要: 新しいワークシートをブックに追加する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub AddNewSheet(sheetName As String)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
[ws.Name](http://ws.Name) = sheetName
End Sub
シートの削除
概要: 指定したシートを削除する(警告メッセージ抑制含む)
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub DeleteSheet(sheetName As String)
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets(sheetName).Delete
Application.DisplayAlerts = True
On Error GoTo 0
End Sub
シートのコピー
概要: 既存のシートを複製する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub CopySheet(sourceSheet As String, newSheetName As String)
ThisWorkbook.Worksheets(sourceSheet).Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
[ActiveSheet.Name](http://ActiveSheet.Name) = newSheetName
End Sub
連続でシートをチェックする(全シートループ)
概要: ブック内の全シートを順番に処理する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub CheckAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Debug.Print "処理中: " & [ws.Name](http://ws.Name)
'各シートに対する処理を記述
Next ws
End Sub
シート名の一覧取得
概要: ブック内の全シート名を配列で取得する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function GetSheetNames() As String()
Dim ws As Worksheet
Dim names() As String
Dim i As Long
ReDim names(1 To ThisWorkbook.Worksheets.Count)
For Each ws In ThisWorkbook.Worksheets
i = i + 1
names(i) = [ws.Name](http://ws.Name)
Next ws
GetSheetNames = names
End Function
データ検索・抽出関係
セル検索(Find)
概要: 指定した値をシート内から検索する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function FindCell(ws As Worksheet, searchValue As Variant) As Range
Set FindCell = ws.Cells.Find(What:=searchValue, LookIn:=xlValues, LookAt:=xlWhole)
End Function
▶#### Sources
- Microsoft公式: Range.Findメソッド
フィルター処理(AutoFilter)
概要: シートにオートフィルターを適用してデータを絞り込む
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub ApplyFilter(ws As Worksheet, column As Long, criteria As String)
ws.AutoFilterMode = False
ws.Range("A1").AutoFilter Field:=column, Criteria1:=criteria
End Sub
条件に合う行を抽出
概要: 特定の条件に合致する行を別シートにコピーする
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
外部連携関係
データベース接続(ADO)
概要: ADOを使ってSQL ServerやAccessなどのデータベースに接続する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub ConnectToDB()
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;User ID=UserName;Password=Pass;"
[conn.Open](http://conn.Open)
'処理を記述
conn.Close
Set conn = Nothing
End Sub
▶#### Sources
- Microsoft公式: ADODB.Connectionオブジェクト
Web API呼び出し(HTTP通信)
概要: REST APIにリクエストを送信し、レスポンスを受け取る
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Function CallAPI(url As String) As String
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
[http.Open](http://http.Open) "GET", url, False
http.send
CallAPI = http.responseText
Set http = Nothing
End Function
▶#### Sources
- MSXML2.XMLHTTP リファレンス
メール送信(Outlook連携)
概要: Outlookを使ってメールを自動送信する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub SendEmail(toAddress As String, subject As String, body As String)
Dim outlookApp As Object
Dim mail As Object
Set outlookApp = CreateObject("Outlook.Application")
Set mail = outlookApp.CreateItem(0)
[mail.To](http://mail.To) = toAddress
mail.subject = subject
mail.body = body
mail.Send
Set mail = Nothing
Set outlookApp = Nothing
End Sub
▶#### Sources
- Microsoft公式: Outlook.MailItemオブジェクト
エラー処理・例外ハンドリング関係
On Error GoTo ラベル
概要: エラーが発生したときに特定のラベルにジャンプして処理する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub SampleErrorHandling()
On Error GoTo ErrorHandler
'処理を記述
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
▶#### Sources
- Microsoft公式: On Errorステートメント
On Error Resume Next
概要: エラーが発生しても次の行に進む(エラーを無視)
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub IgnoreError()
On Error Resume Next
'処理(エラーが出ても続行)
If Err.Number <> 0 Then
Debug.Print "エラー発生: " & Err.Description
Err.Clear
End If
On Error GoTo 0
End Sub
エラー情報の取得(Err.Number, Err.Description)
概要: 発生したエラーの番号と説明を取得する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
UI・ユーザー入力関係
InputBoxでの値入力
概要: ユーザーに値を入力させるダイアログを表示する
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub GetUserInput()
Dim userInput As String
userInput = InputBox("値を入力してください", "入力")
If userInput <> "" Then
MsgBox "入力値: " & userInput
End If
End Sub
MsgBoxでの確認ダイアログ
概要: ユーザーにメッセージを表示し、ボタン選択を受け取る
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub ConfirmAction()
Dim result As VbMsgBoxResult
result = MsgBox("実行してよろしいですか?", vbYesNo + vbQuestion, "確認")
If result = vbYes Then
'処理を実行
End If
End Sub
UserFormの作成と表示
概要: カスタムフォームを作成してユーザー入力を受け付ける
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### Sources
- Microsoft公式: UserFormオブジェクト
パフォーマンス最適化関係
画面更新の停止(ScreenUpdating)
概要: 処理中の画面のちらつきを防ぎ、実行速度を向上させる
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub OptimizePerformance()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
'処理を記述
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
▶#### Sources
- VBA高速化テクニック集
配列への一括読み込み・書き込み
概要: セル範囲を配列に読み込み、処理後に一括で書き戻す
▶#### 使用履歴
- 使用日時:
- 使用場所(システム/ツール名):
- 使用目的:
▶#### 不具合事例
- 事例1:
- 症状:
- 原因:
- 対処方法:
▶#### コードサンプル
Sub ArrayProcessing()
Dim dataArray As Variant
Dim i As Long
'配列に読み込み
dataArray = Range("A1:A1000").Value
'配列内で処理
For i = 1 To UBound(dataArray, 1)
dataArray(i, 1) = dataArray(i, 1) * 2
Next i
'配列を一括書き込み
Range("B1:B1000").Value = dataArray
End Sub