配列変数からセル範囲へ転記

CSV形式テキストファイルを読み込んで、セル範囲に展開するような場合の方法です。

ここでは、配列変数とセル範囲の関係の説明なので、「静的配列」で説明します。
対象は、この章の始めに説明している題材です。面倒ですが、マクロ内で配列変数にあらかじめ値をセットしておいて、一気に「Sheet2」に転記させてみます。


'***************************************************************************************************
'   配列変数からセル範囲への転記サンプル                            Module1(Module)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'04/02/11(1.00)新規作成
'16/11/19(1.10)*.xlsm化
'20/01/17(1.11)記述整理等
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const g_cnsSh2 As String = "Sheet2"

'***************************************************************************************************
'   ■■■ シート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :TEST8
'* 機能  :配列変数からセル範囲への転記@
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年02月11日
'* 作成者 :井上 治
'* 更新日 :2020年01月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:ブックを明示していないのでアクティブなブックに対して作用します
'***************************************************************************************************
Sub TEST8()
    '-----------------------------------------------------------------------------------------------
    Dim objSh2 As Worksheet                                         ' Sheet2
    Dim tblVal(1 To 3, 1 To 4) As String                            ' 3×4の2次元配列

    Set objSh2 = Worksheets("Sheet2")
    ' 2次元配列に値をセット(1つずつ原始的に!)
    tblVal(1, 1) = "A1"
    tblVal(1, 2) = "B1"
    tblVal(1, 3) = "C1"
    tblVal(1, 4) = "D1"
    tblVal(2, 1) = "A2"
    tblVal(2, 2) = "B2"
    tblVal(2, 3) = "C2"
    tblVal(2, 4) = "D2"
    tblVal(3, 1) = "A3"
    tblVal(3, 2) = "B3"
    tblVal(3, 3) = "C3"
    tblVal(3, 4) = "D3"
    ' 配列を一気にセル範囲に転記
    objSh2.Cells(1, 1).Resize(3, 4).Value = tblVal
End Sub

この説明では、配列変数に値が入っていることが前提なので、値を入れる記述が長くなりますが、転記そのものは最後の1行だけです。
配列変数からセル範囲への転記(処理結果)
処理結果はこのようになりました。

上のサンプルでは、配列を解りやすいように、縦を13、横を14としています。
ですが、VBAのデフォルトでは、配列の要素番号はゼロから始まるので、次の書き方でもOKです。


'***************************************************************************************************
'* 処理名 :TEST8_2
'* 機能  :配列変数からセル範囲への転記A
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年02月11日
'* 作成者 :井上 治
'* 更新日 :2020年01月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:ブックを明示していないのでアクティブなブックに対して作用します
'***************************************************************************************************
Sub TEST8_2()
    '-----------------------------------------------------------------------------------------------
    Dim objSh2 As Worksheet                                         ' Sheet2
    Dim tblVal(2, 3) As String                                      ' 3×4の2次元配列

    Set objSh2 = Worksheets("Sheet2")
    ' 2次元配列に値をセット(1つずつ原始的に!)
    tblVal(0, 0) = "A1"
    tblVal(0, 1) = "B1"
    tblVal(0, 2) = "C1"
    tblVal(0, 3) = "D1"
    tblVal(1, 0) = "A2"
    tblVal(1, 1) = "B2"
    tblVal(1, 2) = "C2"
    tblVal(1, 3) = "D2"
    tblVal(2, 0) = "A3"
    tblVal(2, 1) = "B3"
    tblVal(2, 2) = "C3"
    tblVal(2, 3) = "D3"
    ' 配列を一気にセル範囲に転記
    objSh2.Cells(1, 1).Resize(3, 4).Value = tblVal
End Sub



※なお、セル範囲が1行のみの場合のみ、1次元配列でも転記可能です。


ここでは配列の要素数を固定しているので問題はないですが...  このページのような、宣言段階で要素数を固定させている配列で処理できるのであれば何も問題はないのですが、「動的配列の勉強」でも説明しているように処理の都度、要素数が変更されるようなことにも対応しなければなりません。
この時、複数次元の配列は「最終次元しか内容を保持させたまま要素数を変更することができない」という問題を持っていて、「行」×「列」というような二次元配列を考えても「行」の方向の要素数が変えられないという問題に当たってしまうことがあります。