選択位置で文書を分割して保存する

「選択位置より前」と「選択位置以降」とで、文書を2分割するマクロです。手動で行うと地味に面倒な作業なので、マクロ化しておくと便利です。

仕組みとコード

元の文書のコピーを2個作成し、一方は選択位置以降を削除、他方は選択位置より前を削除します。元の文書は残ります。文書の分割箇所に一時的にブックマークを設定する仕組みです。

Public Sub 選択位置で文書を分割()

  Const nameBM As String = "vba_Split" 'ブックマーク名
  Dim oDoc As Document
  Dim nameA As String, nameB As String

  Set oDoc = ActiveDocument
  '状態チェック
  If oDoc.Saved = False Then GoTo ENDUP
  If Selection.Information(wdWithInTable) Then GoTo ENDUP
    
  nameA = Replace(oDoc.Name, ".doc", "_1.doc")
  nameB = Replace(oDoc.Name, ".doc", "_2.doc")
    
  '現在位置にブックマークを設定してコピーを作成
  oDoc.Bookmarks.Add nameBM, Selection.Paragraphs(1).Range
  oDoc.SaveAs2 oDoc.Path & "\" & nameB
  oDoc.SaveAs2 oDoc.Path & "\" & nameA
    
  '前半ファイル…ブックマーク以降を削除して保存
  oDoc.Range( _
      Start:=oDoc.Bookmarks(nameBM).Range.Start, _
      End:=oDoc.Content.End).Delete
  oDoc.Save

  '後半ファイル…ブックマークより前を削除して保存
  Set oDoc = Documents.Open(oDoc.Path & "\" & nameB)
  oDoc.Range( _
      Start:=oDoc.Content.Start, _
      End:=oDoc.Bookmarks(nameBM).Range.Start).Delete
  oDoc.Bookmarks(nameBM).Delete 'ブックマーク削除
  oDoc.Save

ENDUP:
  Set oDoc = Nothing
End Sub
状態チェック

文書が未保存の場合、表内が選択されている場合は処理を中止しています。ほかにも正常動作しない条件(ヘッダー・フッターが選択されている場合など)はあるので必要に応じて補ってください。

ブックマークの設定
Document.Add (ブックマーク名, 設定対象Range)

分割位置を保持するために、選択範囲の先頭段落にブックマークを設定しています。

ブックマーク設定範囲の先頭を取得
Document.Bookmarks(ブックマーク名).Range.Start

ブックマークの開始位置から、削除範囲の開始位置、終了位置を特定しています。

削除範囲の他方位置である文書の先頭と末尾は、Document.Content.StartDocument.Content.End で求められます。

このマクロでは、文書内を横断的に扱う機能は考慮していません。分割後の文書では、相互参照や目次などは正しく維持されなくなります。
そうしたトラブルの可能性を考慮して、分割前の文書を残すようにしています。
タイトルとURLをコピーしました