此代码存在一些与您的描述不一致的问题。
LookupRange
是一个变体数组。当我对此进行测试时,它会1004 Method 'Range' of object '_Global' failed
在分配给indexVar
.
- 如果我
Dim LookupRange As String
根据您的评论,我也会收到Type Mismatch
错误消息。
由于LookupRange
应该是范围,所以我将其声明为范围,并Set
在赋值语句中使用关键字。
Set lookupRange = Range("$M$10:$M" & ActiveCell.Row)
- 您的作业中可能存在拼写错误
lookupRange
。在您的公式中,最初您使用$M$1
的是 ,但在您使用的函数中$M$10
。
如果您从 开始此范围$M$10
,并尝试在第 1-9 行之间的任何单元格中计算公式,您将收到错误消息。
在相关说明中,如果 中没有数值,lookupRange
这将返回错误,例如,放入Current()
单元格M2
会生成 的查找范围M1:M2
,其中我没有数值数据。
我不确定您要如何处理此问题,但我的回答包括避免该错误的一种方法。您可以根据需要进行修改。最后:
- 依赖
ActiveCell.Row
似乎是个坏主意,因为这个公式可能会重新计算,产生不希望的结果。
相反,将此作为公式的必需参数,然后您可以从工作表中调用它,例如=Current(Row())
:
综上所述,我认为这应该可行,并且我为未找到匹配错误提供了一个示例/转义。:
Public Function Current(r As Long)
Const bigNumber As Double = 9.99999999999999E+307
Dim wsInfo As Worksheet: Set wsInfo = Worksheets("Info")
Dim lookupRange As Range
Dim indexVar As Long
Dim myVal As Variant
Set lookupRange = Range("$M$1:$M" & r)
If Not Application.WorksheetFunction.Sum(lookupRange) = 0 Then
indexVar = Application.Index(lookupRange, Application.Match(bigNumber, lookupRange))
myVal = Application.WorksheetFunction.VLookup(indexVar, wsInfo.Range("Data"), 4)
Else:
myVal = "No numbers found in: " & lookupRange.Address
End If
Current = myVal
End Function
评论更新
您可以在变量声明之前添加Application.Volatile
链接。这应该强制重新计算:
每当计算发生在工作表上的任何单元格中时。
Worksheets("Info")
但是,当其他工作表(例如,您是另一个工作表)上的值发生更改时,这不会强制计算。
要在每次激活包含该=Current(Row())
函数的工作表时强制重新计算,您可以将其放在工作表的代码模块中:
Private Sub Worksheet_Activate()
Me.Calculate
End Sub
这可能与您所能得到的一样接近——在VLOOKUP
不实际使用VLOOKUP
公式的情况下复制本机功能。
补充说明:
偏爱正确/强类型的变量,我声明indexVar as Long
并创建了一个双精度变量9.99999999999999E+307
(使用这种方式更容易)。我还创建了一个工作表对象变量,我再次发现它们更易于使用。