- ベストアンサー
Word2013 特定文字内の文字を消すマクロは
Word2013です。 テキストボックス内で宛名シールを作って印刷しています。 株式会社 ○○○○○ ▲▲御中 株式会社と御中内の○○○○○▲▲を消す方法は、マクロで出来ますか? ○○○○○▲▲の文字はその都度変わりますが、株式会社と御中は固定です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。補足で指摘がありましたことについて。 ーー 質問に出会う数日前に、WordVBAで語句Xと語句Yの間の文字列を捉える方法で、苦労してましたので、 一般文書にある文章(文字列)を対象にしてと、頭がそちらへ行ってしまいました。 ーー 質問には、「テキストボックス内で」とありますね。 テキストボックスが出るまでとか、テキストボックスとシール印刷の間の説明をとばしてしまっているね。 しかし「テキストボックスで宛名シールを作る」というのが、方法として、小生には、普通だと思えません。テキストBー>印刷ではなく、テキストBーー>文書?ーー>いんさつとかのプロセスではないの? なにかどういう場面でテキストボックスコントロールらしいものが出てきますか? 例えば (1)宛名ラベルシールを作るソフト(市販やフリーなど)の途中で、テクストボックスが出てきて、それに関する質問なら、作者に聞かないと、どうしようもない、と思う。選択メニューに(一部消すが)なければ他人には手出しができない。操作途中ならDELETEで消えるはず。 (2)自作やベテランで、ワードの表のマス目1つがシーる1枚のようなソフトを作っているなら、 まだ議論は出きるかも。 (3)ユーザーフォームにテキストボックスをつくっているなら議論は出きるかも (4)ワードにはコンテンツコントロールと言うテキストボックスもある。 (5)文書に直接テキストボックスも作れるかも (6)シールの作成などでは、ワードの差し込み印刷お機能がよくつかわれる。 質問者の、説明が、中途半端で(1)ー(6)のどれなのか、それ以外か、よくわからない。 (3)ー(6)など質について、問者は、あに方法か、とわかるのかな? ラべルシール印刷は、位置合わせという問題があるので、相当プロ級ベテランでないと手を出さないはず。 === 私も勉強途中だし、即、答えられるのではないし、何にしてもOKWAVEの今日の様子(回答者のレベルの想像)では、回答は出にくいと思うが、待ってみますか?土日曜日挟みではあるが、2-3日が勝負で、それを過ぎると、回答はまず出ないかも。
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
word VBAを使いこなせる人は少ないようです。市販解説本も2-3冊で、また(テーマを指定して、ぴったりの)WEB記事も見つけにくい。(特にOKWAVEのこのカテの質問読者に限れば)出来る人は少ないと予想するので。) エクセルVBAができるからと言って、類推しては、えらい目にあう(すぐ行き詰まる)だろう。 WordVBAの文書の構成の理解の仕組についての理解も解説を探すのも一苦労。 小数箇所なら、とりあえず、手作業でやることを勧めます。常識的には、仕事人には、時間の無駄です。 ーーー 私はword VBA初心者ですが、下記を書いてみました。泥臭い初歩的ロジックです(なぜそうなるのか、本回答最後の辺の記事を参照)が。 データの有り様によっては、うまく行かない場合はあるでしょう。でも参考に。 ーー 文書の標準モジュールに(エクセルではないよ) Sub 開始位置と終了位置を取得() Selection.Find.ClearFormatting 'GoTo p2 Dim Target As String Dim Myrange As Range Dim GetStart1 As Long Dim GetEnd1 As Long '----株式会社 Set Myrange = ActiveDocument.Range(0, 0) Target = "株式会社" With Myrange.Find .Text = Target '検索実行 Do While .Execute '検索文字の開始位置と終了位置を取得 If .Found = True Then GetStart1 = Myrange.Start GetEnd1 = Myrange.End End If MsgBox "開始位置:" & GetStart1 & vbCrLf & "終了位置:" & GetEnd1 Loop End With p2: MsgBox "AAAA" '----御中 Dim GetStart2 As Long Dim GetEnd2 As Long Set Myrange2 = ActiveDocument.Range(0, 0) Myrange2.Find.ClearFormatting Target = "御中" With Myrange2.Find .Text = Target '検索実行 Do While .Execute '検索文字の開始位置と終了位置を取得 If .Found = True Then GetStart2 = Myrange2.Start GetEnd2 = Myrange2.End MsgBox "開始位置:" & GetStart2 & vbCrLf & "終了位置:" & GetEnd2 End If Loop '======= ActiveDocument.Range(GetStart1 + 4, GetEnd2 - 2).Select Selection.TypeText Space(15) End With End Sub ーー 納得の段階が過ぎたらMsgboxの全行は削除してください。 テストデータはワード文書に ーー お願い 株式会社 西武振興産業 総務部 御中 いつもお世話になっており有難く存じておりま す さて, 先日お送りしました・・ ーー のようなものを作ってテストしました。 === 先日ふと、似た別件ですが、正規表現で、「( と )に囲まれた文字列を抽出する」というパターンをWEBで調べましたが、見つかりましたが、非常に理解がむつかしい。 https://docs.microsoft.com/ja-jp/visualstudio/ide/using-regular-expressions-in-visual-studio?view=vs-2019 == 構造的に、こういうパターンの課題に適したツールを、VBAは、備えてないと思いました。
補足
ありがとうございました。 msgのおかげで、どの位置を実行しているのか一目でわかりました。 マクロでは、テキストボックス内に文字が入っていると、有効な範囲を超えており、 ActiveDocument.Range(GetStart1 + 4, GetEnd2 - 2).Select で止まりました。 文書内に文字が入っているのと、テキストボックス内では扱いが違うのでしょうか? 解読して編集してみます。 ありがとうございました。
お礼
何度も回答ありがとうございました。 テキストボックスにこだわっていましたが、仰る通り、文書内にそのまま書く方が自然ですね。 文書内に直接書けば、頂いたマクロを活用できましたので、文書を変更しました。