【问题标题】:Match Index in VBA errorVBA 错误中的匹配索引
【发布时间】:2014-03-28 05:48:52
【问题描述】:

我正在尝试使用索引和匹配工作表函数将用户表单 (ItemNum.value) 中组合框中的项目编号与工作表上的产品列表表 (“产品定价”) 匹配。然后从该工作表(“产品定价”)中提取与同一行匹配的单元格,并将它们复制到输入数据工作表(“查看照明数据”)上的单元格(“i4”)。问题是每次运行宏时都会出现错误“1004 Unable to get the Match Property of the WorksheetFunction class error”

我的代码是:

Private Sub InputLight_Click()
With Sheets("Review Lighting Data")
    .Range("i4").Value = Application.WorksheetFunction.Index(Sheets("Product Pricing").Range("c7:c102"), Application.WorksheetFunction.Match(ItemNum.Value, Sheets("Product Pricing").Range("b7:b102"), 0))
End With
End Sub

从那以后,我尝试创建一个新的工作簿来简化事情。到目前为止,这是我的完整代码:

Private Sub inputbutton_Click()
Dim MatchRow As Long
Dim WS0 As Worksheet, WS1 As Worksheet
Dim R0 As Range, R1 As Range
With ThisWorkbook
    Set WS0 = .Sheets("Review Lighting Data")
    Set WS1 = .Sheets("Product Pricing")
End With
With WS1
    Set R0 = WS1.Range("B7:B11")
    Set R1 = WS1.Range("C7:C11")
End With
MatchRow = Application.Match(itemnum.Value, R0, 0)
MsgBox MatchRow

End Sub


Private Sub UserForm_Initialize()

With Me.itemnum
.AddItem "1001"
.AddItem "1002"
.AddItem "1003"
.AddItem "1004"
.AddItem "1005"
End With

End Sub

我已经在组合框(itemnum)中输入了项目编号,没有空格或任何内容。我什至尝试删除每个数字周围的 " 标记,但这也不起作用。我尝试将 (MatchRow) 输出到 MsgBox 以尝试捕获错误,但它在它之前就中断了。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    问题是当Match 没有在范围内找到值时,它会返回错误。您可以使用IsError 处理这种情况:

    Private Sub InputLight_Click()
        Dim matchRes
    
        With Sheets("Review Lighting Data")
            matchRes = Application.Match(ItemNum.Value, Sheets("Product Pricing").Range("b7:b102"), 0)
            If Not IsError(matchRes) Then
                .Range("i4").Value = Application.Index(Sheets("Product Pricing").Range("c7:c102"), matchRes)
            End If
        End With
    End Sub
    

    【讨论】:

    • +1:因为这与您上次回答的问题完全相同。 :D
    • :) 我着火了,写新答案比找到上一个答案的链接要快:)
    • 真的!当我在寻找链接时看到1 new answer... 时,我实际上已经在我的答案框中轻拍了文本。我立刻想到,这必须是simoco。大声笑。
    【解决方案2】:

    一个好的做法是适当地限定所有内容。这使代码更易于阅读和调试。此外,您必须使用Application.Match 而不是Application.WorksheetFunction...

    Private Sub InputLight_Click()
        Dim MatchRow
        Dim WS0 As Worksheet, WS1 As Worksheet
        Dim R0 As Range, R1 As Range
        With ThisWorkbook
            Set WS0 = .Sheets("Review Lighting Data")
            Set WS1 = .Sheets("Product Pricing")
        End With
        With WS1
            Set R0 = .Range("B7:B102")
            Set R1 = .Range("C7:C102")
        End With
        MatchRow = Application.Match(ItemNum.Value, R0, 0)
        If Not IsError(MatchRow) Then
            WS0.Range("I4").Value = Application.Index(R1, MatchRow)
        End If
    End Sub
    

    在这里发现了一个非常相似的问题:Match Not working Excel: Error 1004 Unable to get the Match Property,其中@simoco 和我也同样处理过。

    【讨论】:

    • 此时返回类型不匹配错误:MatchRow = Application.Match(Ite​​mNum.Value, R0, 0)
    • 错误可能是因为 MatchRow 应该是 Long 但返回错误。删除了 As Long 部分。看看它现在是否有效。
    • 现在它什么都不输出了。我添加了一个 Else Msgbox“错误”并触发,所以它仍然在 Matchrow = Application 处遇到错误...我如何将项目添加到组合框中是否有错误?我在 Userform_Initialize 中使用 With me.ItemNum .AddItem "1001" 等
    • 检查Range("I4")中的值是否与R0中的值完全相同相同。
    • Range("I4") 是一个空白单元格。我想输入在 R1 中找到的与 R0 行匹配的值,该行将项目编号输入到 itemnum.value
    【解决方案3】:

    好吧,在尝试了很多不同的方法来让匹配索引在用户窗体中工作后,我决定稍微“作弊”,并在单元格中使用常规匹配索引函数。非常感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      相关资源
      最近更新 更多