もうすぐリタイアですが、保証書を作成するマクロを依頼されてしまいました。
メーカーなので、出荷製品には保証書が添付されますが、未だにカーボン複写。
ドットインパクトプリンターで、三枚組みの正、副、写を印刷する古風さです。
このハードのプリンターもやがてはなくなってしまいそうで、代わりが必要だ。
まあ、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 件のコメント:
コメントを投稿