【问题标题】:VBA Lookup MismatchVBA 查找不匹配
【发布时间】:2019-10-16 03:16:11
【问题描述】:

我查看了有关此问题的先前问题,但找不到答案。我在 VBA 中使用 VLOOKUP 来使用基于选择的数据填充用户表单。我继续在某些条目上出现不匹配,而其他条目则有效,现在没有。这是代码:

Private Sub jobRefCbo_Change()
Application.ScreenUpdating = False

Call Lists_sort ' This just sorts a list of the 'Active' data so the user only sees the active jobs in the combo box. 



    Me.nameTxt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 2, False)
    'Me.acNoTxt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 2, False)
    Me.jobDesc2Txt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 3, False)
    'Me.date2Txt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 4, False)
    Me.month2Txt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 5, False)
    Me.timeOnJobTxt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 6, False)
    Me.StatusTxt.Value = Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 7, False)
    Me.startTime2Txt.Value = Format(CDate(Application.WorksheetFunction.VLookup(CDbl(Me.jobRefCbo.Value), Worksheets("Lists ").Range("I3:P21"), 8, False)), "hh:mm:ss AM/PM")

    Application.ScreenUpdating = True

End Sub

一般来说,任何关于这样做的建议都非常感谢。

【问题讨论】:

  • 第一:宏接触工作表的次数越多,代码运行的时间就越长。第二:当尝试将数字与相同数字的字符串表示匹配时,VLookup 有时会失败,反之亦然。我建议将工作表中的数据拉到 excel 中的数组中,循环遍历具有“匹配”的列以识别行,然后从数组中识别的行中提取信息。
  • 似乎只有在工作参考查找中使用字母时才会不匹配。我现在正在测试这个。
  • Mistella 是你的头,它一定是导致错误的字符串解释。如果我可能会问,我如何将数据转换为数组?
  • 如果是这种情况,这将是由包装 Me.jobRefCbo.ValueCDbl 函数引起的。 CDbl 转换为 double,这是一个数字类型。如果Me.jobRefCbo.Value 曾经包含非数字,则CDbl 函数将出错
  • 最简单的解决方法可能是删除 CDbl,但如果您想加快代码速度,我可以添加更多关于将数据拉入数组的信息。

标签: excel vba


【解决方案1】:

修复建议:

Private Sub jobRefCbo_Change()

    Dim m, v, rngSearch As Range

    Application.ScreenUpdating = False

    Lists_sort 'use of Call is deprecated

    v = Trim(Me.jobRefCbo.Value)

    If IsNumeric(v) Then
        Set rngSearch = Worksheets("Lists ").Range("I3:P21")
        'use Match to find a hit in the first column...
        m = Application.Match(CDbl(v), rngSearch.Columns(1), 0)
        If Not IsError(m) Then
            'got a hit so return the values
            With rngSearch.Rows(m)
                Me.nameTxt.Value = .Cells(2).Value
                Me.jobDesc2Txt.Value = .Cells(3).Value
                'etc etc
            End With
        End If
    Else
        MsgBox "Lookup value must be numeric", vbExclamation
    End If

    Application.ScreenUpdating = True

End Sub

【讨论】:

  • 哇,我非常感谢你,感谢你抽出时间来发布这个。这是一个巨大的帮助。
  • @edgarc1981 以防万一您不知道,如果蒂姆的回答解决了您的问题,您可以通过单击投票按钮正下方的复选标记接受它作为您的首选答案。
  • 谢谢,我已经这样做了。感谢您在我学习该平台时的指导和对我的耐心。由于您的专业知识,该工具现在可以完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多