メアリーは、マクロをかなり使用して、ドキュメントにテキストを追加しています。問題は、追加されたテキストにアポストロフィが含まれている場合、それらが「スマート」ではなく「ストレート」としてテキストに追加されることです。彼女は、Wordにストレートクォートの代わりにスマートクォートを使用するように指示するAutoFormat As You Type設定が設定されていることを示していますが、これは私のマクロによって挿入されるテキストには影響しません。

入力するのではなくマクロを使用してドキュメントにテキストを挿入すると、それぞれの場合のテキストはWordによって異なる方法で処理されます。入力したテキストは、各文字が入力されるたびに処理されます。マクロによって挿入されたテキストは、ドキュメントに貼り付けられたテキストのように扱われます。したがって、「これは私のテキストです」と入力すると、Wordはすべての文字の後に処理を実行します。つまり、プログラムがオートフォーマットとオートコレクト、およびWordがテキストを処理するために行うその他すべてのことをチェックする時間があるということです。

マクロを使用して同じテキストを入力すると、その場所に貼り付けたかのように、ブロックとして挿入されます。これは、オートフォーマットによって処理されたはずのテキストの途中の文字(引用符やアポストロフィなど)が「捕捉」および処理されないことを意味します。これは、マクロによって挿入されたテキスト内にストレートクォートが含まれている場合、ストレートクォートがスマートクォートに変更されないことを意味します。

これに対する解決策にアプローチする方法はいくつかあります。 1つ目は、マクロにすべてのテキストを挿入した後、検索と置換の操作を実行して、すべての引用符を引用符に、アポストロフィをアポストロフィに置き換えることです。これは奇妙に聞こえるかもしれませんが、「入力時にオートフォーマット」をスマートクォートを使用するように設定している場合、検索と置換の操作により、ストレートクォートがスマートクォートに変更されます。

このアプローチは、マクロがドキュメントに大量のテキストを挿入した場合の方法です。テキストの小さなチャンクを挿入している場合は、マクロが最初にスマートクォート用の正しいASCIIコードを挿入していることを確認する方が簡単です。通常の引用符のASCIIコードは34ですが、スマートな開始引用符のコードは147で、終了引用符のコードは148です。アポストロフィに使用されるコードにも同様の違いがあります。 Chr関数を使用して適切な文字を挿入すると、必要な引用符が常に表示されます。

これを行う1つの方法は、マクロの先頭近くで次のようなコードを使用することです。

If Options.AutoFormatAsYouTypeReplaceQuotes = True Then     sAposOpen = Chr(145)

sAposClose = Chr(146)

sQuoteOpen = Chr(147)

sQuoteClose = Chr(148)

Else     sAposOpen = Chr(39)

sAposClose = Chr(39)

sQuoteOpen = Chr(34)

sQuoteClose = Chr(34)

End If

このコードは、スマートクォートに対して[入力時にオートフォーマット]設定がオンになっているかどうかを確認します。そうである場合、4つの変数はスマートクォート用の適切なASCIIコードに設定されます。オンになっていない場合、変数はストレートクォートの適切なコードに設定されます。その後、テキストをアセンブルして挿入するときに、これらの変数をマクロで使用できます。

たとえば、「兄の家は通りにあります」というテキストを挿入する場合は、次のように挿入できます。

sMyString = "my brother" & sAposClose & "s house is down the street"

Selection.InsertAfter " " & sMyString

このアプローチが面倒だと思う場合(この方法で文字列を分割する)、もう1つのオプションがあります。文字列を一度に適切に置換する独自の関数を作成できます。

次のマクロのペアはうまく機能します:

Function RepQuotes(sRaw As String) As String     Dim sTemp As String     Dim sAposOpen As String     Dim sAposClose As String     Dim sQuoteOpen As String     Dim sQuoteClose As String

If Options.AutoFormatAsYouTypeReplaceQuotes = True Then         sAposOpen = Chr(145)

sAposClose = Chr(146)

sQuoteOpen = Chr(147)

sQuoteClose = Chr(148)

Else         sAposOpen = Chr(39)

sAposClose = Chr(39)

sQuoteOpen = Chr(34)

sQuoteClose = Chr(34)

End If

sTemp = RepText(sRaw, " " & Chr(39), sAposOpen)

sTemp = RepText(sTemp, Chr(39), sAposClose)

sTemp = RepText(sTemp, " " & Chr(34), sQuoteOpen)

sTemp = RepText(sTemp, Chr(34), sQuoteClose)

RepQuotes = sTemp End Function
Function RepText(sIn As String, sFind As String, sRep As String) As String     Dim x As Integer

x = InStr(sIn, sFind)

y = 1     While x > 0         sIn = Left(sIn, x - 1) & sRep & Mid(sIn, x + Len(sFind))

y = x + Len(sRep)

x = InStr(y, sIn, sFind)

Wend     RepText = sIn End Function

通常どおりテキスト文字列を作成し、RepQuotesマクロに渡します。マクロは、使用する適切な引用符を決定してから、変換を実行します。引用符の前にスペースがあるかどうかによって、引用符がテキストの開始引用符であるか終了引用符であるかを判別します。ある場合は、冒頭の引用と見なされます。そうでない場合、それは締めくくりの引用です。

注:

このページ(または_WordTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_WordTips_は、費用効果の高いMicrosoftWordトレーニングのソースです。

(Microsoft Wordは、世界で最も人気のあるワードプロセッシングソフトウェアです。)このヒント(3363)は、Microsoft Word 97、2000、2002、および2003に適用されます。Wordのリボンインターフェイス(Word 2007)用のこのヒントのバージョンを見つけることができます。以降)ここ: