なぜExcelでデータベースなのか
顧客管理、商品管理、注文管理を別々のExcelファイルで管理している会社は多いでしょう。しかし、これらのデータを手作業で結合するのは時間がかかります。
実際に、注文データから「どの顧客が何の商品をいくつ注文したか」を一覧にしたい場面があります。3つのファイルを開いて、IDを見比べながらコピー&ペーストしていませんか。
この作業をVBAで自動化すると、ボタン一つで完璧な結合データが作成できます。
データベースの基本的な考え方
リレーショナルデータベースとは、複数の表を関連づけて管理するシステムです。身近な例で説明しましょう。
図書館を想像してください。本の情報、利用者の情報、貸出記録を別々の台帳で管理しています。貸出記録には本のIDと利用者のIDだけを記録し、必要な時に詳細情報を他の台帳から探します。
これと同じ仕組みを、ExcelのVBAで実現できます。
今回作成するシステムの構成
作成するシステムは3つのマスタデータを結合します。
顧客マスタには顧客ID、顧客名、電話番号、住所を格納します。商品マスタには商品ID、商品名、価格、カテゴリを格納します。注文データには注文ID、注文日、顧客ID、商品ID、数量を格納します。
最終的に、注文データをベースとして、顧客名や商品名を含む詳細な一覧表を自動生成します。
ファイル選択機能の実装
まず、ユーザーが簡単にファイルを選択できる機能を作ります。
Function SelectFile(dialogTitle As String) As String
Dim fd As FileDialog
Dim selectedFile As String
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = dialogTitle
.Filters.Clear
.Filters.Add "Excelファイル", "*.xlsx;*.xls"
.AllowMultiSelect = False
End With
If fd.Show = -1 Then
selectedFile = fd.SelectedItems(1)
Else
selectedFile = ""
End If
SelectFile = selectedFile
End Function
Code language: JavaScript (javascript)
この関数は、Windowsの標準的なファイル選択画面を表示します。FileDialogオブジェクトを使用して、Excelファイルのみを表示するフィルタを設定しています。
With文を使うことで、同じオブジェクトに対する操作を簡潔に書けます。まるで「fdについて、以下の設定を行う」と宣言しているようなものです。
入力値の検証機能
シート番号の入力では、適切な値が入力されているかを確認します。
Function InputSheetNumber(dataType As String, defaultValue As Integer) As Integer
Dim userInput As String
Dim sheetNumber As Integer
userInput = InputBox(dataType & "のシート番号を入力してください", _
"シート番号入力", defaultValue)
If userInput = "" Then
InputSheetNumber = 0
Exit Function
End If
If IsNumeric(userInput) Then
sheetNumber = CInt(userInput)
If sheetNumber >= 1 Then
InputSheetNumber = sheetNumber
Else
InputSheetNumber = 0
End If
Else
InputSheetNumber = 0
End If
End Function
Code language: JavaScript (javascript)
IsNumeric関数で数値かどうかを判定し、CInt関数で整数に変換します。不正な値が入力された場合は0を返し、呼び出し元で処理を中断します。
データ結合処理の核心部分
最も重要な部分が、3つのファイルのデータを結合する処理です。
For i = 2 To lastRowOrder
orderID = wsOrder.Cells(i, 1).Value
customerID = wsOrder.Cells(i, 3).Value
productID = wsOrder.Cells(i, 4).Value
' 顧客情報を検索
For j = 2 To lastRowCustomer
If wsCustomer.Cells(j, 1).Value = customerID Then
customerName = wsCustomer.Cells(j, 2).Value
Exit For
End If
Next j
' 商品情報を検索
For k = 2 To lastRowProduct
If wsProduct.Cells(k, 1).Value = productID Then
productName = wsProduct.Cells(k, 2).Value
price = wsProduct.Cells(k, 3).Value
Exit For
End If
Next k
Next i
Code language: PHP (php)
この処理は、注文データの各行について、対応する顧客情報と商品情報を探し出します。
まず注文データから顧客IDと商品IDを取得します。次に、その顧客IDで顧客マスタを全件検索し、一致する行が見つかったら顧客名を取得してループを抜けます。商品情報も同様に検索します。
Exit For文により、該当データが見つかった時点で検索を停止します。これにより処理時間を短縮できます。
エラー処理と安全な実行
プログラムが途中で止まらないよう、エラー処理を組み込みます。
On Error GoTo ErrorHandler
' メイン処理
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Code language: PHP (php)
On Error GoTo文により、エラーが発生した場合の処理を指定します。ErrorHandlerラベルで、画面更新やアラート表示を元に戻し、エラー内容をユーザーに表示します。
ScreenUpdatingをFalseにすると画面更新が停止し、処理速度が向上します。しかし、エラーが発生した場合は必ずTrueに戻す必要があります。
オブジェクトとメモリ管理
外部ファイルを開いた後は、適切にファイルを閉じます。
Set wbCustomer = Workbooks.Open(customerFile)
Set wsCustomer = wbCustomer.Worksheets(customerSheet)
' 処理
wbCustomer.Close False
Setキーワードでオブジェクト変数にワークブックを割り当てます。処理終了後は、Close メソッドでファイルを閉じます。引数のFalseは「保存しないで閉じる」という意味です。
実用的な最適化テクニック
処理速度を向上させるため、いくつかの最適化を行います。
最終行の自動取得により、データ量に関係なく動作します。Cells(Rows.Count, 1).End(xlUp).Rowは、A列の最下行からデータがある最初のセルまで遡って行番号を取得します。
画面更新の停止により、大量データ処理時の画面のちらつきを防ぎます。Application.ScreenUpdating = Falseで更新を停止し、処理完了後にTrueで再開します。
AutoFitメソッドにより、列幅をデータに合わせて自動調整します。見やすい表が簡単に作成できます。
完成したシステムの使い方
完成したシステムは以下の手順で動作します。
CreateJoinedSheetを実行すると、まず顧客情報ファイルの選択画面が表示されます。次に商品情報ファイル、注文情報ファイルを順番に選択します。
各ファイルのシート番号を入力します。通常は1を入力すれば問題ありません。
すべての入力が完了すると、自動的にデータ結合処理が開始されます。新しいシートに結合結果が出力され、フィルタ機能も自動で設定されます。
VBAプログラミングの基本パターン
このシステムには、VBAプログラミングの基本的なパターンが含まれています。
変数宣言でデータを格納する箱を用意し、ユーザーインターフェースで入力を受け取ります。外部データの読み込み、ループ処理によるデータ加工、結果の出力という流れは、多くのVBAプログラムで共通しています。
関数の作成により、同じ処理を再利用できます。エラー処理により、予期しない状況でもプログラムが安全に動作します。
まとめ
ExcelのVBAを使って、3つの外部ファイルを自動結合するシステムを作成しました。ファイル選択ダイアログ、入力値検証、データ結合処理、エラー処理といった実用的な機能を組み合わせることで、手作業では時間のかかるデータ統合作業を自動化できます。このシステムは、顧客管理、商品管理、注文管理といったビジネスシーンで直接活用できる実践的なソリューションです。