質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Q&A

解決済

3回答

1702閲覧

Word VBAにて特定の文脈で出て来る英文字を斜字にする方法を知りたい

takutoaffiblog

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

0グッド

0クリップ

投稿2018/01/31 05:20

編集2018/01/31 07:18

前提・実現したいこと

Microsoft Wordのマクロ(VBA)にて、特定のタイミングで出て来る英文字を斜字にしたい。

具体的には、当方は大学で心理学を学んでいるのだが、実験や調査レポートにて、統計量の英文字(p値やt値、SDなど。)を記述する際には、イタリックにせねばならないのですが、その斜字にする処理を自動化したいのです。

ただ、単純に、

Sub AutoItalic() With Selection.Find .Text = "p" Do While .Execute Selection.ItalicRun Loop End With End Sub

という風に記述しても、引用文献などでpを含む人名なども勝手に斜字になってしまいます。

レポートにて統計量を報告しするときには、以下のような書き方をすることが多いです。

2群の平均値の間には統計的に有意な差があった(t(12)=3.3, p<.05)。

なので、統計量を表す英文字が出て来るタイミングを指定して検索させるために、以下のようなコードを書いてみました。

Sub AutoItalic() With Selection.Find .Text = "p<" Do While .Execute Selection.Find .Text = "p"     Loop End With End Sub

しかし、

発生している問題・エラーメッセージ

コンパイル エラーです。: プロパティの使い方が正しくありません。

と出てしまい、ループをできません。

質問内容

上記のような、条件(特定の文脈)を指定して検索をさせ、その後ItalicRunの処理をする方法を知りたいです。当方、プログラミング自体初心者なので、あまりよくわかっていませんが、よろしくお願いします。
p値に関してだけでも、サンプルコードを教えていただけたら、その処理をtや他の統計報告量でも同様に処理したいと考えております。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

単語で検索

今回、探したいのは単語としてのptだと思います。
この場合、Word検索の「ワイルドカード」が利用できます。

ワイルドカード指定では、<は単語の先頭を意味します。
同様に>は単語の最後を意味します。

単語としてpを探したい場合、ワールドカード指定で<p>を検索すればよいという訳です。

サンプル

Sub sample() Dim r As Range Set r = ActiveDocument.Range With r.Find .MatchWildcards = True 'ワイルドカードを使用する .Text = "<p>" '単語のpを検索 Do While .Execute r.Italic = True '斜体にする Loop End With End Sub

ワイルドカードは他にもいろいろありますので、記憶の片隅にでも入れておくと便利ですよ。
参考⇒教えて!HELPDESK - ワイルドカードを使った検索と置換を極める

投稿2018/02/01 05:11

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーになるのはExecute内でSelection.Findを行っているからです。
Selection.Findは検索で、既に実行済みなので不要です。
変更するのはSelection.Font.Italic = Trueとすれば良いかと。

以下参考に。
Word VBAで選択範囲のフォント設定を変更する方法とそのプロパティまとめ
選択範囲内にある特定のフォントの文字列を別のフォントに置き換えるWordマクロ

投稿2018/01/31 05:59

編集2018/01/31 07:31
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takutoaffiblog

2018/01/31 06:07

そのように、.Italic=TRUEとすると、今度は、人名などでもpという文字に反応して斜字になってしまうので、"p< "の中からさらに、"p"を検索するような方法を知りたいのです…。
ExcelVBAer

2018/01/31 06:11

p< が検索できたのだから、2文字の内の最初の1文字ですよね? ThisDocument.Range(Start, End) の意味が分かりますか?
takutoaffiblog

2018/01/31 06:20

ThisDocument.Range(Start, End) を存じ上げていなかったので、今調べてみました。かなり初心者で申し訳ございません…。 "p<"の中から"p"を抜き出すには、ThisDocument.Range(Start=0, End=1)をどこかに使うのだろう、 というのはなんとなくわかったのですが、どこにThisDocument.Range(Start=0, End=1)を入れたらいいのかわからないです…。
sazi

2018/01/31 06:26

統計資料などはコピペでしょうから、レポート作る時にそんなルールがあると大変ですね。 チェックの意味では良いかもしれませんけど、どのみち検索のルール探ることになるから、 手動でイタリックに変更するのと手間はあんまり変わらない気がしますけどね。
ExcelVBAer

2018/01/31 06:27

初心者には、.Find の処理を理解するのに少し手こずるでしょうね。。。
takutoaffiblog

2018/01/31 06:36

かしこまりました。自分でも何してるかわからなくなりそうですが、今から勉強を深めて処理できるようにするか、もしくは諦めて手動で斜めにするかをしていこうと思います。
guest

0

Word Find Execute で検索
https://www.ka-net.org/blog/?p=1199

投稿2018/01/31 05:51

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takutoaffiblog

2018/01/31 06:12

なるほど、自分で指定した範囲内で、pやtなどを斜字にしてあげたら、人名などがヒットすることがないというわけですか。 その記事を基にその選択範囲内での処理をするコードを書けましたが、当初のような、文書全体にて、特定のタイミングのpなどを処理する方法を知れたら、よりマクロとして楽なのでありがたいです。
ExcelVBAer

2018/01/31 06:39

Dim Rng As Range Set Rng = ThisDocument.Range この Rng で "p<" Find させてみてください。 また、F8のステップ実行を使ってください。
ExcelVBAer

2018/01/31 06:49 編集

With Rng.Find   .Text = " p<"   Do While .Execute   Rng.Select  Loop End With
takutoaffiblog

2018/01/31 07:16 編集

すいません。 Dim Rng As Range Set Rng = ThisDocument.Range With Rng.Find   .Text = " p<"   Do While .Execute   Rng.Select  Loop End With としてみたのですが、p<が検索されませんでした…。不勉強でほとんど理解できていなくてすみません…。
ExcelVBAer

2018/01/31 07:36

ステップ実行をしました?
ExcelVBAer

2018/01/31 07:37

あ、ごめんなさい。 「.Text = " p<"」で " p<" の頭に半角スペースが混じってました(汗)
takutoaffiblog

2018/01/31 08:01

半角を消し、ステップ実行をしてみても、特にWord文書で検索している様子が見られませんでした。
sazi

2018/01/31 08:04

>2群の平均値の間には統計的に有意な差があった(t(12)=3.3, p<.05)。 上記内容のワード文書を作成して行ってますが、selectされますよ。 不要なword文書は閉じて行ってみて下さい。
ExcelVBAer

2018/01/31 08:22

ひょっとして、対象の文書とは別に、ツール用の文書を作成してるのでしょうか? ThisDocument を ActiveDocument に変えてみてください。 そして、対象の文書を選択してから実行してみてください。
ExcelVBAer

2018/01/31 08:23

This と Active(Document) は調べてください。
takutoaffiblog

2018/01/31 09:04

Activeにしたら、できました。 ただ、Rngのなかにp<が入っている感じで、pを選ぶことが上手くできません。 すみません。やはり一から勉強して、もう一度質問し直すかもしれないです。
ExcelVBAer

2018/02/01 01:55 編集

はい、勉強してください。 ただ、Word VBA は情報が少ないので、少しばかり。 Word では、Document.Range([Start:開始位置],[End:終了位置]) という概念が基本となります。 今回であれば、 Rng.Select を、 Dim p As Range Set p = Rng.Document.Range(Rng.Start,Rng.Start+1) とすると、変数p に文言「p」の範囲が取得できます。 後はご自由に。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問