WordでVBAを使ってみて学んだこと

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

最後に開放してあげないとプロセスが残るそうです。