Excelは当然、行列指向だけど、Wordは改行指向みたい。
値を入れたい場所を指定するにはparagraphを指定してやらないといけない。
Excelでまとめたデータでdocファイルのテンプレートからファイルを作成、みたいなことをやる必要があったので、Word VBAでやってみた。始めはC#とかでやってみようかと思ったけど、Visual C# 2005 Express EditionでHello Worldすら動かなかった><
もっとマイクロソフトさまと仲良くなりたいのに><!
最終的に書いたスクリプトはだいたいこんな感じ。
Sub setValuesFromXls() Const kana = 5 Const birthDay = 7 Const name = 11 Const address = 17 Dim doc As Document Set doc = ActiveDocument Set excel_obj = CreateObject("Excel.Application") Set Book = excel_obj.Workbooks.Open("C:\db.xls") Set Sheet = Book.Worksheets(1) For i = 2 To 3 Step 1 doc.Paragraphs(kana).Range.Text = Sheet.Range("B" & i).Value doc.Paragraphs(birthDay).Range.Text = Sheet.Range("D" & i).Value doc.Paragraphs(name).Range.Text = Sheet.Range("C" & i).Value doc.Paragraphs(address).Range.Text = Sheet.Range("E" & i).Value ChangeFileOpenDirectory "C:\" ActiveDocument.SaveAs FileName:=Sheet.Range("A" & i).Value & ".doc", FileFormat:=wdFormatDocument, _ LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _ :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ False Next i Set excel_obj = Nothing End Sub
現在のカーソル位置のパラグラフを取得する
改行指向っぽいので値を入れたい場所のパラグラフが知りたいけど、ステータスバーとかに表示する方法がわからなかったので、非常に難儀。でも、検索したら、こんな感じのファンクションが見つかったのでパクらせてもらいました。
翻訳支援ソフトの製作18 - 訳文流用: 翻訳雑学考
Sub displayCurrentParagraph() MsgBox (ActiveDocument.Range(0, Selection.End).Paragraphs.Count + 1) End Sub
これでカーソルの現在位置のパラグラフがメッセージボックスで表示される。
でも、Word2002だとマクロをショートカットキー登録できないのかな。しんどい。
WordマクロからExcelファイルを扱う
WSHとかから扱うときも同じやり方でいけるみたい。ADOとかを扱う場合と同じですね。
Set excel_obj = CreateObject("Excel.Application") Set Book = excel_obj.Workbooks.Open("C:\db.xls") Set Sheet = Book.Worksheets(1) MsgBox Sheet.Range("A1").Value Set excel_obj = Nothing
最後に開放してあげないとプロセスが残るそうです。