我有一个我正在使用字典对象的应用程序(具体来说,它是字典字典的字典,因此每个查找都有三个步骤,如果这有意义的话!)。我对这些词典进行了大量查找,并将结果相乘。
问题在于,在应用程序的先前版本中,我使用了VLookup函数来完成此功能,当我尝试查找不存在的密钥时,它会出错。现在,它返回一个“空”,Excel很高兴乘以我已经拥有的任何东西并返回零。这很难跟踪,我更喜欢它像以前一样返回错误。
是否有一些我可以改变以使其返回错误,就像使用VLookup一样,或者我是否需要创建一个新的类模块来执行此操作?类模块可能需要我要重新编写大量的代码,我想避免(我需要在代码中更新数百个查找)。
感谢。
以下是我的一些代码:
这是我用来将所有表加载到字典中的模块:
Sub LoadFactorsAndBaseRates()
Dim t As Double
t = Timer
Dim n As Name
Dim TempArray()
Dim dict1 As Dictionary
Dim dict2 As Dictionary
Dim i As Integer
Dim j As Integer
For Each n In ThisWorkbook.Names
If InStr(1, n.RefersTo, "#") <> 0 Or InStr(1, n.RefersTo, "\") Then GoTo skipname
If Not FactorLookup.Exists(n.Name) And n.RefersToRange.Parent.Name <> "Rate Matrix" And InStr(1, n.Name, "Print") = 0 And InStr(1, n.Name, "FilterDatabase") = 0 And n.Name <> "Policies" Then
Set dict1 = New Dictionary
On Error GoTo err1
TempArray = n.RefersToRange.Value
For j = 1 To n.RefersToRange.Columns.Count
On Error Resume Next
Set dict2 = New Dictionary
For i = 1 To UBound(TempArray, 1)
dict2.Add TempArray(i, 1), TempArray(i, j)
Next i
dict1.Add j, dict2
Next j
Erase TempArray
FactorLookup.Add n.Name, dict1
End If
skipname:
Next n
Exit Sub
err1:
If Err.number = 1004 Then Resume skipname
End Sub
以下是查找代码的示例:
CoverageColumn = 2
'Base Rate
Temp = FactorLookup("Base_Rates")(CoverageColumn)(State & "_" & Company & "_" & Terr)
If Vehicle <> "Snowmobile" Then
'Class 1
x = FactorLookup("Class1")(CoverageColumn)(State & "_" & Company & "_" & Class1)
Temp = xRound(Temp * x, 1)
'Class 2
x = FactorLookup("Class2")(CoverageColumn)(State & "_" & Company & "_" & Class2)
Temp = xRound(Temp * x, 1)
'Class 3
x = FactorLookup("Class3")(CoverageColumn)(State & "_" & Company & "_" & Class3)
Temp = xRound(Temp * x, 1)
'Class 4
x = FactorLookup("Class4")(CoverageColumn)(State & "_" & Company & "_" & Class4)
Temp = xRound(Temp * x, 1)
代码基本上只是一堆页面:查找,乘,舍入到最接近的十分之一,重复。偶尔,我们会添加一个步骤而不是乘法。
xRound函数添加0.0000001,然后使用Round函数舍入到指定的小数位数(以解释Excel VBA轮函数的奇怪性)。
答案 0 :(得分:0)
你需要创建一个函数来&#34; wrap&#34;你的顶级词典,所以你可以用三个键来调用它#34;如果该组合不存在,则返回错误值。
Function DoFactorLookup(k1, k2, k3) As Variant
Dim d, d2, rv
rv = CVErr(xlErrNA) ' #N/A error value
If FactorLookup.exists(k1) Then
Set d = FactorLookup(k1)
If d.exists(k2) Then
Set d2 = d(k2)
If d2.exists(k3) Then
rv = d2(k3)
End If
End If
End If
DoFactorLookup = rv
End Function