年末に中学校の同窓会がありました。25年ぶりに会う恩師や友人がいて1次会から話が止まらず盛り上がりました。みんなと連れだって3次会まで参加しました。あっという間に時間が過ぎました。
私は同窓会の受付係を担当しました。申込みをWebの申込みフォームで行い、このデータをExcelファイルにまとめ、当日の名簿や名札を作成しました。これらは今までのイベント(IJET-25)や自主開催セミナーで行っていることと同じことなのでスムーズにいきました。
「Excelファイルから名札」というと、Wordの「差し込み印刷機能」を思い浮かべる方も多いと思います。私は、名札作成には自作マクロを利用しています。というのも、差し込み印刷機能を習得する前にマクロで同じようなものを作ってしまったからです(笑)。
今回の記事では、この名札作成用のマクロを紹介します。シンプルなマクロにしましたが、このマクロは、宛名印刷にも応用できます。「差し込み印刷機能」を覚えるのが面倒な(笑)イベント企画者や幹事の方に活用いただけると思います。表記を自由に変えてご活用ください。
<目次>
このマクロでできること
Excelファイルに記載した情報から名刺サイズ(A4で10枚)の名札を作成します。
役職、所属などを記載する1行目と名前を記載する2行目の2つの情報を表示します。
例えば、以下のようなExcelファイルを用意します。なんちゃって個人情報を用いて作りました。
マクロを実行するとExcelファイルを選択するダイアログボックスが表示されます。
ここでExcelファイルを選ぶと、こんな感じの表ができます。2列×5行の表です。市販の名札用紙を利用することを考えて、罫線には色がありません。
フォントのサイズは以下の通りです。好みに応じて変更してください。
マクロの解説
WordからExcelファイルを開きます。事後バインディング(Late Binding)という呼び出し方でExcelオブジェクトを立ち上げて、Excelを操作します。
事後バインディングでExcelオブジェクトを作った場合、Excelのメソッドやプロパティはポップアップのリストで表示されません。また、Excel用の変数(例えば、xlUp, xlDownなど)も使えません。
そういう意味で少し面倒なのですが、事前バインディング(Early Binding)という別の方法をとると、参照設定するライブラリのバージョンによってエラーが発生することがあります。
そのため、私は公開するマクロでは事後バインディングをしています。
マクロ
Sub Excel名簿から名札作成() Dim ExcelApp As Object Dim myWorkBook As Object Dim myWorkSheet As Object Dim fd As FileDialog Dim vrtSelectedItem As Variant Dim myFilePath As String 'Excelファイルパス Dim i As Long Dim iMax As Long 'Excelファイルの最大行数 Dim RowMax As Integer '名札用紙の最大行数 Dim newDoc As Document '名札用新規ファイル Dim myTable As Table Dim myCell As Cell '記入対象のセル '-------------------------------------------- 'Excelファイルの選択 '-------------------------------------------- Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd .AllowMultiSelect = False If .Show = -1 Then myFilePath = .SelectedItems(1) Else Exit Sub End If End With Select Case Right(myFilePath, 4) Case ".xls", "xlsx" '何もしない Case Else MsgBox "Excelファイルを選択してください。" Exit Sub End Select Set fd = Nothing Application.ScreenUpdating = False '-------------------------------------------- 'Excelファイルを開く '-------------------------------------------- Set ExcelApp = CreateObject("Excel.Application") ExcelApp.Visible = False Set myWorkBook = ExcelApp.workbooks.Open(myFilePath) Set myWorkSheet = myWorkBook.worksheets(1) 'ExcelファイルのA列の最終行を取得(-4162はxlUp) iMax = myWorkSheet.Cells(myWorkSheet.Rows.Count, 1).End(-4162).Row '-------------------------------------------- '用紙の設定(縦55mm、横91mmのA4の10面名刺サイズ) '-------------------------------------------- Set newDoc = Documents.Add '行数の設定 RowMax = Round((iMax - 1) / 2) 'フォント設定 With newDoc.Range.Font .NameFarEast = "MS ゴシック" .NameAscii = "Arial" .NameOther = "Arial" .Name = "Arial" .Size = 10.5 End With '余白設定 With newDoc.PageSetup .TopMargin = MillimetersToPoints(11) .BottomMargin = MillimetersToPoints(6) .LeftMargin = MillimetersToPoints(14) .RightMargin = MillimetersToPoints(14) .LinesPage = 53 .LayoutMode = wdLayoutModeLineGrid End With '表の作成 Set myTable = newDoc.Tables.Add(newDoc.Range, RowMax, 2) With myTable .Rows.HeightRule = wdRowHeightExactly .Rows.Alignment = wdAlignRowCenter .Rows.Height = MillimetersToPoints(55) .Columns.Width = MillimetersToPoints(91) .Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter End With '-------------------------------------------- '書き込み '-------------------------------------------- With myWorkSheet For i = 2 To iMax '書き込み対象のセルオブジェクトの設定 Set myCell = myTable.Cell(Int(i / 2), i Mod 2 + 1) '下の列(名前) With myCell.Range.Paragraphs(1).Range .Font.Size = 34 'フォントサイズ .InsertParagraphBefore .ParagraphFormat.Alignment = wdAlignParagraphCenter '中央揃え .InsertBefore Text:=myWorkSheet.Cells(i, 2).Value .InsertParagraphBefore End With '上の列(都道府県) With myCell.Range.Paragraphs(1).Range .Font.Size = 22 'フォントサイズ .InsertParagraphBefore .ParagraphFormat.Alignment = wdAlignParagraphLeft '左揃え .InsertBefore Text:=myWorkSheet.Cells(i, 3).Value End With DoEvents Next i End With '-------------------------------------------- '後処理 '-------------------------------------------- 'Excelファイルを閉じる myWorkBook.Close DoEvents '処理後のExcelオブジェクトの解放部分 Set myWorkBook = Nothing Set myWorkSheet = Nothing ExcelApp.Quit DoEvents Set ExcelApp = Nothing Set newDoc = Nothing Set myTable = Nothing Application.ScreenUpdating = True DoEvents MsgBox iMax - 1 & "名の名札を作成しました。" End Sub