今週末コラボセミナーをさせていただくインストラクターのネタ帳の伊藤さんの記事に、「複数のWordファイルを一つにまとめるマクロ」が掲載されていました。
なんか拍子抜けするくらいシンプルで美しいコードですね。
これで十分。
私は2011年に、以下のようなマクロを書いていました。
フォルダ内の文書を統合 (PC Onlineの記事)
それ以前の2009年に、以下のようなマクロを書きました。
両方とも、コピペをすることを前提にしていました。
Wordの機能(ファイルの挿入)を知らなかったからです。
ファイルを1つずつ開いて、その内容を新しい文書にコピペするというマクロです。
なので、公開当時は、このマクロを「コピペ」と呼んでいました。
その後、セミナーで配付しているマクロ集には、「ファイル統合2」というマクロの名称で同じようなマクロを配付しています。
この「ファイル統合2」では、コピペではなく、今回インストラクターのネタ帳の記事「複数のWordファイルを一つにまとめるマクロ」で紹介されているのと同じように、「ファイルの挿入」の機能(InsertFile メソッド)が使われています。
今回は、そのコードを紹介します。
<目次>
このマクロでできること
マクロを実行すると開くダイアログボックスからフォルダを選択します。
選択したフォルダ内のWordファイルをすべて新規のファイルに書き込みます。
ファイル名は、ヘッダーに書き込みます。
ヘッダーに書き込まれるファイル名は、交互に色を変えてあります。
実は、ファイル名をどこに挿入しようか迷いました。
苦肉の策としてヘッダーに入力しているのですが、もともとの原稿のヘッダーに文字が入力されていたり、セクション毎にヘッダーの記述を変えたりしているようなファイルでは、うまく機能しません。
いらないことにチャレンジしてわかりにくく複雑になってしまっています(笑)。
が、そのまま紹介します。
インストラクターのネタ帳で紹介されているように、ファイル名を本文中に記述する方がわかりやすくていいですね。
マクロの解説
21行目~35行目で、ヘッダに文字を入れています。
ファイルの挿入は38行目です。
マクロ
Sub ファイルの統合() Dim fld As FileDialog Dim myFileName As String 'Wordファイル名 Dim myFilePath As String 'Wordファイルのパス Dim mySecNum As Integer 'セクション番号 'フォルダの選択 Set fld = Application.FileDialog(msoFileDialogFolderPicker) If fld.Show = 0 Then Exit Sub myFilePath = fld.SelectedItems(1) myFileName = Dir(myFilePath & "\*.doc*") If myFileName = "" Then MsgBox "選択したフォルダ内に、Wordファイルがありません。": Exit Sub '記録用の新規文書を開く Documents.Add 'ファイルのコピー Do While myFileName <> "" With Selection 'セクション番号取得 mySecNum = ActiveDocument.Range(0, Selection.Sections(1).Range.End).Sections.Count With ActiveDocument.Sections(mySecNum) 'ヘッダー名追加 With .Headers(wdHeaderFooterPrimary) .LinkToPrevious = False If mySecNum Mod 2 = 0 Then .Range.Font.ColorIndex = wdBlue Else .Range.Font.ColorIndex = wdRed End If .Range.Text = myFileName End With End With 'ファイルの内容を文書末尾に追記 .InsertFile FileName:=myFilePath & "\" & myFileName .InsertParagraphAfter .InsertBreak Type:=wdSectionBreakNextPage End With myFileName = Dir() Loop End Sub
お知らせ
インストラクターのネタ帳の管理人の伊藤潔人さん(Microsoft Excel MVP)とコラボセミナーをします。
今週末の7月29日(日)です。
その後の懇親会も、多数ご参加を予定いただいております!!
セミナーの楽しさは、Excel や Wordをプログラミングの視点から眺められるということですね。
プログラミングにはオブジェクトという考え方を用います。このオブジェクトの構造には、ソフトウェアの思想が反映されていますから、この点を少しのぞいてみると、ソフトウェアそのものがよく見えてきます。
オフィス製品全般に精通した伊藤さんがWordマクロを斬ります。
ぜひセミナーでお会いしましょう。
コメント