はじめに:Excel VBAで業務を効率化しよう!
業務効率化に欠かせないExcel VBA。今回は、Excel VBAを使って、データ登録・検索・更新・削除(CRUD)ができる本格的な管理ツールを自作する方法を解説します。顧客リスト、商品在庫、タスク管理など、様々なシーンで応用できる汎用的なツールを一緒に作りましょう。プログラミング初心者の方でも、この記事を読めば「現場で今すぐ使える」ツールが作れるようになります。
CRUDとは?Excel VBAでの実装イメージ
CRUDとは、Create(作成)、Read(読み取り)、Update(更新)、Delete(削除)の頭文字を取ったもので、データベース操作の基本となる4つの機能です。Excel VBAでこれらの機能を実装することで、手作業で行っていたデータ管理を自動化し、ヒューマンエラーの削減と大幅な時間短縮が可能になります。
1. Excelシートを「簡易データベース」として準備する
Sheet1をデータベースとして利用します。以下のヘッダーを1行目に入力してください。
- A列:
ID - B列:
氏名 - C列:
部署 - D列:
電話番号 - E列:
メールアドレス
2. UserFormのデザインを作成する
1. VBAエディタ(Alt + F11)を開きます。
2. 「挿入」メニューから「UserForm」を選択します。
3. ツールボックスから以下のコントロールを配置し、プロパティを設定します。
- ラベル (Label): 各入力項目の見出し (
Captionプロパティを設定: ID, 氏名, 部署, 電話番号, メールアドレス) - テキストボックス (TextBox):
txtID(ID表示用、EnabledをFalseに設定して編集不可に)txt氏名txt部署txt電話番号txtメールアドレスtxt検索キーワード(検索用)
- コマンドボタン (CommandButton):
cmd登録(Caption: 登録)cmd更新(Caption: 更新)cmd削除(Caption: 削除)cmdクリア(Caption: クリア)cmd検索(Caption: 検索)
- リストボックス (ListBox):
lstデータ一覧(ColumnCountを5に、ColumnHeadsをTrueに設定)
3. UserFormの初期設定とデータ表示
UserFormがアクティブになったときに、既存のデータをリストボックスに表示する処理を記述します。
' UserFormモジュールに記述
Private Sub UserForm_Initialize()
Call LoadDataToListBox
End Sub
' データをリストボックスに読み込むプロシージャ
Private Sub LoadDataToListBox()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
' ヘッダー行を含めてリストボックスに表示
With lstデータ一覧
.Clear
.ColumnCount = 5 ' ID, 氏名, 部署, 電話番号, メールアドレス
.ColumnHeads = True ' ヘッダーを表示
.ColumnWidths = "30;80;80;80;120" ' 各列の幅を設定 (適宜調整)
' ヘッダー行を追加
.AddItem
.List(0, 0) = "ID"
.List(0, 1) = "氏名"
.List(0, 2) = "部署"
.List(0, 3) = "電話番号"
.List(0, 4) = "メールアドレス"
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then ' データが2行目以降にある場合
For i = 2 To lastRow
.AddItem ws.Cells(i, 1).Value ' ID
.List(.ListCount - 1, 1) = ws.Cells(i, 2).Value ' 氏名
.List(.ListCount - 1, 2) = ws.Cells(i, 3).Value ' 部署
.List(.ListCount - 1, 3) = ws.Cells(i, 4).Value ' 電話番号
.List(.ListCount - 1, 4) = ws.Cells(i, 5).Value ' メールアドレス
Next i
End If
End With
End Sub
' リストボックスの項目をクリックしたときに、テキストボックスにデータを表示
Private Sub lstデータ一覧_Click()
If lstデータ一覧.ListIndex = -1 Or lstデータ一覧.ListIndex = 0 Then Exit Sub ' ヘッダー行または選択なしの場合は何もしない
With lstデータ一覧
txtID.Value = .List(.ListIndex, 0)
txt氏名.Value = .List(.ListIndex, 1)
txt部署.Value = .List(.ListIndex, 2)
txt電話番号.Value = .List(.ListIndex, 3)
txtメールアドレス.Value = .List(.ListIndex, 4)
End With
End Sub
4. 登録(Create)機能の実装
新しいデータをExcelシートに追加します。
Private Sub cmd登録_Click()
Dim ws As Worksheet
Dim lastRow As Long
Dim newID As Long
' 入力チェック
If Not CheckInput Then Exit Sub
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
' 新しいIDを生成 (既存のIDの最大値+1)
If lastRow = 1 Then ' ヘッダーのみの場合
newID = 1
Else
newID = Application.WorksheetFunction.Max(ws.Range("A2:A" & lastRow)) + 1
End If
With ws
.Cells(lastRow + 1, 1).Value = newID ' ID
.Cells(lastRow + 1, 2).Value = txt氏名.Value
.Cells(lastRow + 1, 3).Value = txt部署.Value
.Cells(lastRow + 1, 4).Value = txt電話番号.Value
.Cells(lastRow + 1, 5).Value = txtメールアドレス.Value
End With
MsgBox "データを登録しました。", vbInformation
Call ClearForm
Call LoadDataToListBox ' リストボックスを更新
End Sub
5. 検索(Read)機能の実装
キーワードに基づいてデータを検索し、リストボックスに表示します。
Private Sub cmd検索_Click()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim searchKeyword As String
Set ws = ThisWorkbook.Sheets("Sheet1")
searchKeyword = LCase(txt検索キーワード.Value) ' 小文字に変換して検索
With lstデータ一覧
.Clear
' ヘッダー行を追加 (LoadDataToListBox と同じロジック)
.AddItem
.List(0, 0) = "ID"
.List(0, 1) = "氏名"
.List(0, 2) = "部署"
.List(0, 3) = "電話番号"
.List(0, 4) = "メールアドレス"
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
For i = 2 To lastRow
' 氏名、部署、メールアドレスのいずれかにキーワードが含まれるかチェック
If InStr(1, LCase(ws.Cells(i, 2).Value), searchKeyword) > 0 Or _
InStr(1, LCase(ws.Cells(i, 3).Value), searchKeyword) > 0 Or _
InStr(1, LCase(ws.Cells(i, 5).Value), searchKeyword) > 0 Then
.AddItem ws.Cells(i, 1).Value
.List(.ListCount - 1, 1) = ws.Cells(i, 2).Value
.List(.ListCount - 1, 2) = ws.Cells(i, 3).Value
.List(.ListCount - 1, 3) = ws.Cells(i, 4).Value
.List(.ListCount - 1, 4) = ws.Cells(i, 5).Value
End If
Next i
End If
End With
If txt検索キーワード.Value = "" Then
Call LoadDataToListBox ' 検索キーワードが空なら全件表示
End If
End Sub
6. 更新(Update)機能の実装
選択されたデータを変更し、Excelシートを更新します。
Private Sub cmd更新_Click()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetID As Long
' 入力チェック
If Not CheckInput Then Exit Sub
If txtID.Value = "" Then
MsgBox "更新対象を選択してください。", vbExclamation
Exit Sub
End If
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
targetID = CLng(txtID.Value)
For i = 2 To lastRow
If ws.Cells(i, 1).Value = targetID Then
ws.Cells(i, 2).Value = txt氏名.Value
ws.Cells(i, 3).Value = txt部署.Value
ws.Cells(i, 4).Value = txt電話番号.Value
ws.Cells(i, 5).Value = txtメールアドレス.Value
MsgBox "データを更新しました。", vbInformation
Call ClearForm
Call LoadDataToListBox ' リストボックスを更新
Exit Sub
End If
Next i
MsgBox "指定されたIDのデータが見つかりませんでした。", vbExclamation
End Sub
7. 削除(Delete)機能の実装
選択されたデータをExcelシートから削除します。
Private Sub cmd削除_Click()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetID As Long
If txtID.Value = "" Then
MsgBox "削除対象を選択してください。", vbExclamation
Exit Sub
End If
If MsgBox("このデータを削除しますか?", vbYesNo + vbQuestion, "確認") = vbNo Then
Exit Sub
End If
Set ws = ThisWorkbook.Sheets("Sheet1")
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
targetID = CLng(txtID.Value)
For i = 2 To lastRow
If ws.Cells(i, 1).Value = targetID Then
ws.Rows(i).Delete Shift:=xlUp ' 行を削除
MsgBox "データを削除しました。", vbInformation
Call ClearForm
Call LoadDataToListBox ' リストボックスを更新
Exit Sub
End If
Next i
MsgBox "指定されたIDのデータが見つかりませんでした。", vbExclamation
End Sub
8. フォームのリセットと入力チェック
入力フォームをクリアするボタンと、必須入力チェックの関数です。
Private Sub cmdクリア_Click()
Call ClearForm
End Sub
' フォームをクリアするプロシージャ
Private Sub ClearForm()
txtID.Value = ""
txt氏名.Value = ""
txt部署.Value = ""
txt電話番号.Value = ""
txtメールアドレス.Value = ""
txt検索キーワード.Value = ""
lstデータ一覧.ListIndex = -1 ' リストボックスの選択を解除
End Sub
' 入力チェック関数
Private Function CheckInput() As Boolean
If Trim(txt氏名.Value) = "" Then
MsgBox "氏名を入力してください。", vbExclamation
txt氏名.SetFocus
CheckInput = False
Exit Function
End If
If Trim(txt部署.Value) = "" Then
MsgBox "部署を入力してください。", vbExclamation
txt部署.SetFocus
CheckInput = False
Exit Function
End If
' 必要に応じて他の項目もチェック
CheckInput = True
End Function
まとめ:あなただけの管理ツールで業務を自動化!
これで、Excel VBAを使った本格的なCRUD管理ツールの完成です!今回作成したツールは、IDの自動採番、データの登録、検索、更新、削除といった基本的な機能を網羅しています。
この基盤を元に、入力規則の強化、エラーハンドリングの追加、より高度な検索機能、複数シートや外部データベースとの連携など、様々な機能拡張が可能です。ぜひ、あなたの業務に合わせてカスタマイズし、Excel VBAでさらなる業務効率化を実現してください。


コメント