Arrays VBA函数调用VBA sub将数组打印到工作表

Arrays VBA函数调用VBA sub将数组打印到工作表,arrays,vba,excel,Arrays,Vba,Excel,目前,我有一个用户定义的函数,它运行几个涉及矩阵生成的例程。为了检查这些矩阵是否正确生成,我想将它们放在工作表上。用户定义的函数运行良好,我在想要了解数组中的内容的地方添加了以下内容: Call CheckArray(TestArray) 上面的“TestArray”随我要查看的阵列的不同而变化 “CheckArray”子例程如下所示: Sub CheckArray(MyArray As Variant) MatrixRows = UBound(MyArray, 1) MatrixCols =

目前,我有一个用户定义的函数,它运行几个涉及矩阵生成的例程。为了检查这些矩阵是否正确生成,我想将它们放在工作表上。用户定义的函数运行良好,我在想要了解数组中的内容的地方添加了以下内容:

Call CheckArray(TestArray)
上面的“TestArray”随我要查看的阵列的不同而变化

“CheckArray”子例程如下所示:

Sub CheckArray(MyArray As Variant)
MatrixRows = UBound(MyArray, 1)
MatrixCols = UBound(MyArray, 2)

MsgBox MyArray(11, 2)
MsgBox "Matrix size = " & MatrixRows & " rows x " & MatrixCols & " columns"

ActiveWorkbook.Worksheets("Check array").[A1].Resize(MatrixRows, MatrixCols) = MyArray
End Sub
Sub WriteToFile(arrSubA As Variant)
'To export array to a text file
    'Setup
    Dim FSO As Object
    Dim ofs As Object
    Dim Output As Variant
    Dim rowString As String
    Dim iSubA As Long
    Dim jSubA As Long
    rowString = ""

    'Create file
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Dim oFile As Object
    Set oFile = FSO.CreateTextFile("C:\Users\" & Environ$("username") & "\Desktop\Array.txt")
    oFile.Close
    For iSubA = 1 To UBound(arrSubA, 1)
        rowString = arrSubA(iSubA, 1)
        For jSubA = 2 To UBound(arrSubA, 2)
            rowString = rowString & "," & arrSubA(iSubA, jSubA)
        Next jSubA
        If Len(Dir("C:\Users\" & Environ$("username") & "\Desktop\Array.txt")) > 0 Then
            Set ofs = FSO.OpenTextFile("C:\Users\" & Environ$("username") & "\Desktop\Array.txt", 8, True)
        End If
        ofs.WriteLine rowString
        ofs.Close
    Next iSubA
End Sub
请注意,我在其中放置了两个MsgBox命令,以检查sub是否正确调用,以及它是否正常工作。此外,它返回了我请求的特定位置中的值,并且还说明了我正在查看的特定矩阵的大小,因此数据似乎读取正确-问题在于随后从新sub写入数据

当我包含最后一行时,它不会将我的数组打印到工作表中,并且还会阻止用户定义的函数正常工作。有人知道为什么这样不行吗

用户定义的函数是否可以调用打印到工作表的SUB?有没有办法解决这个问题?

总结一下:

由于我使用的是输入到工作表单元格中的用户定义函数,因此我无法将数据导出到该单元格以外的任何位置。但是,我可以在即时窗口中查看阵列

在MS Excel 2010中,可以在VBA编辑器(Alt+F11)中找到即时窗口,然后单击查看->即时窗口(Ctrl+G)

要将数组导出到即时窗口,我应该在要查看的数组之后的代码中输入以下内容:

Call WriteArrayToImmediateWindow(MyArray)
Call WriteToFile(MyArray)
其中“MyArray”是我的数组的名称,不管它是什么

这将调用“WriteArrayToImmediateWindow”子命令,即:

Sub WriteArrayToImmediateWindow(arrSubA As Variant)

Dim rowString As String
Dim iSubA As Long
Dim jSubA As Long

rowString = ""

Debug.Print
Debug.Print "The array is: "
For iSubA = 1 To UBound(arrSubA, 1)
    rowString = arrSubA(iSubA, 1)
    For jSubA = 2 To UBound(arrSubA, 2)
        rowString = rowString & "," & arrSubA(iSubA, jSubA)
    Next jSubA
    Debug.Print rowString
Next iSubA

End Sub
上述费用归用户3706920所有:

编辑:

我决定在即时窗口中查看数组并不总是有用的,我需要查看Excel中以逗号分隔的数据。如果要执行相同操作,请遵循以下说明:

要将数组导出到文本文件,应在要查看的数组之后的代码中输入以下内容:

Call WriteArrayToImmediateWindow(MyArray)
Call WriteToFile(MyArray)
其中“MyArray”再次是要查看的数组的名称。“WriteToFile”宏如下所示:

Sub CheckArray(MyArray As Variant)
MatrixRows = UBound(MyArray, 1)
MatrixCols = UBound(MyArray, 2)

MsgBox MyArray(11, 2)
MsgBox "Matrix size = " & MatrixRows & " rows x " & MatrixCols & " columns"

ActiveWorkbook.Worksheets("Check array").[A1].Resize(MatrixRows, MatrixCols) = MyArray
End Sub
Sub WriteToFile(arrSubA As Variant)
'To export array to a text file
    'Setup
    Dim FSO As Object
    Dim ofs As Object
    Dim Output As Variant
    Dim rowString As String
    Dim iSubA As Long
    Dim jSubA As Long
    rowString = ""

    'Create file
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Dim oFile As Object
    Set oFile = FSO.CreateTextFile("C:\Users\" & Environ$("username") & "\Desktop\Array.txt")
    oFile.Close
    For iSubA = 1 To UBound(arrSubA, 1)
        rowString = arrSubA(iSubA, 1)
        For jSubA = 2 To UBound(arrSubA, 2)
            rowString = rowString & "," & arrSubA(iSubA, jSubA)
        Next jSubA
        If Len(Dir("C:\Users\" & Environ$("username") & "\Desktop\Array.txt")) > 0 Then
            Set ofs = FSO.OpenTextFile("C:\Users\" & Environ$("username") & "\Desktop\Array.txt", 8, True)
        End If
        ofs.WriteLine rowString
        ofs.Close
    Next iSubA
End Sub
要在Excel中快速查看输出数组而不使用任何逗号,我建议将以下宏指定给按钮:

Sub OpenArrayFile()
'To open array text file in Excel
    Workbooks.OpenText Filename:="C:\Users\" & Environ$("username") & "\Desktop\Array.txt", Origin:= _
        xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
        , ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=True _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
End Sub

希望这对其他人也有用

不,他们不能(除非你想开始摆弄计时器和/或事件)。从单元格中调用的UDF从广义上讲只能将值返回给那些相同的单元格。不过,您可以将数组输出到即时窗口。感谢您的快速响应。将数组输出到“即时窗口”是什么意思?您好,我已经做了很多VBA,这应该是可能的。根据您的问题,我无法判断您是否试图在单元格中使用VBA函数,例如在单元格“=CheckArray(TestArray)”中。如果是这样的话,那么Rory是正确的,因为您的结果将只进入您将函数作为公式放置的单元格。但是,您应该能够通过VBA在代码中指定一个范围对象,该对象可以指定在您需要的任何工作表上向哪个单元格发送结果。我确实在单元格中使用用户定义的函数。您的意思是我可以使用该函数更改命名范围,然后使用我的矩阵打印该命名范围吗?我还对如何在即时窗口中查看我的矩阵感兴趣。另外,根据代码的最后一行,似乎您正在尝试输出一个二维数组,即矩阵到一个单元格中。你可以把一个数字或字符串放入一个单元格,但我怀疑矩阵。你需要在矩阵中循环,将矩阵的每个元素放在一个单元格中,这里是“A1”,复制工作表上的矩阵结构。好的,你看到的问题是,如果你必须打印一个二维数组,并想将所有这些都放在一个单元格中,我怀疑你是否能够用单元格中的函数来实现这一点。因为函数根据定义返回一个值。您可以将矩阵中所有值的串联字符串打印到单元格中。但是您必须创建一个函数,将返回类型指定为字符串。单元格中使用的用户函数应该是函数,而不是过程(Sub)。我无法想象为什么要在电子表格中的一个单元格中打印如此多的数据,如矩阵。该函数实际上会根据它所在的列返回多个不同的值。为QA生成一个数组显然是走得太远了。尽管如此,上面的内容似乎满足了我的需要。谢谢你的帮助。