Excel VBAで業務効率爆上げ!登録・検索・更新・削除(CRUD)管理ツールを自作する方法

Excel・VBA

はじめに: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でさらなる業務効率化を実現してください。

コメント

タイトルとURLをコピーしました