2016-03-02 65 views
4

目前我有一个用户定义的函数,它运行几个涉及矩阵生成的例程。要检查这些矩阵是否已正确生成,我想将它们放在工作表上。用户定义函数工作正常,我已经添加了低于进去的地方,我想找出什么是数组中:VBA函数调用VBA sub将数组打印到工作表

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 

注意,我把两个MSGBOX命令在那里检查子被正确调用,它是工作,它是。此外,它还返回了我请求的特定位置的值,并且还说明了我所查看的特定矩阵的大小,所以数据似乎正在被正确读取 - 问题在于随后从新的子文件中写入该数据。

当我包含最后一行时,它不会将我的数组打印到工作表,并且也会停止用户定义的函数正常工作。有谁知道为什么这不起作用?

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

+0

不,他们不能(除非你想开始搞定时器和/或事件)。从单元中调用的UDF广义上讲只能将值返回给那些相同的单元。但是,您可以将数组输出到即时窗口。 – Rory

+0

感谢您的快速响应。将数组输出到“立即窗口”是什么意思? – j128

+0

你好,我做了很多VBA,这应该是可能的。基于你的问题,我不能告诉你是否试图在单元格中使用VBA函数,就像在“= CheckArray(TestArray)”单元格中一样。如果是这样,那么罗里是正确的,因为你的结果只会发送到你将函数作为公式的单元格。但是您应该可以通过代码中的VBA指定一个范围对象,该范围对象可以指定将结果发送到您需要的任何工作表的单元。 – Palu

回答

1

总结:

由于我使用的是进入了一个电池在工作表用户定义的函数,我不能将数据导出到任何地方,但该单元格。但是,我可以在即时窗口中查看数组。

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

要我的数组导出到即时窗口我应该进入到这一点我的代码要查看后阵:

Call WriteArrayToImmediateWindow(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 

信用为上述进入User3706920:How to print two dimensional array in Immediate window in VBA?

编辑:

我决定观看阵列中立即窗口并不总是有用的,我需要在Excel中查看数据逗号分隔。如果你想要做同样遵循以下说明:

到数组导出到您应该进入阵列后您的代码这是一个文本文件,要查看:

Call WriteToFile(MyArray) 

其中“MYARRAY”又是你想要查看的数组的名称。在“将writeToFile宏如下:

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 

希望这是有用的人太!

+0

好的,你会发现问题是,如果你必须打印一个二维数组,并且想把所有这些都放到一个单元格中,我怀疑你可以用一个单元格中的函数来做到这一点。因为按定义函数返回一个值。您可能能够将矩阵的所有值的拼接字符串打印到单元格中。但是你必须创建一个指定返回类型为String的函数。在单元格中使用的用户函数应该是函数而不是过程(Sub)。 – Palu

+0

我简直无法想象为什么你想要在电子表格中打印如此多的数据,比如矩阵到一个单元格中。 – Palu

+0

函数根据所在的列实际返回几个不同的值。为QA生成数组显然是太过分了。尽管如此,上述似乎做我所需要的。谢谢你的帮助。 – j128