【问题标题】:Excel VBA Array - Getting #Value! error when trying to dump array into spreadsheetExcel VBA 数组 - 获取#Value!尝试将数组转储到电子表格时出错
【发布时间】:2013-06-03 20:53:26
【问题描述】:

如果有人可以帮助我编写此代码,我将不胜感激。 - 目标:我试图用两个数组之间的匹配填充一个数组(一个数组是我在第二个数组中寻找的参考数据)。

代码和数组在开发屏幕的 Watches 和 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. 我之前已经用其他数据完成了这个过程并且工作过。不知道为什么在这种情况下不起作用。

p.s.:它似乎在调试/监视窗口中构建了所有数组,只有当函数结束时,它将数据从“转储器”粘贴到电子表格时失败。

【问题讨论】:

  • 你是如何使用/调用这个函数来将它返回的数据分配给一个范围的?
  • 我正在选择一个范围并编写函数并按 crtl+shift+enter。 tkns :)
  • 不可能使用函数将值返回到单元格区域,请参阅here for details。您将不得不使用子程序来操作一系列单元格。
  • @shahkalpesh 不可能使用 UDF 将值数组写入多单元格范围。这似乎是 OP 正在尝试做的事情。
  • @shahkalpesh 我从 OP 问题中了解到他正在从工作表单元格调用此函数。也许我误解了,他说的是“我正在选择一系列单元格......”等等。

标签: arrays excel vba


【解决方案1】:

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

不是真正的答案,而是解决一些 cmets。毫无疑问,您可以使用 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

【讨论】:

  • 在我意识到 OP 在问什么(假设是这样)之后,这让我在工作中迟到了……
  • @tim willians 是的,这正是我想要做的(过去使用其他数据和功能完成的)。虽然,不确定我现在缺少什么......:(
  • @Tim:我已经修改了答案来演示#VALUE的返回(在Err.Raise的帮助下)
【解决方案2】:

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

Reposted:

更多信息在这里:

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

这里:

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

一般来说,子程序可以操作工作表和函数 不能。

例外是从子例程中调用的函数可以, 但是,将函数用于任何事情可能是一个坏习惯 除了将值返回给子例程。

【讨论】:

  • 您所指的与 OP 所做的不同。您是正确的,UDF 不能直接将信息放置到调用它的工作表(或任何其他工作表)上。但是,它可以返回一个数组,如果公式是作为数组 fromula 输入的,则返回的数组将填充所选范围。
  • 谢谢两位,看来我误解了原来的问题。
【解决方案3】:

我知道出了什么问题。 175 行的数组内容和函数结果超过了 150 行的 dumper 数组的大小。如果发生这种情况,excel 电子表格中的结果将返回 #value!。 我增加了 dumper 数组的大小,并且代码运行良好。 感谢你的帮助 ! 期待在未来做出更多贡献。 问候 罗德内

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多