Wordの表から文字列を取り出すFunction

Wordの表の文字列を取得するFunction

Wordの表の文字列を取得する

「書類の電子化」と言いつつ、

単に紙をWordとかにしただけ

という凶悪な職場はいまだに一定の数存在すると思う。

んで、いろんなところからWordドキュメントが集まってくるわけだが、そんなときに困るのが

バラッバラなファイル名

の問題。

一応、「ファイル名はこんなふうにしてくださいねー」とかお願いをするのだけれど、守るかどうかは先方次第なので、それはもうてんでばらばらのカオス状態w

まあ、それでも、Wordの場合は、Excelと違って

自由勝手に行やら列やらを挿入したり削除したりして好き放題にする

という人が少ないので、Word文書の先頭に記名欄を作っておいて、回収したあと記名欄に入力された文字列をファイル名にしてはどうか、と考えたわけですよ。

最近は、極力一つ一つのプロシージャを小さくしようと心がけているので、手始めに

Wordの表の任意のセルから文字列を引っ張ってくるだけ

のFunctionを作ってみた。

コード

リスト1 標準モジュール
Public Function getStringFromCell( _
                  ByVal targetTable As Table, _
                  ByVal targetRow As Integer, _
                  ByVal targetColumn As Integer) As String    '……(1)'
  Dim str As String
  str = targetTable.Cell(targetRow, targetColumn).Range.Text    '……(2)'
  str = Left(str, Len(str) - 2)    '……(3)'
  getStringFromCell = str
End Function

まず(1)の

Public Function getStringFromCell( _
                  ByVal targetTable As Table, _
                  ByVal targetRow As Integer, _
                  ByVal targetColumn As Integer) As String

で引数と返り値の設定。

第1引数で当該のTableオブジェクトを渡す。

んで、第2引数と第3引数で表中の行・列を渡す。

返り値は当然String型。

(2)の

str = targetTable.Cell(targetRow, targetColumn).Range.Text

で引数で指定された表のセルから値を取得して変数 str にぶち込み、

(3)の

str = Left(str, Len(str) - 2)

で取得した文字列の右端2字をカット。

なぜこんなことをするのかは、

akashi-keirin.hatenablog.com

コチラをどうぞ。

あとは、 str の中身をreturnして終わり。

実験

ドキュメント上に

f:id:akashi_keirin:20180202215542j:plain

こんな表を用意して、次のコードで実験。

スト2 標準モジュール
Public Sub testGetStringFromCell()
  Dim targetTable As Table    '……(1)'
  Set targetTable = ActiveDocument.Tables(1)
  Dim str As String
  Dim i As Integer
  For i = 2 To targetTable.Rows.Count    '……(2)'
    str = getStringFromCell(targetTable:=targetTable, _
                            targetRow:=i, _
                            targetColumn:=1)
    Debug.Print str
  Next
End Sub

(1)からの2行

Dim targetTable As Table
Set targetTable = ActiveDocument.Tables(1)

では、Table型の変数 targetTable を用意し、アクティブドキュメントの1番目の表をぶち込んでいる。

(2)からの6行(実質4行)

For i = 2 To targetTable.Rows.Count
  str = getStringFromCell(targetTable:=targetTable, _
                          targetRow:=i, _
                          targetColumn:=1)
  Debug.Print str
Next

では、TableオブジェクトのRowsコレクションのCountプロパティを参照して表の行数を取得して、Forループの最終値にしている。

Forブロック内では、リスト1の getStringFromCell を呼び出してセルの文字列を取得し、イミディエイトに出力している。

実行結果

f:id:akashi_keirin:20180202215550j:plain

この通り、無事に表の1列目の2~最終行(5行目)が取得できた。

おわりに

最近、処理を細かく切り分けるのが楽しくなってきた。