2025年4月24日木曜日

オフィスのアプリ連係で、エクセルからワードへデータを渡すマクロを書いてみたのでござる ー Shape.Type / msoTextBox(VBAマクロ)

    
もうすぐリタイアですが、保証書を作成するマクロを依頼されてしまいました。
メーカーなので、出荷製品には保証書が添付されますが、未だにカーボン複写。

ドットインパクトプリンターで、三枚組みの正、副、写を印刷する古風さです。
このハードのプリンターもやがてはなくなってしまいそうで、代わりが必要だ。

まあ、PCからワードのようなアプリで、プリンター印刷するのは容易な代替策。
保障の各々には、括弧下記で、正、副、写として三枚印刷すれば代替も可能だ。

これまでのERPシステムでは、カスタムの印刷プログラムが組まれていました。
ところが、人材が払底しているのか、修正が必要でもプログラマーがいないな。

こういうお寒い状況の打破には、VBAのマクロで印刷プログラムを工夫します。
一方、製品・出荷データなどはSQLからcsvファイルをダウンロードできるのよ。

だから、後はエクセルでファイルを読んで、ワードの起動からデータ転写だな。
これをVBAのマクロで組んでみたのですが、引っかかったのは変数の設定です。

引用した”Word.Application”の変数宣言が認識されず、”Object”に切り替えだ。
しかも、ワードにあるテキストボックスが、どんなシェイプで識別されるのか。

しかも、ワードでコピペしたテキストボックスは、識別名が同じで変える必要。
まあ、セルの値をワードで配置した各テキストボックスに流し込んでいきます。

というわけで、サンプル構文を下記のように上げますので、参考にして下さい。
オフィスのアプリと言っても、VBAの引用例が豊富なのはエクセルが当然ですから、エクセルからワードを操作するのがまず無難だと思ったのでした。
     
'EXCEL VBAから既存のWordファイルを起動して、EXCELのセルデータを既存Wordのテキストボックスに書き込む。
Public Sub WordTextShape_inText()
Dim objWord As Object 'Wordのアプリケーション
  Dim objDoc As Object
    Dim shp As Variant, i As Integer
      Dim Txbox_name As String, inText As String

Set objWord = CreateObject("Word.Application")
  objWord.Visible = True
Set objDoc = objWord.Documents.Open("C:\Users\P2025\Desktop\文書1.docx")
'この場合、本人のPCデスクトップのファイルを参照しています

For i = 1 To 3  'セルからの読込例で、セルを三個とする繰り返し処理
  Txbox_name = "TextBox" & i 'シェイプ名は、”TextBox1、2,3”
   'ワードのテキストボックス名を簡単に識別できるようする
  inText = ThisWorkbook.ActiveSheet.Range("A" & i).Text
  'セル値を繰り返し処理で読み出す
  
  For Each shp In objDoc.Shapes
  '繰り返し処理で、テキストボックスのシェイプを識別させて値を書き込む
    If shp.Type = msoTextBox Then
   'if二重構文、テキストボックスで該当するシェイプ名ならセル値書き込み
      If shp.Name = Txbox_name And Right(Txbox_name, 1) = i Then
        shp.TextFrame.TextRange.Text = inText
      End If
    End If
  Next shp

Next i

'Wordドキュメントを閉じる、ここはREM文にしてある
' objDoc.Close
'Wordを閉じる
' objWord.Quit
End Sub

注:この原稿は、リタイア前に会社でこっそり書いたものだよ。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿