本文では、Word 文書のバッチ処理の能力を 3 つ実現します:1)テキストの置換 + フォーマット付き、2)最後のページの削除、3)文末に内容を追加。⚠️:使用する前に必ずバックアップを取ってください、バックアップを取ってください、バックアップを取ってください!
週末の朝☀️、彼女がコンピュータ💻の前でエモい顔をしているのを見つけました。私は彼女を見つめ👀、彼女は言葉を飲み込んで🤭、私に一緒に残業してほしいようです😭。
しかし、プログラマーとして、私はこの女性弁護士👩🏻💼に何を手伝えるのでしょうか?
彼女はついに口を開き🎙️ました:「私たちの上司が、これらの数百の Word 文書の中で、このテキストをこれに置き換え、このテキストをこれに置き換え、このフォーマットをこれに変更し、このフォーマットをこれに変更し、そして最後のページの内容は削除して、他の内容に置き換えてほしいと言っています...」
私:お?これは重労働🧱のようですね?どうしてあなたたちにやらせるのですか?私に任せてください!
要件分析#
背景:女性弁護士は数百の Word 文書を規則的に処理する必要があります。約束していた週末のハイキングは台無しになりそうですか?
要件:
- バッチ処理:Word 文書を一つずつ手動で開く必要はありません;
- テキストの置換:A→B;
- 最後のページを削除;
- 文末に内容を追加。
解決策#
長い間眠っていた Windows コンピュータを取り出し、Word を開きます。
「サードパーティツール」と「自分で作成した VBA」の 2 つの方法を組み合わせて、最終的にこのタスクを完了しました。✅ ✅ ✅
前提知識:VBA#
バッチ処理を実現するためには、まず VBA を理解する必要があります:
Visual Basic for Applications(VBA)は、Visual Basic のマクロ言語で、Microsoft がデスクトップアプリケーションで一般的な自動化タスクを実行するために開発したプログラミング言語で、Microsoft Office ソフトウェアの機能を拡張するためによく使用されます。
私たちは Word に付属の「開発ツール」を使用して VBA マクロを作成できます。この開発ツールの入口はここにあります:
このタブがない場合は、Word > ファイル > オプション > リボンのカスタマイズからこのタブを追加する必要があります:
次に、開発ツール > コード部分を通じて VBA を作成できます~
マクロの録音の役割について:どの Visual Basic やプロパティを使用するか不明な場合は、マクロを録音することで、Word で手動で実行する操作を自動的に Visual Basic コードに変換し、その後、必要な操作を明確にするためにコードを少し調整することができます。具体的な手順は公式文書を参照してください —— Microsoft 技術文書:マクロを録音してコードを生成する。
サードパーティツール:WordSR#
待って、「テキストのバッチ置換」という一般的な機能はすでに誰かが実装しているはずです。やはり、Funduc Software 社が開発したソフトウェア、Word Search and Replace 2.40があります。これはグラフィカルインターフェースも持っています:(この会社は、Replace Studio Pro、Replace Studio Business Edition、Search and Replace のアップグレード版も開発しましたが、中国語文書の検索には文字化けの問題があります。実際に試してみて、興味がある方は研究してみてください)
Word の検索置換機能に似ていますが、複数ファイルの選択機能が追加されています。
1)最初の入力ボックス:検索する内容を入力;
2)2 番目の入力ボックス:置換後の内容を入力;
3)3 番目の入力ボックス:バッチ処理するファイルのパスを入力。注意、*.doc
は処理するフォルダ内のすべての.doc
ファイルを示し、*.doc*
は*.docs
ファイルも処理します。
PS:正規表現のマッチングもサポートしており、「Use Pattern Matching」をチェックすることを忘れないでください;フォルダ内のサブフォルダの文書も置換する必要がある場合は、「Search Subdirectories」をチェックすることを忘れないでください。
使用手順:
⚠️:使用する前に必ずバックアップを取ってください、バックアップを取ってください、バックアップを取ってください。
1)http://www.funduc.com/word_sr.htmのウェブページにアクセスし、ソフトウェアの圧縮パッケージをダウンロードします。
2)解凍後、以下の図のように、WordSR_240_64bit.docm ファイルをダブルクリックして開きます(システムと Office のバージョンに応じて選択します。現在使用しているコンピュータは一般的に 64bit システムです)。
3)「Double Click Here To Run Word Search and Replace」テキストをダブルクリックします(Word がセキュリティ警告を表示した場合:マクロが無効になっています。最初に「コンテンツを有効にする」をクリックしてください)、それから楽しく使用できます~
注:上記の文書にも詳細な使用説明がありますので、理解できない場合は一度見てみてください;開発ツール > Visual Basic をクリックすることで、そのソースコードも確認できます。本質的には VBA です。
さて😊、このサードパーティツールを使って、私は女性弁護士の大部分の置換作業を完了しましたが、特定のテキストに太字や下線を追加するなどのカスタマイズされた要件が残っています。どうすれば実現できるのでしょうか?自分でやって、豊かに食べましょう。
カスタマイズ機能#
カスタマイズされた要件は:1)フォーマット付きのテキスト置換;2)最後のページの削除;3)文末に内容を追加
0)バッチ処理#
まず、これらの要件を実現するために最も重要なのはバッチ処理の能力、つまりフォルダをループして処理する能力⭐️です。
コードは以下の通りです:(コードにはいくつかの注釈を追加しており、理解しやすく、必要に応じて修正しやすくしています。)
Sub フォルダをループ処理()
'
' フォルダをループ処理するマクロ
'
'
On Error Resume Next 'マクロ内で「実行時エラー」が発生した場合、プログラムは中断せずに続行します
'Dimで変数を宣言し、Asの後に型を指定します。指定しない場合は、デフォルトでVariant型になります
'$はAs Stringの省略形、&はAs Longの省略形です
Dim objShell As Object, objFolder As Object, pPath$, f As Object, fd As Object, fso As Object, Stack$(), top&, n&, stxt$, doc As Document, x&
'Setはオブジェクト参照を割り当てるために使用されます
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "バッチ処理するフォルダを選択してください!", 0, 0)
If (objFolder Is Nothing) Then Exit Sub 'キャンセルを選択した場合は直接終了
'フォルダパスを取得
pPath = objFolder.self.Path & ""
Set objShell = Nothing
Set objFolder = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
top = 1
ReDim Stack(0 To top)
'フォルダをループ処理し、サブフォルダも含めます(スタック構造を利用)
Do While top >= 1
For Each f In fso.GetFolder(pPath).Files
n = n + 1
stxt = f.Path
' .docおよび.docsファイルを処理
If stxt Like "*.doc*" Then
Set doc = Documents.Open(FileName:=stxt, Visible:=True) 'VisibleをTrueに設定すると、一部の操作が可視状態でないと効果がありません
Call テキスト置換 '【単一文書の処理方法】任意のマクロを選択してください!
doc.Close SaveChanges:=wdSaveChanges ':=はパラメータに値を割り当てるために使用されます
x = x + 1
End If
Next
For Each fd In fso.GetFolder(pPath).SubFolders
Stack(top) = fd.Path
top = top + 1
If top > UBound(Stack) Then ReDim Preserve Stack(0 To top)
Next
If top > 0 Then pPath = Stack(top - 1): top = top - 1 '":"は2つの文を接続するために使用されます
Loop
Set f = Nothing
Set fd = Nothing
Set fso = Nothing
'関数の戻り値を使用しない場合は括弧は不要ですが、必要な場合はパラメータを括弧で囲む必要があります
MsgBox "フォルダには " & n & " 個のファイルがあります!" & vbCr & "合計でWord文書(*.docx/*.doc)を " & x & " 個処理しました!", 0 + 48
End Sub
このコードは特定のフォルダをループ処理し、その中の各ファイルに同じ処理を行います。この処理方法は Call テキスト置換
という行のコードによって決まります。
そして テキスト置換
は以下に記載されたマクロであり、関数として理解することもできます。
1)フォーマット付きのテキスト置換#
コードは以下の通りです:(同様に注釈を追加しており、フォーマットは必要に応じて変更できます)
Sub テキスト置換()
'
' テキスト置換マクロ
'
'
With ActiveDocument.Content.Find
.ClearFormatting
With .Replacement
.ClearFormatting
.Font.Bold = True 'フォントを太字にする
.Font.Underline = wdUnderlineSingle '単一の下線を追加
End With
'検索と置換を実行:'FindTextは検索するテキスト、ReplaceWithは置換後のテキスト、FormatはTrueでフォーマット付き
'"_"は改行を示します
.Execute _
FindText:="公众号", _
ReplaceWith:="Bo2SS", _
Format:=True, _
Replace:=wdReplaceAll 'wdReplaceAllはすべてを置換、wdReplaceOneは1回だけ置換
End With
End Sub
2)最後のページを削除#
コードは以下の通りです:(注釈を参照)
Sub 最後のページを削除()
'
' 最後のページを削除するマクロ
'
'
Dim pageNum As Long, StartPage As Long, EndPage As Long
'総ページ数を取得
pageNum = Word.ActiveDocument.Range.Information(wdNumberOfPagesInDocument)
'最後のページの開始範囲を特定し、選択します
StartPage = Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Count:=pageNum - 1).Start
EndPage = ActiveDocument.Content.End
ActiveDocument.Range(StartPage, EndPage).Select
'選択した内容を削除
Selection.Delete
End Sub
バッチ処理コード内で、Call テキスト置換
を Call 最後のページを削除
に置き換えれば使用できます。
3)文末に内容を追加#
コードは以下の通りです:(注釈を参照)
Sub 文末に内容を追加()
'
' 文末に内容を追加するマクロ
'
'
Dim oRng As Range, oDoc As Document
Set oDoc = Word.ActiveDocument
Set oRng = oDoc.Content
With oRng
'文書の末尾に文字を挿入します。例えばChr(10)は改行を追加し、「こんにちは」は「こんにちは」を追加します
.InsertAfter Chr(10)
'.InsertAfter "こんにちは"
End With
End Sub
バッチ処理コード内で、Call テキスト置換
を Call 文末に内容を追加
に置き換えれば使用できます。
🔎 具体的な使用手順#
⚠️:使用する前に必ずバックアップを取ってください、バックアップを取ってください、バックアップを取ってください。
a) 開発ツール > マクロをクリック > マクロ名を入力 > 作成をクリック;
b)開いた VBA エディタに上記の 4 つのコードをコピーします;
c)カーソルを「フォルダをループ処理」マクロに移動し、F5 を押して実行します。フォルダ選択ウィンドウがポップアップし、フォルダを選択すると、その中の各ファイルが適切に処理されます!
ヒント#
- マクロの実行を強制停止する:Ctrl + break。
- VBA の使い方が不明な場合は、まずMicrosoft 技術文書: Word VBA 参考で答えを探してみてください!
- VScode には VSCode VBA というプラグインがあり、これを使って VBA を書くとより見栄えが良くなります~
どうですか?本当に Word 兄の遊び心を感じましたか?
Microsoft、尊敬します!
これで、彼女も早々にタスクを完了し、私たちは一緒に楽しくハイキングに行きました。この投稿のカバーも今回のタスクの報酬の一つです👀~