【问题标题】:VBA function calls VBA sub to print array to worksheetVBA 函数调用 VBA sub 将数组打印到工作表
【发布时间】:2016-03-02 14:44:52
【问题描述】:

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

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 命令以检查 sub 是否被正确调用并且它正在工作,它就是这样。此外,它返回了我请求的特定位置的值,并且还说明了我正在查看的特定矩阵的大小,因此数据似乎确实被正确读取 - 问题在于随后从新子中写入。

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

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

【问题讨论】:

  • 不,他们不能(除非你想开始搞砸定时器和/或事件)。从单元格调用的 UDF 可以广义地说只能将值返回到那些相同的单元格。但是,您可以将数组输出到即时窗口。
  • 感谢您的快速回复。将数组输出到“立即窗口”是什么意思?
  • 您好,我已经做了很多 VBA,这应该是可能的。根据您的问题,我无法判断您是否尝试在单元格中使用 VBA 函数,例如在单元格“=CheckArray(TestArray)”中。如果是这样,那么 Rory 是正确的,因为您的结果只会转到您将函数作为公式放置的那个单元格。但是您应该能够通过 VBA 在代码中指定一个范围对象,该对象可以指定将结果发送到您需要的任何工作表上的哪个单元格。
  • 嗨,帕卢。我确实在单元格中使用了用户定义的函数。你的意思是我可以使用这个函数来改变一个命名范围,然后用我的矩阵打印那个命名范围吗?我也对如何在即时窗口中查看我的矩阵感兴趣。
  • 另外,根据您的代码的最后一行,您似乎正在尝试输出一个二维数组,即矩阵到一个单元格中。您可以将数字或字符串放入单元格,但我怀疑矩阵。您需要遍历矩阵,将矩阵的每个元素放入此处为“A1”的单元格中,复制工作表上的矩阵结构。

标签: arrays vba excel


【解决方案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

希望这对其他人也有用!

【讨论】:

  • 好的,你看到的问题是,如果你必须打印一个二维数组,并且想把所有这些都放入一个单元格中,我怀疑你是否能够使用函数来做到这一点在一个单元格中。因为根据定义,函数会返回一个值。您可以将矩阵的所有值的串联字符串打印到单元格中。但是您必须创建一个函数,指定返回类型为字符串。单元格中使用的用户函数应该是函数而不是过程(子)。
  • 我无法想象您为什么要打印这么多数据,比如将矩阵打印到电子表格的一个单元格中。
  • 该函数实际上会根据它所在的列返回几个不同的值。为 QA 生成一个数组显然是一步过头了。以上似乎仍然可以满足我的需求。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
相关资源
最近更新 更多