従来版VBやVBAから見れば「バグ」だという判断になってしまうのですが、これらは新しいメソッドを使うと解決できます。
'************************************************************************************
' 配列内に配列を納める(JAG配列)サンプル
'************************************************************************************
Public Class Form1
Private Const g_cnsTitle As String = "JAG配列のテスト"
Private Structure typCOL
Dim COL As Object
End Structure
'********************************************************************************
' 配列内に配列を納める(JAG配列)サンプル(これならOK(CopyTo)!?)
'********************************************************************************
Private Sub BTN_TEST2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BTN_TEST2.Click
Dim tblCOL() As Integer ' カラム方向の配列
Dim tblROW() As typCOL ' 行方向の配列
Dim strMSG As String
'----------------------------------------------------------------------------
' ■行方向の第1要素
'----------------------------------------------------------------------------
' カラム方向の配列要素数の決定と値のセット
ReDim tblCOL(2)
tblCOL(0) = 1
tblCOL(1) = 2
tblCOL(2) = 3
' 行方向の配列にカラム方向の配列を格納
ReDim tblROW(0)
ReDim tblROW(0).COL(2)
tblCOL.CopyTo(tblROW(0).COL, 0) ' CopyToメソッドで転記
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第2要素
'----------------------------------------------------------------------------
' カラム方法の配列要素の値を変更
tblCOL(0) = 4
tblCOL(1) = 5
tblCOL(2) = 6
' 行方向の配列にカラム方向の配列を格納
ReDim Preserve tblROW(1)
ReDim tblROW(1).COL(2)
tblCOL.CopyTo(tblROW(1).COL, 0) ' CopyToメソッドで転記
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第3要素
'----------------------------------------------------------------------------
' カラム方法の配列要素の値を変更
tblCOL(0) = 7
tblCOL(1) = 8
tblCOL(2) = 9
' 行方向の配列にカラム方向の配列を格納
ReDim Preserve tblROW(2)
ReDim tblROW(2).COL(2)
tblCOL.CopyTo(tblROW(2).COL, 0) ' CopyToメソッドで転記
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(2)
strMSG = strMSG & vbCr & "(2)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第3要素を変えみる
'----------------------------------------------------------------------------
' ここでは配列を押し込まずにJAG配列内の値を直接変更してみる
tblROW(2).COL(0) = 10
tblROW(2).COL(1) = 11
tblROW(2).COL(2) = 12
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(2)
strMSG = strMSG & vbCr & "(2)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
End Sub
End Class
このコードを動作させると、

所望の通りの結果になるのです。
コード上での変更箇所は、
'ReDim tblROW(0).COL(2) ' この記述は省略
tblROW(0).COL = tblCOL
と記述していた部分(配列要素ごとに3カ所)を
ReDim tblROW(0).COL(2)
tblCOL.CopyTo(tblROW(0).COL, 0) ' CopyToメソッドで転記
このように変更するだけです。ですから計6行が異なるだけです。
ちなみに、
'************************************************************************************
' 配列内に配列を納める(JAG配列)サンプル
'************************************************************************************
Public Class Form1
Private Const g_cnsTitle As String = "JAG配列のテスト"
Private Structure typCOL
Dim COL As Object
End Structure
'********************************************************************************
' 配列内に配列を納める(JAG配列)サンプル(配列ごと押し込むのはNG!?)
'********************************************************************************
Private Sub BTN_TEST3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BTN_TEST3.Click
Dim tblROW() As typCOL ' 行方向の配列
Dim strMSG As String
'----------------------------------------------------------------------------
' ■行方向の第1要素
'----------------------------------------------------------------------------
' 行方向の配列にカラム方向の配列を格納
ReDim tblROW(0)
With tblROW(0)
ReDim .COL(2)
.COL(0) = 1
.COL(1) = 2
.COL(2) = 3
' 状態を検証
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第2要素
'----------------------------------------------------------------------------
' 行方向の配列にカラム方向の配列を格納
ReDim Preserve tblROW(1)
With tblROW(1)
ReDim .COL(2)
.COL(0) = 4
.COL(1) = 5
.COL(2) = 6
End With
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第3要素
'----------------------------------------------------------------------------
' 行方向の配列にカラム方向の配列を格納
ReDim Preserve tblROW(2)
With tblROW(2)
ReDim .COL(2)
.COL(0) = 7
.COL(1) = 8
.COL(2) = 9
End With
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(2)
strMSG = strMSG & vbCr & "(2)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第3要素を変えみる
'----------------------------------------------------------------------------
' ここでは配列を押し込まずにJAG配列内の値を直接変更してみる
With tblROW(2)
.COL(0) = 10
.COL(1) = 11
.COL(2) = 12
End With
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(2)
strMSG = strMSG & vbCr & "(2)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
End Sub
End Class
このように配列を配列に「押し込む」方法ではなく、横軸方向の配列要素を1つずつセットしていく方法であれば「CopyToメソッド」を使わなくても問題はありません。
さらに、試していると、
'************************************************************************************
' 配列内に配列を納める(JAG配列)サンプル
'************************************************************************************
Public Class Form1
Private Const g_cnsTitle As String = "JAG配列のテスト"
Private Structure typCOL
Dim COL As Object
End Structure
'********************************************************************************
' 配列内に配列を納める(横軸方向の配列を毎回初期化すると!?)
'********************************************************************************
Private Sub BTN_TEST5_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BTN_TEST5.Click
Dim tblCOL As Object ' カラム方向の配列
Dim tblROW() As typCOL ' 行方向の配列
Dim strMSG As String
'----------------------------------------------------------------------------
' ■行方向の第1要素
'----------------------------------------------------------------------------
' カラム方向の配列要素数の初期化と値のセット
tblCOL = New Integer() {1, 2, 3}
' 行方向の配列にカラム方向の配列を格納
ReDim tblROW(0)
'ReDim tblROW(0).COL(2) ' この記述は省略
tblROW(0).COL = tblCOL
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第2要素
'----------------------------------------------------------------------------
' カラム方向の配列要素数の初期化と値のセット
tblCOL = New Integer() {4, 5, 6}
' 行方向の配列にカラム方向の配列を格納
ReDim Preserve tblROW(1)
'ReDim tblROW(1).COL(2) ' この記述は省略
tblROW(1).COL = tblCOL
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第3要素
'----------------------------------------------------------------------------
' カラム方向の配列要素数の初期化と値のセット
tblCOL = New Integer() {7, 8, 9}
' 行方向の配列にカラム方向の配列を格納
ReDim Preserve tblROW(2)
'ReDim tblROW(2).COL(2) ' この記述は省略
tblROW(2).COL = tblCOL
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(2)
strMSG = strMSG & vbCr & "(2)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
'----------------------------------------------------------------------------
' ■行方向の第3要素を変えみる
'----------------------------------------------------------------------------
' ここでは配列を押し込まずにJAG配列内の値を直接変更してみる
tblROW(2).COL(0) = 10
tblROW(2).COL(1) = 11
tblROW(2).COL(2) = 12
' 状態を検証
With tblROW(0)
strMSG = "(0)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(1)
strMSG = strMSG & vbCr & "(1)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
With tblROW(2)
strMSG = strMSG & vbCr & "(2)=" & .COL(0) & "-" & .COL(1) & "-" & .COL(2)
End With
MsgBox(strMSG,, g_cnsTitle)
End Sub
End Class
このコードも問題ないことがわかりました。
横軸方向の配列を縦軸方向の配列に押し込む場合に、このサンプルは「毎回初期化(Newキーワードで)」しているのです。
つまり、上記の不具合と思われる事象は、初期化し直さずに同じ縦軸方向の配列を押し込んだ場合、同じ縦軸方向の配列を用いた全ての行が同時に書き換わってしまうということのようです。
これは、横軸配列を縦軸方向の配列に押し込んだ当座だけでなく、それ以降も連動して動作してしまうということだという現象になっています。
ですが、私がこのような一時的な配列を用意するのは、Excelのシートへの転記動作をできるだけ速く行なう必要性から転記回数を減らすため、「値」「計算式」「空要素」を含めて100列以上を一時的に配列に納めることを考えたわけで、
しかも明細項目レベルの合計を「上」に表現しなければならなかったため、明細を先に横軸方向の1次配列を通して縦軸方向の配列に確保しながら「伝票計」を1番上の要素に再計算させた上で収容された要素数分をExcelシート上に行単位にセットするという方法を採ったからです。
横軸方向には、年間各月度が配置され、「予算」「実績」「差異」「達成率」が各月度に繰り返され、「予算」「実績」は値、「差異」「達成率」は計算式です。当然、計算式は縦軸方向の配列には事前にセットしておき、行毎にセットし直すことはありません。
このことから、縦軸方向の配列の1要素に対して、横軸方向の項目を1つずつセットするとか、毎行ごとに初期化するようなことではこの方法を採る意味がなくなってしまいます。
従って、「CopyToメソッド」を使うことが「従来互換」だということを熟知しておく必要があると思います。