2016-03-02 197 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