Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11全般 : Microsoft 365)
ExcelVBAを使用してExcelデータをword文書に転記するマクロ作成について
投稿日時: 23/02/01 14:34:55
投稿者: marrk

Excel表データをword文書に転記するマクロ作成で困っています。
paragraphsオブジェクト、insertbeforeメソッドを利用して行の初めにExcelデータの転記は可能なのですが、行の途中(行の真ん中など)を指定してそこから転記する方法がわかりません。どなたかわかる人いらっしゃるでしょうか。paragraphs(2).range(start:=4,end:=4).insertbefore cell(1,3).value というような感じで記述したのですが、エラーがで出てこの構文では無理でした。これは2行目の四文字目からエクセルの値をインサートするという意味でこの構文を書いてみました。こちらの意味になるように正しい構文をかくにはどうすれば良いでしょうか?。ご対応よろしくお願いします。

回答
投稿日時: 23/02/01 16:14:06
投稿者: sk

引用:
paragraphsオブジェクト、insertbeforeメソッドを利用

引用:
2目の四文字目からエクセルの値をインサートする

厳密に言えば Paragraph オブジェクトは「行」ではなく
「段落」を参照するためのオブジェクトなのですが。
( 1 つの段落内の文字列が折り返されて複数の行に渡る場合もある)
 
( Word ドキュメントの標準モジュール)
---------------------------------------------------------------
Sub Test1()
 
    Dim docTarget As Word.Document
    Dim paraTarget As Word.Paragraph
    Dim rngTarget As Word.Range
     
    'アクティブなドキュメントを参照
    Set docTarget = ActiveDocument
     
    'ドキュメント内の段落の数が 2 未満である場合
    If docTarget.Paragraphs.Count < 2 Then
        Set docTarget = Nothing
        'プロシージャを抜ける
        Exit Sub
    End If
     
    '2つめの段落を参照
    Set paraTarget = docTarget.Paragraphs(2)
     
    '段落内のテキストの文字数(段落記号を含む)が 4 未満である場合
    If paraTarget.Range.Characters.Count < 4 Then
        Set paraTarget = Nothing
        Set docTarget = Nothing
        'プロシージャを抜ける
        Exit Sub
    End If
     
    '段落の4文字目を範囲として参照
    Set rngTarget = paraTarget.Range.Characters(4)
     
    '範囲の前に文字列"test"を挿入
    rngTarget.InsertBefore "test"
     
    Set rngTarget = Nothing
    Set paraTarget = Nothing
    Set rngTarget = Nothing
     
End Sub
---------------------------------------------------------------
 
例えば以上のようなコードを実行したい、ということでしょうか。

回答
投稿日時: 23/02/01 16:48:37
投稿者: Suzu

【VBA】WORD文書の範囲を指定して操作する (Rangeオブジェクト)
https://qiita.com/t-yama-3/items/89300fbab045738b604e
 
 
 

引用:
このコードでは、.Rangeの記述により、ParagraphオブジェクトのRangeプロパティを使用して、指定段落のRangeオブジェクトを取得しています。
そして、RangeオブジェクトのHighlightColorIndexプロパティを使用して、マーキング処理を実行しているということになります。
 
なお、2段落目のうち、2文字目と3文字目だけをマーキングするために、.Range(1, 3)と記述しても動作しませんのでご注意ください。
このRangeメソッドは、RangeオブジェクトではなくDocumentオブジェクトにおいて定義されているためです(公式ドキュメントのRangeメソッドを参照)。

 
 
Paragraph オブジェクトの Ramge
Document の Range
文字数を指定できるのは、後者のRange であり、前者のは引数を取れないのでエラーとなります。
 
なので、
 
Document.Range(Document.Paragraphs(2).Range.Start + 4).InsertBefore "挿入文字"
 
の様に、
Document.Range に、Paragraph の RangeのStart +4 を指定し、
2行目 の開始文字数 + 4文字目 の様な指定を行います。

投稿日時: 23/02/09 10:47:24
投稿者: marrk

解決しました!ありがとうございます。