工事写真台帳をExcelで作るときに整理しておきたいこと

Excel VBA

工事写真台帳や施工写真台帳をExcelで作るとき、写真を貼る作業そのものよりも難しいのは、写真と説明文の対応を崩さないことです。

現場写真は、似たような構図の写真が続くことがあります。ファイル名だけを見て管理していると、どの写真がどの工種、測点、撮影日、コメントに対応しているのか分からなくなることがあります。

建設会社、現場事務、施工管理、建設コンサル、点検業務など、立場は違っても、写真台帳で困りやすいポイントは共通しています。

この記事では、工事写真台帳をExcelで作るときに整理しておきたい項目と、写真一覧シートの情報をもとに台帳シートへ写真・写真タイトル・コメントを出力する、すぐ使えるVBAコードを紹介します。

このコードは、写真だけを貼るのではなく、一覧シートに入力したタイトルやコメントと対応させて台帳へ出す考え方のサンプルです。

工事写真台帳・施工写真台帳とは何か

工事写真台帳、施工写真台帳、現場写真台帳は、工事や現場作業の状況を写真と説明文で整理するための帳票です。

用途はさまざまです。

  • 施工状況の記録
  • 出来形確認
  • 材料確認
  • 着手前・施工中・完了後の記録
  • 安全管理の記録
  • 点検や調査の記録
  • 社内確認資料
  • 公共工事書類の一部

写真台帳は、写真を並べるだけでは足りません。

あとから見た人が、何の写真なのか、どの場所なのか、どの工種なのか、どのコメントと対応しているのかを確認できる必要があります。

工事写真台帳で整理しやすい項目

工事写真台帳で整理しておくと扱いやすい項目は、次のようなものです。

  • 写真ファイル名
  • 写真番号
  • 写真タイトル
  • コメント
  • 工種
  • 測点
  • 撮影日
  • 備考

発注者指定様式や社内様式によって、必要な項目は変わります。すべての台帳で同じ項目が必要になるわけではありません。

ただし、Excelで管理する場合は、最初に一覧シートを作っておくと後工程が楽になります。

たとえば、写真一覧 シートに次のような列を作ります。

  • A列:写真ファイル名
  • B列:写真タイトル
  • C列:コメント

この一覧をもとに台帳へ出力すれば、写真とコメントの対応を保ちやすくなります。

ファイル名だけで管理すると危ない理由

写真台帳を作るとき、写真ファイル名だけを頼りに作業すると、途中で混乱しやすくなります。

たとえば、現場で撮影した写真が次のような状態だったとします。

  • 似たような写真が多い
  • 撮影順と台帳に載せたい順番が違う
  • 不要写真が混ざっている
  • 後から写真を差し替えた
  • コメントを別の担当者が入力する
  • ファイル名が連番だけになっている

この状態で直接写真を貼り始めると、写真とコメントがずれる可能性があります。

特に、途中で1枚削除したり、写真を1枚追加したりすると、以降の写真番号やコメントがずれやすくなります。

そのため、写真台帳を作る前に、まず一覧シートで写真ファイル名、写真タイトル、コメントを対応させておくと安全です。

一覧シートを作ってから台帳に出す考え方

工事写真台帳をExcelで作る場合、次のような流れにすると整理しやすくなります。

  • 写真フォルダを用意する
  • 使う写真だけを選ぶ
  • 写真一覧シートを作る
  • 写真ファイル名を入力する
  • 写真タイトルを入力する
  • コメントを入力する
  • VBAで写真台帳シートへ出力する
  • 印刷結果とPDF出力結果を確認する

この方法の良いところは、写真と説明文の対応を表で確認できることです。

写真台帳シート上で直接コメントを入力する方法もありますが、写真を差し替えたり順番を変えたりすると、対応が崩れやすくなります。

一覧シートを元データとして持っておけば、写真台帳は「出力先」として扱えます。

すぐ使えるVBAコード:写真一覧から台帳へ出力する

ここから、写真一覧 シートの情報をもとに、写真台帳 シートへ写真、写真タイトル、コメントを出力するVBAコードを紹介します。

前提は次のとおりです。

  • 入力シート名:写真一覧
  • 台帳シート名:写真台帳
  • A列:写真ファイル名
  • B列:写真タイトル
  • C列:コメント
  • 1行目は見出し
  • 2行目以降を処理対象

写真フォルダを選択し、A列のファイル名に対応する写真を探して、台帳シートへ順番に貼り付けます。見つからない写真は、D列にメッセージを残します。

以下のコードは、写真台帳作成を補助するためのサンプルです。利用するExcelのバージョン、シート構成、結合セル、印刷範囲、画像サイズ、余白設定によって調整が必要になる場合があります。

実務ファイルで実行する前に、必ずファイルのバックアップを取ってください。まずはテスト用ブックとテスト用写真で動作確認してください。マクロを使うには、Excel側でマクロを有効化する必要があります。

Option Explicit

Sub 写真一覧から工事写真台帳を作成する()

    Dim wsList As Worksheet
    Dim wsBook As Worksheet
    Dim folderPath As String
    Dim lastRow As Long
    Dim r As Long
    Dim outputIndex As Long
    Dim photoPath As String
    Dim fileName As String
    Dim photoTitle As String
    Dim commentText As String

    Dim photoRanges As Variant
    Dim titleCells As Variant
    Dim commentCells As Variant
    Dim frameIndex As Long
    Dim pageIndex As Long
    Dim rowOffset As Long

    Const PAGE_ROW_HEIGHT As Long = 45

    Set wsList = GetRequiredSheet("写真一覧")
    If wsList Is Nothing Then
        MsgBox "写真一覧シートが見つかりません。", vbExclamation
        Exit Sub
    End If

    Set wsBook = GetRequiredSheet("写真台帳")
    If wsBook Is Nothing Then
        MsgBox "写真台帳シートが見つかりません。", vbExclamation
        Exit Sub
    End If

    folderPath = SelectPhotoFolder()
    If folderPath = "" Then Exit Sub

    photoRanges = Array("B4:H15", "J4:P15", _
                        "B19:H30", "J19:P30", _
                        "B34:H45", "J34:P45")

    titleCells = Array("B16", "J16", _
                       "B31", "J31", _
                       "B46", "J46")

    commentCells = Array("B17", "J17", _
                         "B32", "J32", _
                         "B47", "J47")

    lastRow = wsList.Cells(wsList.Rows.Count, "A").End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "写真一覧に処理対象データがありません。", vbExclamation
        Exit Sub
    End If

    DeletePhotoShapes wsBook, "WORK_PHOTO_"
    wsList.Range("D1").Value = "処理結果"
    wsList.Range("D2:D" & lastRow).ClearContents

    Application.ScreenUpdating = False

    outputIndex = 0

    For r = 2 To lastRow

        fileName = Trim$(CStr(wsList.Cells(r, "A").Value))
        photoTitle = CStr(wsList.Cells(r, "B").Value)
        commentText = CStr(wsList.Cells(r, "C").Value)

        If fileName <> "" Then

            photoPath = folderPath & "\" & fileName

            If Dir(photoPath) <> "" Then

                outputIndex = outputIndex + 1

                frameIndex = (outputIndex - 1) Mod (UBound(photoRanges) + 1)
                pageIndex = Int((outputIndex - 1) / (UBound(photoRanges) + 1))
                rowOffset = pageIndex * PAGE_ROW_HEIGHT

                InsertPictureFitToRange _
                    ws:=wsBook, _
                    picturePath:=photoPath, _
                    targetRange:=OffsetRange(wsBook.Range(photoRanges(frameIndex)), rowOffset), _
                    shapeName:="WORK_PHOTO_" & Format$(outputIndex, "0000")

                OffsetRange(wsBook.Range(titleCells(frameIndex)), rowOffset).Value = photoTitle
                OffsetRange(wsBook.Range(commentCells(frameIndex)), rowOffset).Value = commentText

                wsList.Cells(r, "D").Value = "出力済み"

            Else
                wsList.Cells(r, "D").Value = "写真ファイルが見つかりません"
            End If

        End If

    Next r

    Application.ScreenUpdating = True

    MsgBox "工事写真台帳への出力が完了しました。" & vbCrLf & _
           "出力枚数: " & outputIndex & " 枚" & vbCrLf & _
           "写真とコメントの対応、印刷結果、PDF出力結果を確認してください。", vbInformation

End Sub

Private Function GetRequiredSheet(ByVal sheetName As String) As Worksheet

    On Error Resume Next
    Set GetRequiredSheet = ThisWorkbook.Worksheets(sheetName)
    On Error GoTo 0

End Function

Private Function SelectPhotoFolder() As String

    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "写真フォルダを選択してください"
        .AllowMultiSelect = False

        If .Show <> -1 Then
            SelectPhotoFolder = ""
        Else
            SelectPhotoFolder = .SelectedItems(1)
        End If
    End With

End Function

Private Function OffsetRange(ByVal baseRange As Range, ByVal rowOffset As Long) As Range

    Set OffsetRange = baseRange.Offset(rowOffset, 0)

End Function

Private Sub InsertPictureFitToRange(ByVal ws As Worksheet, _
                                    ByVal picturePath As String, _
                                    ByVal targetRange As Range, _
                                    ByVal shapeName As String)

    Dim shp As Shape
    Dim scaleW As Double
    Dim scaleH As Double
    Dim scaleFactor As Double

    Set shp = ws.Shapes.AddPicture( _
        Filename:=picturePath, _
        LinkToFile:=msoFalse, _
        SaveWithDocument:=msoTrue, _
        Left:=targetRange.Left, _
        Top:=targetRange.Top, _
        Width:=-1, _
        Height:=-1)

    shp.LockAspectRatio = msoTrue

    scaleW = targetRange.Width / shp.Width
    scaleH = targetRange.Height / shp.Height

    If scaleW < scaleH Then
        scaleFactor = scaleW
    Else
        scaleFactor = scaleH
    End If

    shp.Width = shp.Width * scaleFactor
    shp.Height = shp.Height * scaleFactor

    shp.Left = targetRange.Left + (targetRange.Width - shp.Width) / 2
    shp.Top = targetRange.Top + (targetRange.Height - shp.Height) / 2

    shp.Placement = xlMoveAndSize
    shp.Name = shapeName

End Sub

Private Sub DeletePhotoShapes(ByVal ws As Worksheet, ByVal prefix As String)

    Dim i As Long

    For i = ws.Shapes.Count To 1 Step -1
        If Left$(ws.Shapes(i).Name, Len(prefix)) = prefix Then
            ws.Shapes(i).Delete
        End If
    Next i

End Sub

コードを使う前に準備するシート

このコードでは、2つのシートを使います。

1つ目は 写真一覧 シートです。ここに写真ファイル名、写真タイトル、コメントを入力します。

2つ目は 写真台帳 シートです。ここに写真と説明文を出力します。

写真一覧 シートは、次のように作ります。

  • A1:写真ファイル名
  • B1:写真タイトル
  • C1:コメント
  • A2以降:写真ファイル名
  • B2以降:写真タイトル
  • C2以降:コメント

写真ファイル名は、選択する写真フォルダ内のファイル名と一致させてください。拡張子まで含めて入力します。

たとえば、photo001.jpg のように入力します。

写真とコメントの対応を保つための考え方

このコードのポイントは、写真一覧シートを元データにしていることです。

写真台帳シートへ直接コメントを書き込むのではなく、一覧シートで写真ファイル名、写真タイトル、コメントを対応させてから出力します。

この構成にすると、次のような確認がしやすくなります。

  • どの写真にどのタイトルが付いているか
  • コメントが空欄の写真はどれか
  • 写真ファイルが見つからない行はどれか
  • 台帳へ出力済みの行はどれか
  • 写真の並び順を変更したい場合、一覧側で調整できるか

工事写真台帳では、写真とコメントがずれると資料として危険です。貼付作業だけを自動化するのではなく、対応表を持つことが大切です。

実務で調整が必要なポイント

このコードは汎用サンプルです。実務で使う場合は、必ず次の点を調整・確認してください。

  • 写真枠の位置
  • 写真タイトルを入れるセル
  • コメントを入れるセル
  • 1ページあたりの写真枚数
  • ページごとの行数
  • 工種、測点、撮影日など追加項目の有無
  • 印刷範囲
  • 余白
  • PDF出力後の見え方
  • 発注者指定様式や社内様式との整合

工種、測点、撮影日も出力したい場合は、写真一覧 シートに列を追加し、台帳シート側の出力セルを増やす必要があります。

ただし、列を増やすほど、写真と説明文の対応関係を崩さない管理が重要になります。

提出用成果品として使う場合の確認

工事写真台帳を提出用成果品として使う場合は、発注者指定様式、社内様式、写真管理ルールを必ず確認してください。

Excelで写真台帳が作れたとしても、それがそのまま提出物として妥当とは限りません。

提出前には、少なくとも次の確認が必要です。

  • 指定様式と項目名が合っているか
  • 写真の順番が適切か
  • 写真タイトルが正しいか
  • コメントが写真と対応しているか
  • 工種、測点、撮影日が正しいか
  • 写真の抜けや重複がないか
  • 印刷時に写真や文字が切れていないか
  • PDF出力後にレイアウトが崩れていないか
  • 必要な写真が不足していないか

VBAは、写真を台帳に出力する作業を助けます。しかし、工事写真としての正確性や提出可否を保証するものではありません。

免責と注意事項

この記事で紹介したVBAコードは、写真台帳作成を補助するためのサンプルです。

利用するExcelのバージョン、シート構成、結合セル、印刷範囲、画像サイズ、余白設定によって、調整が必要になる場合があります。

実務ファイルで実行する前に、必ずバックアップを取ってください。まずはテスト用ブックとテスト用写真で動作確認してください。マクロを使うには、Excel側でマクロを有効化する必要があります。

提出用成果品として使う場合は、写真とコメントの対応、印刷結果、PDF出力結果、発注者・社内様式との整合を必ず人間が確認してください。

このコードは、電子納品基準、発注者指定様式、工事写真管理ルールへの適合を保証するものではありません。コード利用による損害、データ破損、提出物不備等について、維持DXは責任を負いません。

まとめ

工事写真台帳をExcelで作るときは、写真を貼る前に、写真ファイル名、写真タイトル、コメントの対応を整理しておくことが大切です。

写真ファイル名だけで管理すると、途中で写真を追加・削除・差し替えたときに、コメントとの対応が崩れやすくなります。

一覧シートを作ってから台帳シートへ出力する構成にすると、写真と説明文の関係を確認しやすくなります。

維持DXでは、成果品整理、Excel帳票、写真台帳、VBA自動化、個別様式対応など、現場実務で発生する小さな作業負担を軽くする考え方を整理しています。

工事写真台帳も、最初からすべてを自動化する必要はありません。まずは写真一覧を作り、写真とコメントの対応を崩さない仕組みにするだけでも、かなり実務的な効果があります。

■ダウンロード

無料ダウンロード(Excel)

維持DXでは建設コンサルタント実務を軽くするツールを無料で公開しています。
以下のフォームにメールアドレスを入力すると、ダウンロードURLを自動返信メールでお送りします。

    お名前(任意)

    メールアドレス(必須)

    会社名・所属(任意)

    ご関心のある内容(任意)

    ご相談内容(任意)

    ご注意

    ダウンロードURLは、入力いただいたメールアドレス宛に自動返信で送信されます。

    ダウンロードしたExcelでマクロが実行できない場合は、

    右クリック → プロパティ →「許可する」 をチェック後、再度開いてください。

    Windowsのセキュリティ機能により、初回実行時にマクロがブロックされる場合があります。