【问题标题】:In VBA, how to return an array / or write to cells using a function?在 VBA 中,如何使用函数返回数组/或写入单元格?
【发布时间】:2010-10-25 04:54:46
【问题描述】:

使用这个非常简单的函数:

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 坏了吗?!

【问题讨论】:

    标签: arrays excel vba function range


    【解决方案1】:

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

    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
    

    话虽如此,我希望看到您实际尝试将其放入电子表格的代码部分,而不是您构建数组的位置。那我可以帮你!

    【讨论】:

    • 事实上这是行不通的,VBA 代码在 "Range("A" & i + StartRow).Value = MyArray(i)"... 这也是我的问题。此代码是否适用于您的 Excel!?我使用 Excel 2003。
    • 它在 Excel 2003 中完美运行。将开始代码中的每个“数组”更改为另一个不是保留字的变量名,例如 AbcList 或类似的东西。
    • 仍然,它坏了...我完全使用以下代码: 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 At "Range("A “ & i).Value = arr(i)”,它只是退出代码,即使没有抛出任何错误......对我来说没有意义:(
    • 我用这段代码编辑了我的问题,因为它在这里显示不正确:)
    • 不行,你需要设置 StartRow 并将其添加到 i.您的代码正在尝试写入 A0,该 A0 不存在并会引发错误。
    【解决方案2】:

    您不能直接从 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
    

    如果您想在调用单元格之外写入,则需要实现某种形式的回调,该回调将使用自动化来写入其他单元格。这要复杂得多,而且更有可能崩溃!

    【讨论】:

      【解决方案3】:

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

      在你的例子中,第二个维度没有被“使用”:

       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
      

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

      【讨论】:

        【解决方案4】:

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

        如下:

        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)
        

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2015-09-17
          • 2019-11-27
          • 2013-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-25
          • 1970-01-01
          相关资源
          最近更新 更多