【问题标题】:Find Function in a Userform based on multiple criteria根据多个条件在用户窗体中查找函数
【发布时间】:2017-09-15 13:22:34
【问题描述】:

我创建了一个包含多个textboxes 的用户表单,并使用foundcell 根据参考号返回一行的值。

然而,我想要做的是搜索一个基于下面searchrange 的引用,如果.Range("AK") 为空白则返回。否则一个 msgbox 表示条件无效。

请看我尝试的代码

Private Sub CommandButton1_Click()

Dim searchRange As Range
Dim foundCell As Range
Dim mysearch As String

mysearch = Ref.Value

With Sheets("X")
    Set searchRange = Sheets("X").Range("AB2", .Range("AB" & .Rows.Count).End(xlUp))
End With

Set foundCell = searchRange.Find(what:=mysearch, Lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)

        If Not foundCell And foundCell.Offset(0, 9) Is Nothing Then

            Me.C.Value = foundCell.Offset(0, -12).Value
            Me.DD.Value = foundCell.Offset(0, -10).Value
            Me.RD.Value = foundCell.Offset(0, -16).Value
            Me.BN.Value = foundCell.Offset(0, -9).Value
            Me.FN.Value = foundCell.Offset(0, -8).Value
            Me.SHARP.Value = foundCell.Offset(0, -1).Value
            Me.PGP.Value = foundCell.Offset(0, -7).Value
            Me.ISS.Value = foundCell.Offset(0, -6).Value
            Me.DE.Value = foundCell.Offset(0, -2).Value
            Me.UN.Value = foundCell.Offset(0, -5).Value
            Me.W.Value = foundCell.Offset(0, -4).Value
            Me.IN.Value = foundCell.Offset(0, -3).Value
            Me.CVAL.Value = foundCell.Offset(0, -20).Value
            Me.ADD.Value = foundCell.Offset(0, -11).Value
            Me.RESPONSE.Value = foundCell.Offset(0, 1).Value
            Me.NRESPONSE.Value = foundCell.Offset(0, 2).Value
            Me.MAREC.Value = foundCell.Offset(0, 4).Value
            Me.MORET.Value = foundCell.Offset(0, 5).Value
            Me.CNREC.Value = foundCell.Offset(0, 8).Value
            Me.CNREF.Value = foundCell.Offset(0, 6).Value
            Me.NVALUE.Value = foundCell.Offset(0, 7).Value
            Me.CBY.Value = foundCell.Offset(0, 10).Value
            Me.CDAT.Value = foundCell.Offset(0, 11).Value

        Else

            MsgBox "The Reference you have entered does not qualify and cannot be located. Please try another reference!"
End If

End Sub

【问题讨论】:

    标签: vba excel search userform


    【解决方案1】:

    您需要根据自己的条件对 foundCell 进行空值检查,VBA 的 And 逻辑运算符不会像 VB.NET 的 AndAlso 和 C# 的 && 运算符那样短路。

    If Not foundCell Is Nothing Then
    

    另外foundCell.Offset(0,9) 可能包含一个错误值,这将使任何比较操作引发“类型不匹配”运行时错误。使用IsError 来验证其错误状态您认为它包含除错误之外的任何内容之前:

        If Not IsError(foundCell.Offset(0, 9).Value) Then
    

    最后,如果您的意图是验证 foundCell.Offset(0, 9) 是否不为空,您可以通过多种方式进行检查,但 Is Nothing 不是其中之一:

    • 如果单元格不包含任何内容,IsBlank(foundCell.Offset(0, 9).Value) 将返回 True - 没有值,没有公式。
    • 如果单元格的值为空字符串,或者其公式的计算结果为空字符串,foundCell.Offset(0, 9).Value <> vbNullString 将返回 True
    • foundCell.Offset(0, 9).Value <> "" 的作用与 <> vbNullString 相同。

    因此:

    If Not foundCell Is Nothing Then
        If Not IsBlank(foundCell.Offset(0, 9).Value) Then
    

    或者:

    If Not foundCell Is Nothing Then
        If Not IsError(foundCell.Offset(0, 9).Value) Then
            If foundCell.Offset(0, 9).Value <> vbNullString Then
    

    【讨论】:

      【解决方案2】:

      If Not foundCell Is Nothing And foundCell.Offset(0, 9) """" Then

      【讨论】:

      • 这将在foundCell Is Nothing 时引发运行时错误 91。条件表达式在 VBA 中不会短路,无论第一部分评估为 False,它们都会被完全评估。此外,&lt;&gt; """" 表示您正在验证单元格 literally 不包含两个双引号,乍一看,只要foundCell 不是@,它就会评估为True 987654326@.
      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多