
「修繕履歴が増えてきて、過去の対応を探すのに時間がかかる…」設備管理(ビルメン)の現場ではよくある悩みです。紙やExcelのメモが散らばっていると、いざという時に「前回どう直したか」「どの業者に頼んだか」「費用はいくらだったか」がすぐ出てきません。
この記事では、Excel初心者でも作れる「修繕履歴台帳+検索画面+結果出力」を、VBA(マクロ)で実現する手順をまとめます。 ゴールはシンプルに、検索欄にキーボードで入力 → 検索ボタンを押す → 結果シートに一覧です。
実際に作って運用してみると、検索がスムーズになり、現場の“探す時間”がかなり減ります。まずは小さく作って、必要に応じて育てていきましょう。
目次
結論:Excelマクロで修繕履歴検索は可能(初心者でもOK)
結論から言うと、ExcelのVBA(マクロ)で修繕履歴を検索して一覧表示する仕組みは作れます。
特に現場で便利なのは次の検索です。
- 発生日で期間検索(いつ頃の不具合だったか)
- 設備名・場所で検索(どの設備の履歴か)
- キーワード検索(漏水/異音/停止など、文言から探す)
- 状態で抽出(未対応だけ、完了だけ など)
修繕履歴を「検索できる形」で残しておくと、問い合わせ対応の速度、再発時の判断、引継ぎがかなり楽になります。
そして、作り方のコツは難しいVBAよりも先に、台帳(データ)の形を整えることです。
今回、作成するのはこのような形式となっております。
①修繕履歴を普段からこのように入力したとします。

②「検索」シートに移動して、キーワードを好きなところに入力して「検索」ボタンをクリックすると検索結果が出てきます。

③「結果」シートをクリックして、見るとこのように出てきます。

最初に作るべき「修繕履歴台帳」の型(1行=1件)
最短で成功するための大原則は、1行=1件です。
「一つの修繕を複数行に分ける」「セル結合が多い」「見出しが途中に何度も出てくる」などの形だと、検索は一気に難しくなります。
今回の台帳は、次の列(見出し)を用意しました。現場でよく使う項目に絞っています。
- 管理番号
- 発生日
- 設備名
- 場所
- 不具合内容
- 対応内容
- 業者名
- 費用
- 状態(未対応/対応中/完了)
- 完了日
- 備考
ポイントは、表記ゆれを減らすことです。例えば「状態」が「完了」「完了済」「済」などバラバラだと検索漏れが出ます。
最初から「未対応/対応中/完了」の3つに固定しておくと、後々かなり効きます。

検索シート/結果シートの作り方(入力→ボタン→出力)
台帳(修繕履歴)だけだと、毎回フィルターを触ったり、探したりで手間がかかります。
そこで、次の3シート構成にします。
- 修繕履歴:データ入力用(台帳)
- 検索:条件入力+検索ボタン
- 結果:抽出結果の一覧表示
![]()
検索シートの入力欄は、次のような形にしておくと分かりやすいです(空欄は「条件なし」扱い)。
- 開始日(発生日)
- 終了日(発生日)
- 設備名
- 場所
- キーワード(不具合/対応/備考)
- 状態(未対応/対応中/完了)
この構成にすると、運用がとても単純になります。
「検索欄に入力→検索ボタン」で毎回結果が更新されるので、誰でも同じ手順で使えます。

VBAコード(コピペで動く修繕履歴検索)
ここからがVBA(マクロ)です。やることは次の3つだけ。
- 検索シートの条件(B2~B7)を読む
- 修繕履歴を上からチェックして、条件に合う行だけ拾う
- 結果シートに一覧で貼り付ける
前提:シート名は必ず次の3つに揃えてください(完全一致)。
- 修繕履歴
- 検索
- 結果
VBEの開き方:Excelで Alt + F11 → 挿入 → 標準モジュール → 下のコードを貼り付けます。
Option Explicit
Public Sub 修繕履歴_検索()
Dim wsD As Worksheet, wsQ As Worksheet, wsR As Worksheet
Set wsD = ThisWorkbook.Worksheets("修繕履歴")
Set wsQ = ThisWorkbook.Worksheets("検索")
Set wsR = ThisWorkbook.Worksheets("結果")
Dim lastRow As Long, lastCol As Long
'発生日(B列=2)を基準に最終行を取得
lastRow = wsD.Cells(wsD.Rows.Count, 2).End(xlUp).Row
lastCol = wsD.Cells(1, wsD.Columns.Count).End(xlToLeft).Column
If lastRow < 2 Then
MsgBox "修繕履歴にデータがありません。", vbExclamation
Exit Sub
End If
'--- 検索条件(空欄は条件なし)
Dim dFrom As Variant, dTo As Variant
dFrom = wsQ.Range("B2").Value
dTo = wsQ.Range("B3").Value
Dim equip As String, place As String, kw As String, st As String
equip = Trim(CStr(wsQ.Range("B4").Value))
place = Trim(CStr(wsQ.Range("B5").Value))
kw = Trim(CStr(wsQ.Range("B6").Value))
st = Trim(CStr(wsQ.Range("B7").Value))
'--- 結果シート初期化+見出しコピー
wsR.Cells.Clear
wsD.Range(wsD.Cells(1, 1), wsD.Cells(1, lastCol)).Copy _
Destination:=wsR.Cells(1, 1)
Dim outRow As Long
outRow = 2
Dim r As Long
For r = 2 To lastRow
Dim ok As Boolean
ok = True
' 発生日(B列=2列目)で期間判定
Dim dOccur As Variant
dOccur = wsD.Cells(r, 2).Value
If Not IsEmpty(dFrom) Then
If Not IsDate(dOccur) Or CDate(dOccur) < CDate(dFrom) Then
ok = False
End If
End If
If ok And Not IsEmpty(dTo) Then
If Not IsDate(dOccur) Or CDate(dOccur) > CDate(dTo) Then
ok = False
End If
End If
' 設備名(C列=3列目)部分一致
If ok And equip <> "" Then
If InStr(1, CStr(wsD.Cells(r, 3).Value), equip, vbTextCompare) = 0 Then
ok = False
End If
End If
' 場所(D列=4列目)部分一致
If ok And place <> "" Then
If InStr(1, CStr(wsD.Cells(r, 4).Value), place, vbTextCompare) = 0 Then
ok = False
End If
End If
' 状態(I列=9列目)完全一致
If ok And st <> "" Then
If CStr(wsD.Cells(r, 9).Value) <> st Then
ok = False
End If
End If
' キーワード:不具合内容(E=5)・対応内容(F=6)・備考(K=11)
If ok And kw <> "" Then
Dim hit As Boolean
hit = False
If InStr(1, CStr(wsD.Cells(r, 5).Value), kw, vbTextCompare) > 0 Then hit = True
If InStr(1, CStr(wsD.Cells(r, 6).Value), kw, vbTextCompare) > 0 Then hit = True
If InStr(1, CStr(wsD.Cells(r, 11).Value), kw, vbTextCompare) > 0 Then hit = True
If Not hit Then ok = False
End If
' 条件に合う行を結果へコピー
If ok Then
wsD.Range(wsD.Cells(r, 1), wsD.Cells(r, lastCol)).Copy _
Destination:=wsR.Cells(outRow, 1)
outRow = outRow + 1
End If
Next r
wsR.Columns.AutoFit
MsgBox "検索完了:" & (outRow - 2) & "件", vbInformation
End Sub

検索ボタン(図形)を作って右クリックし、「マクロの登録」で 修繕履歴_検索 を割り当てれば完成です。
手順①「開発」をクリックする。

手順②「挿入」→「ボタン」をクリックする。

③ボタンを設置したい箇所にクリック→「修繕履歴_検索」をダブルクリック→「OK」をクリック

④ボタンの名前を変更する場合は、一旦右クリックしてから、ボタンを押せば、中身の文字を変更することができます。「ボタン」→「検索」

⑤キーワードを入力してボタンをクリックすれば、検索結果が出てきます

よくあるエラーと解決策(実行時エラー9/シート名問題)
実行時エラー '9':インデックスが有効範囲にありません
ほとんどの場合、VBAが探している「シート名」が一致していません。
たとえば、データが入っているのが「Sheet1」のままだと、VBAが「修繕履歴」を見に行って空っぽ→エラーや「データがありません」になります。
対策:シート名を次の3つに完全一致させます(全角/半角、スペースも一致が必要)。
- 修繕履歴
- 検索
- 結果
「履歴」は予約語でシート名に使えない
Excelでは「履歴」という名前が予約語扱いになり、シート名に設定できないことがあります。
この場合は、修繕履歴など別名にして、VBAの Worksheets("修繕履歴") と一致させてください。

Excelの警告:『履歴』は予約語のためシート名に使用できません
日付以外でも検索できる?(設備名・場所・キーワード・状態)
日付(開始日・終了日)を入れなくても、検索できます。理由はシンプルで、空欄は「条件なし」として扱う作りだからです。
- 設備名だけ入力:設備名(列C)に入力文字が含まれる行を抽出(部分一致)
- 場所だけ入力:場所(列D)に入力文字が含まれる行を抽出(部分一致)
- キーワードだけ入力:不具合内容(E)/対応内容(F)/備考(K)のどれかに含まれる行を抽出
- 状態だけ入力:状態(I)が一致する行を抽出(完全一致)
状態は完全一致なので、運用上は「未対応/対応中/完了」で表記を固定するのがコツです。
もし「完了」と入力して出ない時は、セルに余計なスペースが入っていないかも確認すると早いです。
キーボード入力→検索ボタンで運用するコツ
現場運用としては、次の流れにすると迷いません。
- 「検索」シートを開く
- 条件をキーボードで入力(必要な項目だけ)
- 検索ボタンを押す
- 「結果」シートで一覧を確認
件数が増えてきたら、さらに便利にする改善もできます。
- 設備名・場所・状態をプルダウン化して表記ゆれを減らす
- 結果シートに「件数」「費用合計」を表示する
- 月別の件数・費用を集計して報告書に使う
ただ、最初から全部盛りにすると挫折しやすいので、まずは今回の形で「検索ができる」状態にするのが正解です。
ビルメン業務への横展開(点検・不具合受付・期限管理)
この仕組みは修繕履歴だけでなく、ビルメン業務の台帳にも横展開できます。
基本は同じで、1行=1件の台帳にして、検索条件(列)を差し替えるだけです。
- 点検記録:点検日/設備/場所/点検者/結果(OK/NG)/指摘/是正期限/完了日
- 不具合・故障受付:受付日/設備/場所/内容/緊急度/対応者/状態/完了日
- 法定点検・期限管理:設備/点検種別/周期/前回日/次回期限/業者/実施日
「探せる台帳」ができると、問い合わせ対応や引継ぎが楽になり、結果的に現場全体の質が上がります。
必要になったタイミングで、少しずつ機能を足していくのがおすすめです。
まとめ:まずは“使える台帳”を作って育てる
修繕履歴の検索をExcelマクロで作るときの要点は次の3つです。
- 台帳は1行=1件で作る
- 「検索」シートと「結果」シートを分けて運用を簡単にする
- つまずいたらシート名の不一致を最優先で疑う
最初の一歩としては十分実用的です。
あとは現場の使い方に合わせて、「費用合計」「月別集計」「印刷用の整形」などを追加すれば、さらに強い台帳になります。
ここまで読んでいただき、ありがとうございました。