[[20201026212646]] 『VBAでエクセルからワードへの文字置換』(World) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでエクセルからワードへの文字置換』(World)

ワードにあるフォーマットを崩さずにエクセルの表にある住所や名前をVBAでワードのテンプレートに置換する方法を知りたいです。

入力した文字の列は決まっておらず、住所はB2、名前はC5にあります。
また、D5に1から始まっている会員番号が入っている場合は指定文書を追加する必要があります。

色々試しているのですが、行き詰ってしまいました。

分かる方がいましたら宜しくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


>色々試しているのですが、行き詰ってしまいました。

試したコードを提示してください。
それを実行した結果はどうなるのか。
期待する結果も、説明してください。
具体例をあげてもらえると、理解しやすいです。

>フォーマットを崩さずに

これでは、あいまいすぎます。

(マナ) 2020/10/26(月) 22:04


あまり知識がないのに会社でアサインされてしまったので、見よう見まねなコードでお恥ずかしいのですが、こちらが書いてみたものです。

Public Sub PasteTableToWord()

    'Word Appを開く
    Dim objWord As WORD.Application
    Set objWord = New WORD.Application
    objWord.Visible = True

    'テンプレートのワードファイルのPathを指定
    Dim docPath As String
    docPath = "C:\Users\AQ-PC-05\Desktop\sample.docx"

    '指定したPathのワードファイルを開く(編集可能)
    Dim objDoc As WORD.Document
    Set objDoc = objWord.Documents.Open(docPath)

    'カーソルを冒頭に移動
    objWord.Selection.Start = 0
    objWord.Selection.End = 0

    'ワードで文字列を検索し選択
    objWord.Selection.Find.Text = "住所"
    objWord.Selection.Find.Execute

    '選択箇所を取得
    Dim startIndex As Long
    Dim endIndex As Long
    startIndex = objWord.Selection.Start
    endIndex = objWord.Selection.End

    'エクセルファイルを選択
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    'コピペ
    Call ws.Range("B2").Copy
    Call objDoc.Range(startIndex, endIndex).Paste

    'カーソルを5行目に移動
    objWord.Selection.Start = 5
    objWord.Selection.End = 5

    'ワードで文字列を検索し選択
    objWord.Selection.Find.Text = "会員番号"
    objWord.Selection.Find.Execute

    'エクセルファイルを選択
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    'コピペ
    Call ws.Range("B4").Copy
    Call objDoc.Range(startIndex, endIndex).Paste

    'カーソルを6行目に移動
    objWord.Selection.Start = 6
    objWord.Selection.End = 6

    'ワードで文字列を検索し選択
    objWord.Selection.Find.Text = "名前"
    objWord.Selection.Find.Execute

    'エクセルファイルを選択
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    'コピペ
    Call ws.Range("B3").Copy
    Call objDoc.Range(startIndex, endIndex).Paste

End Sub

名前が1行目、会員番号が2行目、住所が3列目になります。
会員番号を5行目、名前を6行目、住所が1〜4列目にしたいです。

D5にある会員番号が1から始まる場合、指定の文書をワードの10行目にコピペするというのはまだ試しておりません。。。

フォーマットはフォントやインデントをテンプレートのままにしたいです。
(World) 2020/10/26(月) 22:23


 フォーマットといっているのが書式のことであれば、
 以前作成したマクロでは、あらかじめワードのテンプレートに置換対象文字列を設定しておいて
 こんな関数で処理してました。
 Section やページ処理などは実際にお使いのテンプレートに併せて調整してください。

 足すのは面倒ですが、削除は簡単なのであらかじめ必要な項目をテンプレートに記載しておいて、
 最後に不要だったら削除してはどうでしょうか。

 もうご覧になってるかもしれませんが、こちらのサイトが参考になりました。
https://www.wordvbalab.com/page-1337/

 '//-----------------------------------------------------------------------------
 Public Function ReplaceWord(dstDoc As Document, dstPage, keyWord, newWord ) As Boolean
 '//-----------------------------------------------------------------------------
    ReplaceWord = False

    dstDoc.Range(0, 0).Select
    wd.Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=dstPage

    wd.Selection.Find.ClearFormatting
    wd.Selection.Find.Replacement.ClearFormatting
    With wd.Selection.Find
        .Text = keyWord
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
        .Execute Replace:=wdReplaceAll, ReplaceWith:=newWord
    End With
 End Function
(QS) 2020/10/26(月) 22:27

 入れ違いでしたが、
 > 'コピペ
 >   Call ws.Range("B2").Copy
 >   Call objDoc.Range(startIndex, endIndex).Paste
 だとEXCEL の書式がそのままになりそうですね。
(QS) 2020/10/26(月) 22:29

>名前が1行目、会員番号が2行目、住所が3列目になります。

↓これが期待する結果なのに、現状は↑こうなってしまうという意味でしょうか。

>会員番号を5行目、名前を6行目、住所が1〜4列目にしたいです。

行とか列の意味が、わかりません。

(マナ) 2020/10/26(月) 22:54


あ、すみません。行と列がごちゃごちゃに。。。
ペースト先のワードの
1行目〜4行目に住所、5行目に会員番号、6行目に名前を入れたいんですが、
名前が1行目、会員番号が2行目、住所が3行目になります。

わかりにくくて申し訳ないです。
(World) 2020/10/26(月) 23:31


https://www.wordvbalab.com/page-1337/
こちらも参考にしました!
ありがとうございますmm
(World) 2020/10/26(月) 23:42

>1行目〜4行目に住所

なぜ、複数行なのですか。
B2セルは、セル内改行で、4行あるということですか。

(マナ) 2020/10/26(月) 23:48


もう寝ますので、結論だけ。

ワードの、転記先に、ブックマークを挿入しておくとよいです。
例えば、ブックマーク名を、住所、名前とすると
こんなマクロで転記できます。

 objDoc.Bookmarks("住所").Range.Text = ws.Range("B2").Value
 objDoc.Bookmarks("名前").Range.Text = ws.Range("B3").Value

(マナ) 2020/10/27(火) 00:10


ありがとうございます!
明日、試してみます。
(World) 2020/10/27(火) 00:59

ブックマーク挿入でできました!
ただ、ある数字から始まる人にだけ表示したいメッセージの部分でまたつまづいてしまいました。

Set objRange = objDoc.Paragraphs(10).Range

    objRange.MoveEnd wdCharacter, -1
      If .Range("D5").Text Like "25*" Then
      objRange.Text = "表示したいメッセージ"
      End If
Set objRange = Nothing

これでやっても、15から始まる人にも35から始まる人にも全員にメッセージが表示されております。。。

(World) 2020/10/27(火) 19:36


回答者へのご参考。
https://www.moug.net/faq/viewtopic.php?t=79937

(マルチポスト) 2020/10/27(火) 19:47


解決していないのなら、なぜ閉じたのでしょうか???
そのまま続ければよかたったのに…

1)会員番号は、最初に提示されたコードをみると、B4ではないのですか?
2)前回の結果がクリアされていないだけといううことはありませんか。
3)どうせなら、10行目にも、ブックマーク挿入すればよいと思いませんか。
4)フィールドコードを設定すれば、マクロでなくても表示可能かもしれません。

(マナ) 2020/10/27(火) 20:07


モーグでも指摘されていますが、
エクセル側を、1行1レコード形式で入力するようにすれば
差し込み印刷のほうが便利ですよ。マクロも必要ないし。

(マナ) 2020/10/27(火) 20:22


マナさん
御返事ありがとうございます。
聞きすぎて申し訳なくなってしまって閉じてしまいました。
続ければよかったです、申し訳ないです。

差し込み印刷は掛け合ってみたのですがやはりダメでした。
なぜかはわからないですがvbaにこだわってます。

フィールドコード調べてみます。
ありがとうございます。
(World) 2020/10/27(火) 20:31


今回は、マクロを使用するのだから
フィールドコードは忘れてください。

>続ければよかったです、

閉じてしまったけど、やっぱり、未解決でしたと謝って、
モーグで続けてはどうでしょうか。
こちらで、勝手に、修正はしたくないので。

(マナ) 2020/10/27(火) 20:54


>続ければよかったです
しばらく投稿してないので、違っていたらごめんなさいですが、mougの仕組みだと、最終投稿のみ削除が出来るので、クローズ処理した投稿を削除すれば再開できたとおもいます。

ただし、削除された投稿を後からみることができないので、トライするなら削除前にメモ帳などにコピーしておいたほうがよいとおもいます。

(もこな2) 2020/10/28(水) 09:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.