エクセルのVBAは同じOfficeソフトであるWordやOutlookなんかも操作できます。
ちなみにOutlookを操作するVBAの紹介記事はこちらです。
今回はWordの操作の仕方についてです。
どういう場面で使うかというと
エクセルでまとめた注文内容一覧から今月の売上資料を作る
場合なんかですね。
今回のこのVBAを作るきっかけになったご依頼がそうでした。流れを説明すると以下の表のような感じです。
1.お客さんからの注文書がエクセルで大量にある
2.これをVBAを使って注文内容一覧の表にする(フォルダ内のファイルをひとつずつ開いて転記する方法はこちらの記事で紹介しています)
3.商品ごとの1ヶ月の注文数を今月の売上一覧表にまとめる
4.売上個数の結果をワードに転記して社内資料を完成させる
という流れを作りたいとのご依頼でした。
毎月とか毎週とか、同じ資料にいちいちデータをコピペするの面倒ですからね。
自動でエクセルの売上個数を取ってきてくれたらだいぶ助かりますよね。
ちなみに実際のご依頼はコピペする内容がもっと複雑で、手動ではやりたくない感じのものです^^;
実際のコードとしてはこんな感じになります。
Sub CopyToWord()
Dim wordApp As Word.Application
Set wordApp = CreateObject("Word.Application")
'Wordファイルを見えるように
wordApp.Visible = True
Dim wordDoc As Word.Document
'フォルダ内のワードファイルをひとつずつ開く
Dim buf As String
buf = Dir(ThisWorkbook.Path & "\" & "*.docx")
Do While buf <> ""
Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\" & buf)
''''Findオブジェクトの準備
Dim objFind As Word.Find
Set objFind = wordApp.Selection.Find
Dim tmp As String
Dim LastRowNum As Long, i As Long
''''置換を実行する部分
'表の最終行を取得
LastRowNum = Cells(Rows.Count, 1).End(xlUp).Row
'表に対して1行目から順番に転記
For i = 4 To LastRowNum
'置換する対象の文字列
objFind.Text = Cells(i, 1) & "個数"
'置き換え後の文字列
objFind.Replacement.Text = Cells(i, 2)
Call objFind.Execute(Replace:=Word.wdReplaceAll)
objFind.Text = Cells(i, 1) & "前月比"
objFind.Replacement.Text = Cells(i, 3)
Call objFind.Execute(Replace:=Word.wdReplaceAll)
Next i
'ワードファイルを閉じる
wordDoc.Close
wordApp.Visible = False
Set wordApp = Nothing
buf = Dir()
Loop
End Sub
Wordへの文章差し込みなのですが、段落を指定して文字を追加する、というのが基本になります。
ただ、この方法ですと何段落目か数える必要があるので今回のご依頼には不向きかなと思って文字列を置換する方法を提案しました。
こんな感じで「A個数」「A前月比」という文字を表の中に書いておいたテンプレートを用意して、それを毎月コピーして使うというイメージですね。
「A個数」「A前月比」などの文字を探して、その文字を該当するデータと置き換えます。
表の場合はこの方がラクかなと思います。コードを実際に動かしながら説明した動画をYouTubeにも挙げています。文章よりも動画の方が分かりやすいのでぜひ見てみてください。
今回は以上です!この記事がどなたかの参考になれば嬉しいです。
お問い合わせ、お仕事のご依頼などがありましたら下記のお問い合わせフォームからご連絡お願いします。
お問い合わせフォーム
自分で使うVBAの書き方で詰まっている方のお手伝いであれば5,000円ほどから、VBAを一から作成して納品であれば3万円ほどから承ります。
コメント