区切り文字で区切られたフィールド名のみを使用するプリミティブ MailMerge
-
20-09-2019 - |
質問
明らかに、アプリがテンプレートに基づいて Word 文書を生成する正しい方法は、管理者ユーザー (テンプレートを管理する人) に、テンプレート文書に正しい差し込みフィールドまたはブックマークを埋め込むことを奨励することです。
ただし、通常は MailMerge や Word のその他の「高度な」機能を使用しない典型的な管理者ユーザーが、差し込みフィールドを使用する必要があるため、非常に躊躇していることが過去にわかりました。私たちは彼らのためにそれを試し、ドキュメントやたくさんのスクリーンショットなどを作成しました。しかし、彼らにとってそれはすべて「面倒」です。
彼らは何十ものテンプレート (すべて異なる種類の非常に単純な文字だけ) を持っており、かなりの頻度でそれらを変更したいと考えます。
彼らが本当に望んでいるのは、中括弧のような単純な区切り文字でフィールドをマークできることだけです。これにより、次のように、自家製の差し込みフィールドがアプリに効果的にマークされます (ただし、Word はその重要性を認識していません)。
{顧客の姓} 様
次に、次のように数行のコードでフィールドを選択するだけです。
w = New Word.Application
d = w.Documents.Open(...)
Dim mergedContent As String = d.Content.Text
mergedContent = mergedContent.Replace("{CustomerSurname}", Customer.Surname)
mergedContent = mergedContent.Replace("{CustomerPostcode}", Customer.Postcode)
d.Content.Text = mergedContent
これは粗雑に感じますが、(エンド ユーザーにとっては) 美しくシンプルです。
他にこの道をたどった人はいますか?何か問題がありますか?ドキュメントの通常のテキストの他の場所では「{」と「}」文字を使用しないことをお勧めしますが、それは実際には重大な制限ではありません。
スピード?差し込みフィールドを 2 行にわたって折り返しますか?他に問題がありますか?
解決
これは、私が検索と置換するために使用私のコードの一部です。私が最初にあなたのコードを試してみましたが、それは動作しませんでした。これは、あなたがマクロを記録するとき、Wordが発生VBAコードに基づいています。
range = document.Range()
With range.Find
.Text = "{" & name & "}"
.Replacement.Text = NewValueHere
.Forward = True
.Wrap = Word.WdFindWrap.wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
range.Find.Execute(Replace:=Word.WdReplace.wdReplaceAll)
文書はOfficeのバイナリファイル形式と互換性があるために必要なので、私はこのコードを使用していました。あなたはOffice 2007のフォーマットを使用することができます場合は、Wordがインストールされている必要はありません。ただ、String.Replace("[OldValue]", "New value")
を行い、単語の\ document.xmlファイルを見つけ、文書を解凍し、ファイルを保存して戻って一つのパッケージ(DOCXファイル)に、それを圧縮します。
私はWordを自動化していますので、私はここに表示されるコードはかなり遅いです。 6つのフィールドで2つの文書を編集し、アプリを閉じて、Wordを開くと、私のPCに4秒かかります。
他のヒント
どのようなユーザーは、中括弧を使いたいんか?私はあなたがなどの例の/{/}
や{{}}
のためにそれらをエスケープする方法を提供するべきだと思う。
あなたはあなたのロジックを置き換えることを確認する必要があることは、両方の{CustomerSurname}と{Customersurname}が同じフィールドを表すために許されるべき場合例えば鈍感です。必要に応じて{顧客姓}のような単語間のスペースを可能にすることができる。