読者です 読者をやめる 読者になる 読者になる

Wordの表の各セルの文字列を利用しやすくする(3)

WordTableCreatorクラスの修正

id:mmYYmmdd さんからのコメント

akashi-keirin.hatenablog.com

前回の記事に、id:mmYYmmdd さんからコメントをいただいた。

全く以て仰せのとおり、というところなので、アドヴァイスに沿ってコードを修正する。

雑な配列の定義を改める

まずは、

ReDim tableArray_(1 To maxRow_, 1 To maxColumn_) とするかクラスモジュールの先頭に Option Base 1 を宣言するかしないと0番目の要素が余分になってしまいます

正直、配列を使い始めたのが割と最近だったもので、扱いが雑でした。「動きゃいい」という感覚でやっていたことは否めません。やはり、きっちりとしないといけませんな。

というわけで、二次元配列の要素数が確定した後、ReDimするところを次のように訂正する。

リスト1
ReDim tableArray_(1 To maxRow_, 1 To maxColumn_)

表のセル番地との対応を優先して1始まりにしたんですが、後々のことを考えたら0始まりの方がいいのかも……。このあたりは経験不足で何とも……。

配列をまるごと取り出すメソッドの導入

こちらについては、

テーブル丸ごと出力する関数を用意すれば一発でExcelワークシートに転記できる

とのことで、「あ、その手があったか」と。

クラスのプロパティを配列変数のように扱えないのなら、クラス内の配列変数(「今回の場合はtableArray_()」)を返り値にするメソッドを作ればいいわけだ。

そこで、次のようなメソッドを作った。

スト2
Public Function getArray() As Variant    '……(*)'
  If hasArray_ = True Then
    getArray = tableArray_
  End If
End Function

(*)では、返り値の型をVariantにしている。要素数がその都度異なるので、Variantで受けるのが一番楽だと思った。

ちなみに、「hasArray_」という変数は、クラスのインスタンスが無事に表のデータを取得したらTrueにするように新たに持たせた変数。

必要なのかどうかよく分からなかったけど、一応持たせてみた。

動作確認

標準モジュールに下記のコードを書いて実行してみた。

Public Sub testTableArray()
  Dim wtOperator As WordTableOperator
  Set wtOperator = New WordTableOperator
  wtOperator.createArrayFromTable 2, True
  With wtOperator
    ActiveSheet.Range("A1").Resize(.maxRow, .maxColumn).Value = .getArray
  End With
End Sub

前回同様、

f:id:akashi_keirin:20170507153834j:plain

このWordドキュメントをアクティブにして実行。

実行結果

f:id:akashi_keirin:20170507153842j:plain

おおっ! ちゃんとできとる!

これで、だいぶ転記の手間が省けるなあ。

おわりに

クラスのプロパティを配列そのものにするのは無理っぽいんですが、クラスの内部で保持している配列をそのまま返すようなメソッドを書けばいい、というのは素人にはなかなか出てこない発想でした。

id:mmYYmmdd さん、ありがとうございました!!!!!!!!

@akashi_keirin on Twitter