Vba 将矩阵内容打印到工作表

Vba 将矩阵内容打印到工作表,vba,excel,Vba,Excel,我昨天问了你们一个很模糊的问题。我现在已经设法隔离了这个问题,但显然没有像我在这里写的那样解决它 我的问题是给变量分配矩阵的值/内容(或变量的变量)。不确定这是否是多余的,但我希望在我的电子表格中包含以下内容: A B C D E F 1 a b c d 2 e f g h 3 aa bb cc dd 4 ee ff gg hh 代码如下: Public Sub Test() Dim sub_data

我昨天问了你们一个很模糊的问题。我现在已经设法隔离了这个问题,但显然没有像我在这里写的那样解决它

我的问题是给变量分配矩阵的值/内容(或变量的变量)。不确定这是否是多余的,但我希望在我的电子表格中包含以下内容:

   A   B   C   D   E   F
1  a   b   c   d      
2  e   f   g   h
3  aa  bb  cc  dd
4  ee  ff  gg  hh
代码如下:

Public Sub Test()

    Dim sub_data As Variant
    Dim sheet_name As String
    Dim str As String
    Dim rng As Range

    sheet_name = "Sheet1"
    Set rng = Sheets(sheet_name).Range("A1")
    Worksheets(sheet_name).Cells.ClearContents

    On Error Resume Next

    str = "A" & CStr(print_row)

    ReDim sub_data(0 To 1, 0 To 1, 0 To 3)

    sub_data(0, 0, 0) = "a"
    sub_data(0, 0, 1) = "b"
    sub_data(0, 0, 2) = "c"
    sub_data(0, 0, 3) = "d"

    sub_data(0, 1, 0) = "e"
    sub_data(0, 1, 1) = "f"
    sub_data(0, 1, 2) = "g"
    sub_data(0, 1, 3) = "h"

    sub_data(1, 0, 0) = "aa"
    sub_data(1, 0, 1) = "bb"
    sub_data(1, 0, 2) = "cc"
    sub_data(1, 0, 3) = "dd"

    sub_data(1, 1, 0) = "ee"
    sub_data(1, 1, 1) = "ff"
    sub_data(1, 1, 2) = "gg"
    sub_data(1, 1, 3) = "hh"

    Call PrintArray(sub_data, str)

End Sub

Public Sub PrintArray(Data As Variant, Cl As String)

    Dim ubnd_1, ubnd_2 As Integer
    Dim sub_data As Variant

    ubnd_1 = UBound(Data, 2)
    ubnd_2 = UBound(Data, 3)

    sub_data = Data(0) 'THIS LINE WON'T WORK. HOW TO ASSIGN CORRECTLY?

    'here I want to print the content of the Data-variable onto the sheet
    Range(Cl).Resize(ubnd_2 + 1, ubnd_1 + 1) = Application.Transpose(sub_data)
End Sub

您不需要三维阵列。我已经将您的3D更改为2D,因为您的示例只需要二维。无论如何,电子表格是2D的,所以转换3D数组听起来是不可能的

最简单的方法

Public Sub PrintArray(Data As Variant)
    Range("A10").Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End Sub
但是您必须确保更改矩阵/数组的维度

Option Explicit

Public Sub Test()

    Sheets(1).Cells.ClearContents

    ReDim sub_data(1 To 4, 1 To 4)

    sub_data(1, 1) = "a"
    sub_data(1, 2) = "b"
    sub_data(1, 3) = "c"
    sub_data(1, 4) = "d"

    sub_data(2, 1) = "e"
    sub_data(2, 2) = "f"
    sub_data(2, 3) = "g"
    sub_data(2, 4) = "h"

    sub_data(3, 1) = "aa"
    sub_data(3, 2) = "bb"
    sub_data(3, 3) = "cc"
    sub_data(3, 4) = "dd"

    sub_data(4, 1) = "ee"
    sub_data(4, 2) = "ff"
    sub_data(4, 3) = "gg"
    sub_data(4, 4) = "hh"

    Call PrintArray(sub_data)

End Sub

Public Sub PrintArray(Data As Variant)

    Range("A1:A" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 1, 0))
    Range("B1:B" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 2, 0))
    Range("C1:C" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 3, 0))
    Range("D1:D" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 4, 0))

End Sub

因此,我将您的
sub_数据
更改为二维变量。结构保持与您预期的相同

您不需要3D阵列。我已经将您的3D更改为2D,因为您的示例只需要二维。无论如何,电子表格是2D的,所以转换3D数组听起来是不可能的

最简单的方法

Public Sub PrintArray(Data As Variant)
    Range("A10").Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End Sub
但是您必须确保更改矩阵/数组的维度

Option Explicit

Public Sub Test()

    Sheets(1).Cells.ClearContents

    ReDim sub_data(1 To 4, 1 To 4)

    sub_data(1, 1) = "a"
    sub_data(1, 2) = "b"
    sub_data(1, 3) = "c"
    sub_data(1, 4) = "d"

    sub_data(2, 1) = "e"
    sub_data(2, 2) = "f"
    sub_data(2, 3) = "g"
    sub_data(2, 4) = "h"

    sub_data(3, 1) = "aa"
    sub_data(3, 2) = "bb"
    sub_data(3, 3) = "cc"
    sub_data(3, 4) = "dd"

    sub_data(4, 1) = "ee"
    sub_data(4, 2) = "ff"
    sub_data(4, 3) = "gg"
    sub_data(4, 4) = "hh"

    Call PrintArray(sub_data)

End Sub

Public Sub PrintArray(Data As Variant)

    Range("A1:A" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 1, 0))
    Range("B1:B" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 2, 0))
    Range("C1:C" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 3, 0))
    Range("D1:D" & UBound(Data, 2)) = WorksheetFunction.Transpose(WorksheetFunction.Index(Data, 4, 0))

End Sub

因此,我将您的
sub_数据
更改为二维变量。结构保持与您预期的相同

我不太清楚你想做什么,但请看一下,看是不是这样helps@mehow我想将
sub_数据的内容打印到我的电子表格
Sheet1
。你的链接很棒,尽管它使用循环遍历矩阵的每个元素。然而,我在某个地方读到,只需调整范围大小,然后用矩阵值分配范围,速度就会更快。这就是我在
Range(Cl.Resize(…)=Application.Transpose(sub_data)
行中尝试做的事情。这能让它更清晰吗?真的没有办法使用
transpose()
函数将3D数组打印到电子表格中。转置仅适用于1D数组。您需要做的是创建三个1D数组,遍历3D数组,并为每个数组指定一列。然后你必须在每个1D数组上调用转置函数。是的,你完全正确,这就是我试图用调用
sub_data=data(0)
(显然,我没有在这里循环)。你知道有没有一种方法可以在一次调用中分配
sub_data
数据(0)
的所有内容,而不必循环它…@mehowwell,你可以使用
工作表函数返回数组的一行。Index(array,1,0)
我不太清楚你想做什么,但可以查看一下,看看是不是helps@mehow我想将
sub_数据的内容打印到我的电子表格
Sheet1
。你的链接很棒,尽管它使用循环遍历矩阵的每个元素。然而,我在某个地方读到,只需调整范围大小,然后用矩阵值分配范围,速度就会更快。这就是我在
Range(Cl.Resize(…)=Application.Transpose(sub_data)
行中尝试做的事情。这能让它更清晰吗?真的没有办法使用
transpose()
函数将3D数组打印到电子表格中。转置仅适用于1D数组。您需要做的是创建三个1D数组,遍历3D数组,并为每个数组指定一列。然后你必须在每个1D数组上调用转置函数。是的,你完全正确,这就是我试图用调用
sub_data=data(0)
(显然,我没有在这里循环)。你知道有没有一种方法可以在一次调用中分配
sub_data
数据(0)
的所有内容,而不必循环…@mehow,你可以使用
工作表函数返回数组的一行。Index(array,1,0)
谢谢@mehow。实际上,我将
printary
重新编写为:
Public Sub-printary(数据作为变量)Dim ubnd_1,ubnd_2作为整数ubnd_1=UBound(数据,1)ubnd_2=UBound(数据,2)Range(“A1”)。Resize(ubnd_1,ubnd_2)=Application.Transpose(数据)End Sub
您不需要再转置:)谢谢@mehow。实际上,我重新编写了
printary
只是为了:
Public Sub-printary(数据作为变量)Dim ubnd_1,ubnd_2作为整数ubnd_1=UBound(数据,1)ubnd_2=UBound(数据,2)Range(“A1”)。Resize(ubnd_1,ubnd_2)=Application.Transpose(数据)End Sub