【问题标题】:VBA Index Match Run-time error'13': Type MismatchVBA 索引匹配运行时错误'13':类型不匹配
【发布时间】:2016-10-11 05:42:16
【问题描述】:

我收到运行时错误“13”:以下代码的类型不匹配。根据我对这个错误的理解,它似乎是由公式中有两种类型的变量引起的。这对我来说有点正确,因为我的索引匹配函数将单元格与数字连接起来,将单元格与文本连接起来以返回一个数字。我尝试将数字格式化为文本,但不断收到相同的错误。这似乎是问题吗?如果是这样,有没有人知道这种/不同的方法来做我在这里尝试做的事情?谢谢!

Sub Lookup2()
    Dim cell As Range
    Dim lookUp1Sht As Worksheet
    Dim lookUp2Sht As Worksheet
    Dim lookUp2Rng As Range
    Dim val1 As Variant

    Set lookUp1Sht = ThisWorkbook.Worksheets("New") 
    Set lookUp2Sht = ThisWorkbook.Worksheets("input")
    Set lookUp2Rng = ThisWorkbook.Worksheets("comp").Range("A1:C136")

    For Each cell In Range("CaliforniaL") 
        With cell '
            Select Case True
                Case IsNumeric(.Value) 
                .Offset(0, 1).Value = CDbl(.Value)
                Case Else
                .Offset(0, 1).Value = (Application.WorksheetFunction.Index(lookUp2Sht.Range("K:K"), Application.WorksheetFunction.Match(cell.Value & cell.Offset(0, -3), lookUp2Sht.Range("A:A") & lookUp2Sht.Range("H:H"), 0)))
            End Select
        End With
    Next
End Sub

【问题讨论】:

  • 哪一行特别出错了?如果您在中断模式下将鼠标悬停在某物上,您能否查看所有函数/变量的值以确定哪个函数/变量返回了 bum 值?
  • 它在具有索引匹配功能的行上。当我将鼠标悬停在行的每个部分上时,它会显示 .Offset (0,1).Value = Empty
  • 对于 Range().Cells 中的每个单元格
  • 代码中lookUp2Sht.Range("A:A") & lookUp2Sht.Range("H:H") 的部分看起来“错误”。我不确定 Excel 将如何解释连接两个完整列范围的尝试。刚刚检查过,Match 无法处理两列 - 一次在两列中查找值真的没有多大意义。
  • 认为 我已经弄清楚了你想用你的 Match 做什么 - 你是否试图找到 cell.ValuelookUp2Sht.Range("A:A") 中存在的位置和,同时cell.Offset(0, -3)存在于lookUp2Sht.Range("H:H")中?

标签: vba excel


【解决方案1】:

我编写了一个执行“双重”匹配的函数。 (在 Excel 中可能有一个,但我懒得去寻找它。)使用它,并根据您的 cmets 中的一些说明,您的代码可以重写如下:

Sub Lookup2()
    Dim cell As Range
    Dim lookUp1Sht As Worksheet
    Dim lookUp2Sht As Worksheet
    Dim lookUp2Rng As Range
    Dim val1 As Variant

    Set lookUp1Sht = ThisWorkbook.Worksheets("New")
    Set lookUp2Sht = ThisWorkbook.Worksheets("input")
    Set lookUp2Rng = ThisWorkbook.Worksheets("comp").Range("A1:C136")

    For Each cell In Range("CaliforniaL")
        With cell
            If IsNumeric(.Value) Then
                .Offset(0, 1).Value = CDbl(.Value)
            Else
                val1 = DoubleMatch(lookUp1Sht.Cells(.Row, "A").Value, lookUp2Sht.Range("A:A"), _
                                   lookUp1Sht.Cells(.Row, "L").Value, lookUp2Sht.Range("H:H"))
                If IsError(val1) Then
                    .Offset(0, 1).Value = val1
                Else
                    .Offset(0, 1).Value = lookUp2Sht.Cells(val1, "K").Value
                End If
            End If
        End With
    Next
End Sub

Function DoubleMatch(Key1 As Variant, Range1 As Range, Key2 As Variant, Range2 As Range) As Variant
    'This function only performs an "Exact Match"
    If Range1.Rows.Count <> Range2.Rows.Count Then
        DoubleMatch = CVErr(xlErrRef)
        Exit Function
    End If
    If Range1.Columns.Count > 1 Or Range2.Columns.Count > 1 Then
        DoubleMatch = CVErr(xlErrRef)
        Exit Function
    End If

    Dim c As Range
    Dim r As Long
    Dim address1 As String
    With Range1
        Set c = .Find(What:=Key1, LookIn:=xlValues, LookAt:=xlWhole)
        If c Is Nothing Then
            DoubleMatch = CVErr(xlErrNA)
            Exit Function
        End If
        address1 = c.Address

        Do
            r = c.Row - Range1.Row + 1
            If Key2 = Range2(r, 1).Value Then
                DoubleMatch = r
                Exit Function
            End If
            Set c = .Find(What:=Key1, LookIn:=xlValues, LookAt:=xlWhole, After:=c)
            If c Is Nothing Then
                DoubleMatch = CVErr(xlErrNA)
                Exit Function
            End If
            If c.Address = address1 Then
                DoubleMatch = CVErr(xlErrNA)
                Exit Function
            End If
        Loop
    End With
    DoubleMatch = CVErr(xlErrNA)
End Function

【讨论】:

    【解决方案2】:

    我猜问题出在这部分:

    cell.Value & cell.Offset(0, -3)
    

    cell.value 返回单元格中的数据,而cell.Offset returns a range object。由于Match 函数需要lookup_value,并且由于您不能连接值和范围对象,这将导致错误。事实上,你根本不能连接范围,所以你的 match 函数的第二个参数也会失败:

    lookUp2Sht.Range("A:A") & lookUp2Sht.Range("H:H") 
    

    如果您将这些公式放在工作表的单元格中(例如,=match(A2 &amp; d2, A:A &amp; H:H, 0),您会发现它们不起作用。

    我从未完全看到在 VBA 代码中使用工作表函数的价值。我并不是说没有价值,只是我从未见过需要。

    【讨论】:

    • cell.Value &amp; cell.Offset(0, -3) 将是有效的 - 单元格对象的默认属性(至少在那种情况下)是它的值,所以 cell.Offset(0, -3) 等效于 cell.Offset(0, -3).Value
    • 我只是使用了工作表函数,因为我是 VBA 新手,而且我很熟悉。您知道不使用工作表函数的不同方法吗?