申し訳ない...orz
FormulaArrayを使えば良かったです。失念しておりました。
Sub pre()
Dim v
v = Array("A", "B", "C", "D")
Call test4(v)
End Sub
Sub test4(v)
Dim x As Long
Dim n As Long
Dim i As Long
Dim cnt As Long
Dim z
x = UBound(v) - LBound(v) + 1
With Range("A1").CurrentRegion.Resize(, x)
n = .Rows.Count
ReDim w(n)
w(0) = v
For i = 1 To n
If Not IsEmpty(.Cells(i, 1)) Then
cnt = cnt + 1
w(cnt) = .Rows(i).Value
End If
Next
End With
ReDim Preserve w(cnt)
' With Application
' z = .Transpose(.Transpose(w))
' End With
' Range("F1").Resize(cnt + 1, x).Value = z
Range("F1").Resize(cnt + 1, x).FormulaArray = w
End Sub
ジャグ配列というより、「多段階配列」という認識をしておけば良いと思います。
wの各要素が配列なので、そのままValueではセットできません。
FormulaArrayプロパティを使うか、Transposeを介して二次元配列に整理し直してセットします。
ただし、セルにセットできるのは各要素が一次元配列か、最初の次元が単一の二次元配列の場合です。
乱暴な言い方をすれば、「多段階配列」を立体的な配列と捉えてみてください。
そのままではセル範囲のような平面的な行列にセットできないという事ではないでしょうか。
ついでに参考コード。[ローカルウィンドウ]を活用して配列の構造の違いを把握しておいたほうが良いでしょう。
Sub test5()
Dim w(1), x, y
Cells.ClearContents
Range("A1:C2").Value = [{11,12,13;21,22,23}]
w(0) = Range("A1:C1").Value
w(1) = Range("A2:C2").Value
With Application
y = .Transpose(w)
x = .Transpose(.Transpose(w))
End With
Stop 'ここで[ローカルウィンドウ]確認。
Range("E1").Resize(UBound(y, 1), UBound(y, 2)).Value = y
Range("I1").Resize(UBound(x, 1), UBound(x, 2)).Value = x
Range("M1").Resize(UBound(w) + 1, UBound(w(0), 2)).Value = w
Range("M4").Resize(UBound(w) + 1, UBound(w(0), 2)).FormulaArray = w
End Sub
Sub test6()
Dim x1, x2 '一次元配列
Dim xx, yy, xy '二次元配列
Dim v1(1), v2(1), v3(1), vv(1) '一次元配列
Dim w1, w2, w3, ww, z(1, 1), w '二次元配列
Cells.ClearContents
Range("A1:D2").Value = [{11,12,13,14;21,22,23,24}]
x1 = Array(11, 12, 13, 14)
x2 = Array(21, 22, 23, 24)
xx = Range("A1:D1").Value
yy = Range("A1:A2").Value
xy = Range("A1:D2").Value
v1(0) = x1
v1(1) = x2
Range("F1:I2").Formula = v1
Range("F5:I6").FormulaArray = v1
w1 = Application.Transpose(v1)
Range("F9").Resize(UBound(w1, 1), UBound(w1, 2)).Value = w1
Cells.ClearContents
v2(0) = xx
v2(1) = xx
Range("F1:I2").Value = v2
Range("F5:I6").FormulaArray = v2
w2 = Application.Transpose(v2)
Range("F9").Resize(UBound(w2, 1), UBound(w2, 2)).Value = w2
Cells.ClearContents
'以降はエラー
v3(0) = yy
v3(1) = yy
Range("F1:I2").Value = v3
Range("F5:I6").FormulaArray = v3
w3 = Application.Transpose(v3)
vv(0) = xy
vv(1) = xy
ww = Application.Transpose(vv)
z(0, 0) = x1
z(0, 1) = x2
z(1, 0) = x1
z(1, 1) = x2
w = Application.Transpose(z)
End Sub
お礼
> wの各要素が配列なので、そのままValueではセットできません。 > FormulaArrayプロパティを使うか、Transposeを介して二次元配列に整理し直してセットします。 なんとなくですが、理解しました。 FormulaArrayプロパティ、また新しい呪文を覚えました。 一応以下のようにしました。 Sub test5() Dim x As Long Dim n As Long Dim i As Long Dim cnt As Long Dim z x = 4 cnt = 0 With Range("A1").CurrentRegion.Resize(, x) n = .Rows.Count MsgBox n ReDim w(n) For i = 1 To n If Not IsEmpty(.Cells(i, 1)) Then w(cnt) = .Rows(i).Value cnt = cnt + 1 End If Next End With ReDim Preserve w(cnt - 1) Range("F1").Resize(cnt, x).FormulaArray = w End Sub 今日から数日、旅行に出ますので帰ってからじっくり勉強しようと思います。 end-uさま、遅い時間までほんとうに有難うございました。