excel字典对象错误

时间:2016-08-29 13:44:02

标签: vba excel-vba dictionary excel

我有一个我正在使用字典对象的应用程序(具体来说,它是字典字典的字典,因此每个查找都有三个步骤,如果这有意义的话!)。我对这些词典进行了大量查找,并将结果相乘。

问题在于,在应用程序的先前版本中,我使用了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轮函数的奇怪性)。

1 个答案:

答案 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