仅限VBA用户定义函数在工作簿

时间:2017-12-12 16:38:32

标签: excel excel-vba user-defined-functions vba

我有以下代码从excel中的表创建数组,然后根据输入中的多个条件搜索该数组。

Function output_string(id As Long, dt As Date, descr As String)

'set variables
Dim myarray As Variant
Dim ws As Worksheet
Dim col_count As Integer
Dim row_count As Long
Dim source_range As Range

'set worksheet
Set ws = Worksheets("Data Store")

dt = DateValue(app_dt)

'set up column and row counts for populated range
col_count = ws.Range("A2").End(xlToRight).Column
row_count = ws.Range("A2").End(xlDown).Row

'set range for populated cell space
Set source_range = ws.Range(Cells(2, 1), Cells(row_count, col_count))

'create the dimensions of the array that will store the table
ReDim myarray(1 To source_range.Rows.Count, 1 To source_range.Columns.Count)

'load data from excel table into array
myarray = source_range.Value


'get row with matching criteria
For i = LBound(myarray) To UBound(myarray)
    If myarray(i, 1) = id And dt >= myarray(i, 2) And dt <= myarray(i, 4) _
       And descr = myarray(i, 5) Then
       output_string = myarray(i, 3)
       Exit For
    End If
Next i

End Function

该功能提供正确的输出。问题是该功能仅适用于Data Store工作表。当我输入完全相同的输入时,所有其他工作表都会返回#VALUE!错误。该函数的参数可以是来自其他工作表的单元格引用,而不会出错。

此外,每隔一段时间(似乎随机)Data Source标签上的工作功能也会从正确的值转换为#VALUE!

我在我正在使用的同一工作簿中的常规模块中具有该功能。该模块中还有一个子程序。

我真的很难过这个。有没有人见过这个/你知道一个解决方案吗?

1 个答案:

答案 0 :(得分:1)

正如您在此处的评论中所提到的,这一行导致了问题:

'set range for populated cell space
Set source_range = ws.Range(Cells(2, 1), Cells(row_count, col_count))

问题是Cells(2,1)Cells(row_count, col_count)是范围对象,但未通过其工作表进行正确限定。我知道这似乎违反直觉,因为您已在此处说ws.range,但这些range对象也必须使用ws进行限定:

'set range for populated cell space
 Set source_range = ws.Range(ws.Cells(2, 1), ws.Cells(row_count, col_count))

如果没有该资格,它将使用Application.Activesheet作为默认值,这可能是您在此UDF上下文中充当Application.Caller.Parent的工作表。所以它正在尝试在ws中制作一个由activesheet中的起始和结束单元格组成的范围,这是无意义的。