【Word VBA】複数のWordファイルを一つにまとめるWordマクロ

2012年7月27日

今週末コラボセミナーをさせていただくインストラクターのネタ帳の伊藤さんの記事に、「複数のWordファイルを一つにまとめるマクロ」が掲載されていました。

なんか拍子抜けするくらいシンプルで美しいコードですね。

これで十分。

私は2011年に、以下のようなマクロを書いていました。

フォルダ内の文書を統合 (PC Onlineの記事)

それ以前の2009年に、以下のようなマクロを書きました。

フォルダ内のすべてのWordファイルをコピペする

両方とも、コピペをすることを前提にしていました。

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)とコラボセミナーをします。

ExcelマクロユーザーのためのWordマクロ入門セミナー

今週末の7月29日(日)です。

その後の懇親会も、多数ご参加を予定いただいております!!

セミナーの楽しさは、Excel や Wordをプログラミングの視点から眺められるということですね。

プログラミングにはオブジェクトという考え方を用います。このオブジェクトの構造には、ソフトウェアの思想が反映されていますから、この点を少しのぞいてみると、ソフトウェアそのものがよく見えてきます。

オフィス製品全般に精通した伊藤さんがWordマクロを斬ります。

ぜひセミナーでお会いしましょう。

コメント

  • 2. Re:お世話になりました

    >Sakinoさん

    どうもありがとうございます。お役に立ててよかったです。それに、このマクロのことを覚えていただいていてよかったです!

  • 1. お世話になりました
    ちょうど勉強会のファイルをまとめねばならず、そうだ 新田さんのマクロがあった!!!……ということで使わせていただきました。ヘッダーにファイル名がでるのは見やすくてよいですね。自分でやったら、途中でまちがえたりして何時間もかかったであろう作業が5秒! ほんとうにありがとうございました。
    Sakino

-コード
-, , ,