在VBA中,如何使用函数返回数组/或写入单元格?

时间:2009-05-11 04:01:41

标签: arrays excel vba function range

使用这个非常简单的功能:

Function WriteArray() as Variant
 Dim array(0 To 2)
 array(0) = "A"
 array(1) = "B"
 array(2) = "C"
 WriteArray = array
End Function

我希望在Excel电子表格中看到整个数组,但事实并非如此:我只得到第一个字符串。我知道有一些技巧可以在电子表格中显示整个数组(通过选择公式+ F2 + CTRL + SHIFT + ENTER选择一系列单元格),但我更希望VBA能够处理它。

我还尝试使用Application.Caller变量直接在“Caller”范围内写入,但代码中断了。

非常感谢你的帮助!

编辑: 这是我试图使用的另一个代码:

Function WriteArray() As Variant
     Dim arr(0 To 2)
     arr(0) = "A"
     arr(1) = "B"
     arr(2) = "C"
     WriteArray = arr
     Dim StartRow, i As Integer
     For i = 0 To UBound(arr)
        Range("A" & i).Value = arr(i)
     Next
End Function

它在“Range(”A“& i).Value = arr(i)”行中断。我的Excel坏了吗?!

4 个答案:

答案 0 :(得分:6)

以下代码将数组精美地写入一系列单元格:

Function WriteArray() As Variant
    Dim AbcList(0 To 2) as Variant
    AbcList(0) = "A"
    AbcList(1) = "B"
    AbcList(2) = "C"
    WriteArray = AbcList
End Function

Function WriteArrayToSpreadsheet()
    Dim MyArray As Variant
    MyArray = WriteArray()

    Dim StartRow, i As Integer
    StartRow = 1
    For i = 0 To UBound(MyArray)
        Range("A" & i + StartRow).Value = MyArray(i)
    Next
End Function

话虽这么说,我希望看到代码的一部分,你实际上是想把它放到电子表格上,而不是你构建数组的地方。然后我可以帮助你!

答案 1 :(得分:3)

您不能直接从Excel中的工作表函数写入非调用者单元格。

如果要使用数组函数(使用Shift-Ctrl-Enter),则需要将代码更改为:

Function WriteArray() As Variant
    Dim arr(0 To 2, 0 To 1)
    arr(0, 0) = "A"
    arr(1, 0) = "B"
    arr(2, 0) = "C"
    WriteArray = arr
End Function

如果你想在调用单元格之外写入,你需要实现某种形式的回调,它将使用自动化来写入其他单元格。这种方式更复杂,更容易破裂!

答案 2 :(得分:1)

秘诀是定义一个二维数组。数组的两个维度就是需要为数据集定义的范围。第一个数组维度是行偏移量,第二个维度是列偏移量。

在您的示例中,第二个维度不是"使用":

 Sub Ente()

   Dim myArray(0 To 3, 0) As String
   myArray(0, 0) = "A"
   myArray(1, 0) = "B"
   myArray(2, 0) = "C"

   Range("B7:B" & UBound(myArray) + 6) = myArray

End Sub

所以,不需要循环!简单快捷。

答案 3 :(得分:0)

到目前为止,我所做的最好的解决方法是创建一个程序来获取您的范围引用和数组,并将其用作开始点以显示您的数据视距或垂直...

如下:

Sub LoadArray(ByRef oRange, ByRef vArray)
    Dim I
    For I = 0 To UBound(vArray)
        oRange.Offset(I, 0).Value = vArray(I)
    Next
End Sub

'How to call:
Dim anyArray
anyArray = Array(1,2,3)

Call LoadArray(Range("anyRange"), anyArray)

希望它有所帮助。