写真台帳を作るとき、まず無料のExcelテンプレートを探す人は多いと思います。
「写真台帳 テンプレート」「写真台帳 エクセル 無料」「エクセル 写真台帳 3枚 無料」「写真台帳 フリーソフト」などで検索すると、さまざまな形式の台帳が見つかります。
テンプレートを使うこと自体は、悪い方法ではありません。写真枠やコメント欄が最初から用意されていれば、ゼロから作るより早く始められます。
ただし、写真台帳のテンプレートは、見た目が似ていても中身の作りが違います。3枚台帳、6枚台帳、8枚台帳、縦向き、横向き、コメント欄の位置、結合セルの使い方、印刷範囲などが違うため、VBAを使う場合はテンプレートに合わせた調整が必要です。
この記事では、写真台帳のExcelテンプレートを使う前に確認したいポイントと、既存テンプレートの指定セル範囲へ写真を貼る、すぐ使えるVBAコードを紹介します。
写真台帳テンプレートは便利だが万能ではない
写真台帳テンプレートを使うメリットは、最初から形があることです。
写真枠、コメント欄、写真番号欄、備考欄などが用意されていれば、作業者は写真と説明文の入力に集中できます。
一方で、テンプレートは必ずしも自分の業務にそのまま合うとは限りません。
たとえば、次のような違いがあります。
- 1ページ3枚の台帳
- 1ページ6枚の台帳
- 1ページ8枚の台帳
- 写真の下にコメント欄がある形式
- 写真の横にコメント欄がある形式
- 写真番号だけを入れる形式
- 工種や測点も入れる形式
- 印刷範囲が設定済みの形式
- 余白や改ページを自分で調整する形式
写真台帳専用ソフトやフリーソフトにも、それぞれ得意な範囲があります。Excelテンプレートで足りる場面もあれば、専用ソフトの方が向いている場面もあります。
大切なのは、どちらが絶対に良いという話ではなく、今の作業に必要な項目と提出先のルールに合っているかを確認することです。
3枚台帳と6枚台帳ではVBAの指定範囲が変わる
ExcelテンプレートへVBAで写真を貼る場合、もっとも重要なのは「どのセル範囲に写真を入れるか」です。
たとえば、1ページ3枚の写真台帳なら、写真枠は3つです。
- 1枚目の写真枠
- 2枚目の写真枠
- 3枚目の写真枠
1ページ6枚の写真台帳なら、写真枠は6つになります。
VBAでは、この写真枠をセル範囲として指定します。たとえば B5:H15 のような範囲です。
ただし、実際のテンプレートでは結合セルが使われていることがあります。結合セルがある場合、見た目の写真枠と、VBAで指定するセル範囲の感覚が少しずれることがあります。
そのため、テンプレートを使う前に、写真を入れたい範囲を一つずつ確認しておく必要があります。
テンプレートで確認したいポイント
写真台帳のExcelテンプレートを使う前に、次の点を確認しておくと安全です。
- 写真枠の位置
- コメント欄の位置
- 写真番号欄の位置
- ファイル名を表示するかどうか
- 印刷範囲
- 用紙サイズ
- 余白
- 改ページ
- 行高
- 列幅
- 結合セルの範囲
- PDF出力時の見え方
特に、提出用の写真台帳として使う場合は、Excel画面だけで判断しない方が安全です。
画面上ではきれいに見えていても、PDF出力時にレイアウトが崩れることがあります。PDF出力時のレイアウト崩れも確認が必要です。
また、写真を貼り付けたあとに画像がずれる場合があります。画像がずれる原因については、別記事で整理しています。
既存テンプレートへVBAを合わせる考え方
写真台帳テンプレートへVBAを合わせるときは、テンプレート全体を自動判定しようとするより、まず写真枠のセル範囲を固定して考える方が現実的です。
つまり、コードの中に次のような指定を作ります。
- 1枚目の写真枠は
B5:H15 - 2枚目の写真枠は
B18:H28 - 3枚目の写真枠は
B31:H41
このように、貼付先を配列で持たせておけば、テンプレートに合わせて範囲を書き換えるだけで応用しやすくなります。
6枚台帳にしたい場合は、貼付先範囲を6つに増やします。8枚台帳にしたい場合は、8つに増やします。
VBAにすべてを推測させるのではなく、人間がテンプレートの写真枠を確認し、その範囲をコードに渡す、という考え方です。
すぐ使えるVBAコード:指定セル範囲へ写真を貼る
ここから、既存の写真台帳テンプレートに合わせて、指定したセル範囲へ写真を貼るVBAコードを紹介します。
このサンプルでは、1ページ3枚の写真台帳を想定しています。photoRanges の中にあるセル範囲を書き換えれば、別のテンプレートにも応用できます。
以下のコードは、写真台帳作成を補助するためのサンプルです。利用するExcelのバージョン、シート構成、結合セル、印刷範囲、画像サイズ、余白設定によって調整が必要になる場合があります。
実務ファイルで実行する前に、必ずファイルのバックアップを取ってください。まずはテスト用ブックとテスト用写真で動作確認してください。マクロを使うには、Excel側でマクロを有効化する必要があります。
Option Explicit
Sub 既存テンプレートへ写真を貼り付ける()
Dim ws As Worksheet
Dim folderPath As String
Dim files() As String
Dim fileCount As Long
Dim i As Long
Dim pasteCount As Long
Dim photoRanges As Variant
Dim numberCells As Variant
Set ws = ActiveSheet
folderPath = SelectPhotoFolder()
If folderPath = "" Then Exit Sub
files = GetPhotoFiles(folderPath, fileCount)
If fileCount = 0 Then
MsgBox "対象フォルダに jpg / jpeg / png ファイルが見つかりませんでした。", vbExclamation
Exit Sub
End If
SortStringArray files, fileCount
' ここを使うテンプレートに合わせて変更します。
' 3枚台帳の例です。
photoRanges = Array("B5:H15", "B18:H28", "B31:H41")
numberCells = Array("A5", "A18", "A31")
pasteCount = UBound(photoRanges) + 1
If fileCount < pasteCount Then pasteCount = fileCount
DeletePhotoShapes ws, "TEMPLATE_PHOTO_"
Application.ScreenUpdating = False
For i = 1 To pasteCount
InsertPictureFitToRange _
ws:=ws, _
picturePath:=folderPath & "\" & files(i), _
targetRange:=ws.Range(photoRanges(i - 1)), _
shapeName:="TEMPLATE_PHOTO_" & Format$(i, "0000")
ws.Range(numberCells(i - 1)).Value = i
Next i
Application.ScreenUpdating = True
MsgBox "写真を貼り付けました。" & vbCrLf & _
"貼付枚数: " & pasteCount & " 枚" & vbCrLf & _
"写真枠、印刷範囲、PDF出力結果を確認してください。", vbInformation
End Sub
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 GetPhotoFiles(ByVal folderPath As String, ByRef fileCount As Long) As String()
Dim tempFiles() As String
Dim fileName As String
Dim ext As String
ReDim tempFiles(1 To 1)
fileCount = 0
fileName = Dir(folderPath & "\*.*")
Do While fileName <> ""
ext = LCase$(Mid$(fileName, InStrRev(fileName, ".") + 1))
If ext = "jpg" Or ext = "jpeg" Or ext = "png" Then
fileCount = fileCount + 1
ReDim Preserve tempFiles(1 To fileCount)
tempFiles(fileCount) = fileName
End If
fileName = Dir()
Loop
GetPhotoFiles = tempFiles
End Function
Private Sub SortStringArray(ByRef arr() As String, ByVal itemCount As Long)
Dim i As Long
Dim j As Long
Dim tmp As String
If itemCount <= 1 Then Exit Sub
For i = 1 To itemCount - 1
For j = i + 1 To itemCount
If StrComp(arr(i), arr(j), vbTextCompare) > 0 Then
tmp = arr(i)
arr(i) = arr(j)
arr(j) = tmp
End If
Next j
Next i
End Sub
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
6枚台帳へ応用する場合
6枚台帳へ応用する場合は、photoRanges と numberCells を6つに増やします。
たとえば、次のような考え方です。
photoRanges = Array("B5:H15", "J5:P15", _
"B18:H28", "J18:P28", _
"B31:H41", "J31:P41")
numberCells = Array("A5", "I5", _
"A18", "I18", _
"A31", "I31")
実際には、使っているテンプレートのセル範囲に合わせて変更してください。
このように、テンプレートごとに違うのは「写真を貼る範囲」です。コードの基本部分を毎回作り直すより、写真枠の範囲を差し替える方が扱いやすくなります。
テンプレートで調整が必要なポイント
既存テンプレートにVBAを合わせる場合、特に次の点に注意してください。
- 写真枠が結合セルになっているか
- 写真枠の範囲指定が見た目と合っているか
- 行高と列幅が固定されているか
- 写真番号を入れるセルがあるか
- コメント欄が写真と対応しているか
- 印刷範囲が設定されているか
- 余白が大きすぎないか
- PDF出力時に写真や文字が切れないか
テンプレートは、画面上の見た目だけでなく、印刷やPDF出力後の状態まで確認しておく必要があります。
また、発注者指定様式や社内様式がある場合は、テンプレートを勝手に変更してよいとは限りません。セル幅、文字サイズ、余白、項目名などを変更すると、指定様式から外れる場合があります。
フリーソフトや無料テンプレートとの付き合い方
写真台帳のフリーソフトや無料テンプレートは、作業の入口として便利です。
ただし、すべての業務に合うとは限りません。
自分の業務で使う場合は、次の点を見て判断するとよいです。
- 必要な項目が入っているか
- 写真枚数の形式が合っているか
- コメント欄の位置が使いやすいか
- 印刷結果が整っているか
- PDF出力後に崩れないか
- 社内様式や発注者様式と合っているか
- 後からVBAで処理しやすい構造か
無料テンプレートを否定する必要はありません。むしろ、うまく合えば作業時間をかなり減らせます。
ただ、実務では「少しだけ様式が違う」「コメント欄の位置だけ違う」「写真番号の入れ方が違う」といった差分がよく出ます。その差分をどう扱うかが、Excel写真台帳の難しいところです。
免責と注意事項
この記事で紹介したVBAコードは、写真台帳作成を補助するためのサンプルです。
利用するExcelのバージョン、シート構成、結合セル、印刷範囲、画像サイズ、余白設定によって、調整が必要になる場合があります。
実務ファイルで実行する前に、必ずバックアップを取ってください。まずはテスト用ブックとテスト用写真で動作確認してください。マクロを使うには、Excel側でマクロを有効化する必要があります。
提出用成果品として使う場合は、写真とコメントの対応、印刷結果、PDF出力結果、発注者・社内様式との整合を必ず人間が確認してください。
このコードは、電子納品基準や発注者様式への適合を保証するものではありません。コード利用による損害、データ破損、提出物不備等について、維持DXは責任を負いません。
まとめ
写真台帳のExcelテンプレートは、うまく使えば便利です。
ただし、3枚台帳、6枚台帳、8枚台帳など、テンプレートごとに写真枠やコメント欄の位置が違います。VBAで写真を貼る場合は、写真枠のセル範囲を確認し、コード内の photoRanges をテンプレートに合わせて変更する必要があります。
写真台帳づくりでは、テンプレートを探すことだけでなく、そのテンプレートが自分の作業、印刷範囲、PDF出力、提出先のルールに合っているかを確認することが大切です。
維持DXでは、写真台帳、Excel帳票、VBA自動化、個別様式対応など、現場で使われている帳票をどう扱いやすくするかを整理しています。
テンプレートは入口です。実務で本当に効くのは、そのテンプレートの構造を理解し、必要な範囲だけを安全に自動化することです。
■ダウンロード
無料ダウンロード(Excel)
維持DXでは建設コンサルタント実務を軽くするツールを無料で公開しています。
以下のフォームにメールアドレスを入力すると、ダウンロードURLを自動返信メールでお送りします。
ご注意
ダウンロードURLは、入力いただいたメールアドレス宛に自動返信で送信されます。
ダウンロードしたExcelでマクロが実行できない場合は、
右クリック → プロパティ →「許可する」 をチェック後、再度開いてください。
Windowsのセキュリティ機能により、初回実行時にマクロがブロックされる場合があります。

