Excel (VBA)

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

 
(Windows 10全般 : Excel 2016)
EXCEL VBAでWORD文書に表を作成したい
投稿日時: 23/01/25 11:39:13
投稿者: イケ

お世話になります。
 
ExcelのVBAで、WORD文書に表を作成する方法が分かれば、ご教示ください。
 
複数パターンの長文の文章を人によって出し分けて、WORDに貼り付けてPDF化して保存する
・・・というPGMを作りたいと思っています。
 
----<やりたいことの概要>-----
 
@エクセルで対象者リストと、シートごとに分けた文章を複数種類用意しておく。
 ※文章には文字色やセルの色の設定などもしています。
 ※対象者1人につき、複数の文章を上から順に貼り付けていきます。
 
A対象者が変わるごとにWORD文書を新規作成。
 
B対象者ごとに、指定したシートから文章を「列」単位でコピー。
 WORD文書に1×1の表を作成してそこに貼り付け。ページ区切りをする。
 これを繰り返す。
 ※@の文章をWORDに貼り付ける際、文字色等を引き継ぐため、テキスト貼り付けで
  はなく、WORDに1×1の表を作成し、その表の中にエクセルの列をそのまま貼り付ける
  という方法を考えました。(苦肉の策です・・・)
 
Cすべての文章を貼り付け終わったら、対象者の名前を置き換えて、PDFで保存。
 
-------------------------------
エクセルVBAは、記録マクロを修正したり、コードを見よう見まねでネットで探してきて
つぎはぎしながら四苦八苦して作るレベルです・・・。
現在、上記Bの「WORD文書に1×1の表を作成する」でつまづいております。
(「実行時エラー13:型が一致しません」を解決できないでいます。) 
 
ボロボロで恥ずかしいですが、以下、現在書いているコードです。
 
Sub メッセージファイル作成()
 
'変数定義
Dim waitTime As Variant
 
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
★つまづき箇所★このWordTblの型をTableにしてみたり、Word.Tableにしてみています・・・
Dim WordTbl As Word.Range   
 
Dim l, lRow, lCol, C As Long
Dim PetName, Years, shtname, pdfileName, path, pdfilepath As String
 
Dim ws1, sht As Worksheet
 
'wordを起動する
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = T
 
'起動を待つ間、PGMを3秒止める
waitTime = Now + TimeValue("0:00:03")
Application.Wait waitTimerue
 
'エクセルシートの設定
Set ws1 = Worksheets("★一覧シート★") 
 
'エクセルシートのデータ数を把握
ws1.Select
lRow = Cells(Rows.Count, "A").End(xlUp).Row
 
'対象者人数分、WORD⇒PDF作成を繰り返す  
   For l = 3 To lRow 'A列の最終行分繰り返す。
    
     With WordApp
       .Documents.Add 'Word文書を新規作成
       Set WordDoc = WordApp.ActiveDocument
     End With
 
'対象者ごとに必要な文章の数分、wordへの貼り付けを繰り返す
    lCol = Cells(l, "J").Value +11
       
      For C = 11 To lCol      
      shtname = ws1.Cells(l, C).Value 'シート名を取得
   Set sht = Worksheets(shtname)
 
   sht.Select
   sht.Column("A").Copy '文章シートのA列をコピー
 
★以下、つまづき箇所★ここから先に進めていません。
  'WORD文書に表を作成する
 
  With GetObject(Class:="Word.Application")
  Set WordTbl = WordDoc.Tables.Add(Range:=Selection, NumRows:=1, NumColumns:=1)
 
    With WordTbl
       Selection.PasteAsNestedTable '表の中にエクセル表を貼り付け
       ActiveDocument.Bookmarks("EndOfDoc").Select 'Wordの末尾を選択
       Selection.InsertBreak Type:=wdPageBreak 'ページ区切りを挿入
    End With
 
    End With
    Next C    
 
   ・・・・・・以下省略・・・・・・・   
    

回答
投稿日時: 23/01/25 11:57:33
投稿者: simple

>sht.Column("A").Copy
ここしか見ていませんが、100万を超える行が必要なんですか?

投稿日時: 23/01/25 12:56:19
投稿者: イケ

simple さんの引用:
>sht.Column("A").Copy
ここしか見ていませんが、100万を超える行が必要なんですか?

 
simple様
 
いえ、必要な行だけで良いのですが、実際にエクセルシートの「A列」をコピーし、
WORDの1×1の表に貼り付けてみたところ、文章が入っているところまでが綺麗に
貼り付きましたので、このように書いてみました。
本来は最終行を把握して、入力範囲だけをコピーすべきなのでしょうが・・・
 

回答
投稿日時: 23/01/25 13:33:51
投稿者: sk

引用:
@エクセルで対象者リストと、シートごとに分けた文章を複数種類用意しておく。
 ※文章には文字色やセルの色の設定などもしています。
 ※対象者1人につき、複数の文章を上から順に貼り付けていきます。

まずそれらのワークシートのそれぞれのレイアウトについて
より詳細かつ正確に明記されることをお奨めします。

回答
投稿日時: 23/01/25 14:03:14
投稿者: Suzu

つまづいている
 
Excel のセルをコピーし、Wordドキュメント に 色付きで貼り付けたい。(貼り付け後、表構造でも 良い)
 
については
1. Excelのセル範囲を指定し、コピー
2. Word の PasteExcelTable で、表として貼り付けで良いかと。
 
ついでに、
Word 新規ドキュメント作成し、オブジェクト変数へ入れる
文書の最終位置に改ページを入れる
について、VBA らしく してみました。 参考にどうぞ。
 

Sub Sample()
  Dim wst   As Excel.Worksheet
  Dim WdApp As Word.Application
  Dim WdDoc As Word.Document

  Set wst = ThisWorkbook.Worksheets("Sheet1")
  Set WdApp = CreateObject("Word.Application")
  WdApp.Visible = True

  '新規ワードドキュメント作成
  Set WdDoc = WdApp.Documents.Add

  'A1 から、A列 最終位置までコピー
  wst.Range(wst.Cells(1, 1), wst.Cells(wst.Cells.Rows.Count, 1).End(xlUp)).Copy

  'Word貼り付け
  WdDoc.Range.PasteExcelTable False, False, False

  'ドキュメント最終位置に、改ページ挿入
  WdDoc.Bookmarks("\EndOfDoc").Range.InsertBreak wdPageBreak
End Sub

回答
投稿日時: 23/01/25 14:12:50
投稿者: simple

単にSelectionと書くと、Excelにもそれがありますから、
きちんと区別する必要があるのでは?
WordApp.Selectionとする必要があるのでは?
詳細見る時間がないので、とりあえずここまで。(外出しますので少しの間アクセスできません)
 
ちなみに、
Dim l, lRow, lCol, C As Long
と書くとLongなのはCだけです。
それぞれに対して As Long とする必要があります。

投稿日時: 23/01/25 14:28:29
投稿者: イケ

Suzu様
 
ありがとうございます!!!
 
ご教示いただいたように記載しましたら、エクセルシートの色やフォントを
維持したまま、WORDに貼り付きました。さらに改ページまできれいに入り感動です!!
 
残っている問題は、WORD上で貼り付けたエクセルの右端が切れてしまうことです。
(これを防ぐために、WORDの表に入れたいと思っていました・・・。なぜ表に
 入れると左右綺麗に収まるのかよくわかっていないのですが・・・。 )
 
しかし、まずはWORDにエクセルを貼り付けるところまで行かれたことが、自分に
とっては大進歩です。ご教示いただいたソースを参考に、さらに検討してみます。
お助けいただき本当に、感謝いたします!!
 

投稿日時: 23/01/25 14:30:49
投稿者: イケ

simple さんの引用:
単にSelectionと書くと、Excelにもそれがありますから、
きちんと区別する必要があるのでは?
WordApp.Selectionとする必要があるのでは?
詳細見る時間がないので、とりあえずここまで。(外出しますので少しの間アクセスできません)
 
ちなみに、
Dim l, lRow, lCol, C As Long
と書くとLongなのはCだけです。
それぞれに対して As Long とする必要があります。

 
 
simple様
 
アドバイスありがとうございます!
基礎がなっておらず、お恥ずかしい限りです・・・ご指摘大変助かります。
修正していきます。

投稿日時: 23/01/25 14:37:34
投稿者: イケ

sk さんの引用:
引用:
@エクセルで対象者リストと、シートごとに分けた文章を複数種類用意しておく。
 ※文章には文字色やセルの色の設定などもしています。
 ※対象者1人につき、複数の文章を上から順に貼り付けていきます。

まずそれらのワークシートのそれぞれのレイアウトについて
より詳細かつ正確に明記されることをお奨めします。

 
sk様
 
詳細ご説明できておらず失礼しました。
以下のような感じです。
 
・対象者リスト
  A列:連番  
  B列:対象者名  
  D列:保存するファイル名
  J列:対象文章の数
  K列〜:文章シート名・・・複数あり
 
・文章シート(複数あり)
  A列:送りたい文章(10行〜100行程度まちまち)     

投稿日時: 23/01/25 14:55:50
投稿者: イケ

Suzu様にご教示いただきましたPasteExcelTableで、リッチテキスト貼り付けにしたところ
横幅も綺麗に収まりました!
 
 
>'Word貼り付け
> WdDoc.Range.PasteExcelTable False, False, True
 
 
Suzu様、皆様、貴重なアドバイスを本当にありがとうございました!
おかげさまで、難関を1つ乗り越えられました・・・。
 
引き続き、この先を作っていってみます。