Excel VBA数组 - 获取#Value!尝试将数组转储到电子表格时出错

时间:2013-06-03 20:53:27

标签: arrays excel vba

如果有人能帮我解决这个问题,我将不胜感激。 - 目标:我试图填充一个只有两个数组之间匹配的数组(一个数组是我在第二个数组中寻找的参考数据)。

代码和数组在开发屏幕的Watches and Locals屏幕中看起来不错,但是当我检查excel电子表格中的函数时,它返回一个#value!错误。

非常感谢提前。

此致 罗德尼

Function FTE_Detail(sref As Range, eref As Range, esource As Range, bplan As Range, eplan As Range) As Variant

    'Application.Volatile

    Dim rreference(34, 0) As String, dumper(150, 6) As String, vsource(17424, 11) As String, k As Integer, j As Integer
    Dim b As Integer, c As Integer, month As Integer, a As Integer
    Dim IDNUMBER As Integer, name As String, empID As String, fromCC As String, tocc As String

    month = Worksheets("Introduction").Cells(7, 6).Value


    For k = 0 To (eref.Row - sref.Row)
        rreference(k, 0) = Worksheets("data").Cells(sref.Row + k, sref.Column).Value
    Next k
    k = 0
    j = 0

    For k = 0 To 11
        For j = 0 To esource.Row
        If Len(Worksheets("data").Cells(70 + j, esource.Column + k).Value) > 250 Then
            vsource(j, k) = Left(Worksheets("data").Cells(70 + j, esource.Column + k).Value, 250)
        Else
            vsource(j, k) = Worksheets("data").Cells(70 + j, esource.Column + k).Value
        End If
        Next j
    Next k

    i = 0
    k = 0
    j = 0
    c = 0
    IDNUMBER = 0

    'hire array
        Do While i <= (eref.Row - sref.Row + 1)
                Do While k <= esource.Row

                    If InStr(vsource(k, month - 2), rreference(i, 0)) Then
                        If vsource(k, month - 3) = "" Then

                            IDNUMBER = IDNUMBER + 1
                            name = Worksheets("data").Cells(70 + k, 1).Value 'Employee name
                            empID = Worksheets("data").Cells(70 + k, 2).Value 'Employee ID

                            dumper(j, 0) = "hire"
                            dumper(j, 1) = Str(IDNUMBER)
                            dumper(j, 2) = name
                            dumper(j, 3) = Str(empID)
                            dumper(j, 4) = "-"
                            dumper(j, 5) = vsource(k, month - 2)
                            dumper(j, 6) = Worksheets("data").Cells(70 + k, 133).Value 'Employee Country

                            j = j + 1

                        Else
                        End If
                    Else
                    End If
                    k = k + 1

                Loop
                k = 0
                i = i + 1
        Loop
    FTE_Detail = dumper()
End Function
  1. 首先,我选择范围GH183:GH215
  2. 然后按 F2 并粘贴公式=FTE_detail(GG183,GG215,DP17424,'2013PlanfromBex'!P3,'2013PlanfromBex'!P2369)
  3. 在我之前选择的所有单元格中返回#value!
  4. 我之前和之前已经使用其他数据完成了此过程。不知道为什么不在这种情况下工作。
  5. p.s。:它似乎在调试/监视窗口中构建了所有数组,只有当函数结束时才会将数据从“转储器”粘贴到电子表格中。

3 个答案:

答案 0 :(得分:1)

编辑:我看到@shahkalpesh打败了我...

不是一个真正的答案,而是为了解决一些评论。毫无疑问,可以使用UDF返回值数组。请参阅以下示例:选择2x2范围并输入

=GetData()

并使用Ctrl+Shift+Enter将其作为数组公式输入。

Function GetData()
Dim arr(1 To 2, 1 To 2)

    arr(1, 1) = "1,1"
    arr(1, 2) = "1,2"
    arr(2, 1) = "2,1"
    arr(2, 2) = "2,2"

    'Err.Raise 13      'uncomment to demonstrate #VALUE in all cells    
    GetData = arr

End Function

答案 1 :(得分:0)

无法使用从Worksheet对象调用的UDF来操作工作表上的一系列单元格。

Reposted

  

此处提供更多信息:

     

https://stackoverflow.com/a/15647054/1467082

     

在这里:

     

http://www.excel-it.com/UDF.htm

     通常,子程序可以操作工作表和函数   不能。

     

例外是在子程序中调用的函数可以,   然而,这可能是一个习惯使用函数的坏习惯   而不是将值返回到子程序。

答案 2 :(得分:0)

我弄清楚出了什么问题。 数组内容和175行的功能结果超过了自卸车阵列的大小,即150行。如果发生这种情况,excel电子表格中的结果将返回#value!。 我增加了转储器数组的大小,代码运行得很漂亮。 感谢你的帮助 ! 期待在未来做出更多贡献。 问候 罗德尼