【问题标题】:Find function and if elseif to Avoid Duplicates from User Form input查找函数和 if elseif 以避免用户表单输入的重复
【发布时间】:2019-11-15 09:32:14
【问题描述】:

我对 VBA 非常陌生,并且一直在努力编写用户表单的代码,该用户表单需要在添加表格之前检查输入值以避免重复并在消息框中提供方向。

当用户单击“转移”命令按钮时,我希望代码首先查看用户尝试输入的 WONumber,看看是否已经在桌子上。如果 WONumber 不在表格中,则会出现一个消息框,告诉用户 WONumber 不存在。

如果 WONumber 在表上,我希望代码在所有 WONumber 与其输入匹配的情况下查看 SubName,并查看他们尝试输入的 SubName 是否已经存在于具有关联 WONumber 的表上。如果 SubName 已经在带有 WONumber 的表上,则会出现一个 msgbox,让用户知道 SubName 已经在 WONumber 上。如果 SubName 在表上但与用户输入的 WONumber 不同,则将具有关联 WONumber 的 SubName 添加到表中。本质上,WONumber 是表唯一的,SubName 是 WONumber 唯一的,但不是表唯一的。 (用户应该能够添加 SubName = "Smith" 与 WONumber = "5" 和 SubName = "Smith" 与 WONumber = "500" 但不应该能够添加 SubName = "Smith" 与 WONumber = "5" 两次。 )

我已经尝试过 If Not Nothing 的多种组合,因为我读到有时从那个方向工作会更容易。

我一般对 VBA 的经验很少,所以我不知道 .Find 是返回一个值还是一个位置,所以我编写的 ElseIf 条件可能根本没有意义,因为代码可能正在寻找一个位置和我要求它匹配文本。

我已尝试将 FoundWO.Value = PsblWOMatch.Value 和 FoundSub.Value = FoundSubName.Value 作为 Elseif 条件以及 .text。

我不确定 FoundWO 作为 Range,FoundSub 作为 Range,因为这似乎暗示 FoundWO 将是一组值,并且将一组数字与一个 PsblWOMatch 等同起来真的没有意义。

我还发现了一些关于特定错误代码 91 的 YouTube 视频,这与我的代码有关,不包括作为工作表的 dim ws 是问题,但是当我尝试更正它以匹配示例时,我得到了相同的结果错误代码只是在不同的行上。

Private Sub cmdTransfer_Click()

    Dim FoundWO As Range
    Dim PsblWOMatch As String
    PsblWOMatch = txtWONumber.Text

    Dim FoundSub As Range
    Dim PsblSubMatch As String
    PsblSubMatch = txtSubName.Text

    Dim eRow As Long
    eRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

    Set FoundWO = ActiveSheet.ListObjects("TableWO").ListColumns(1).DataBodyRange.Find(What:=PsblWOMatch, LookIn:=xlValues, Lookat:=xlWhole)
    Set FoundSub = ActiveSheet.ListObjects("TableWO").ListColumns(2).DataBodyRange.Find(What:=PsblSubMatch, LookIn:=xlValues, Lookat:=xlWhole)

    'If Condition 1 then
    If FoundWO Is Nothing Then
        'Code to execute
        MsgBox "Work Order does not exist. Please add Work Order before adding subcontractors."

    'If Condition 2 then
    ElseIf FoundWO = PsblWOMatch And FoundSub = PsblSubMatch Then
        'Code to execute
        MsgBox "SubContractor has already been added to Work Order."

    Else
        'Code to execute
        Cells(eRow, 1).Value = txtWONumber.Text
        Cells(eRow, 2).Value = ""
        Cells(eRow, 3).Value = txtSubName.Text
        Cells(eRow, 4).Value = txtsubLocation.Text

    End If

    txtWONumber.Text = ""
    txtSubName.Text = ""
    txtsubLocation = ""
    txtWONumber.SetFocus

End Sub

我已经能够让 msgbox 出现,告诉用户 WONumber 不存在。当 WONumber 确实存在时,我已经能够添加一个 SubName。但我收到运行时错误“91”:对象变量或未设置块变量。调试亮点位于 ElseIf 行。

【问题讨论】:

    标签: excel vba if-statement userform


    【解决方案1】:

    几点观察: 首先,.find 属性返回一个 Range 对象。在 ElseIf 语句中,您将其与字符串变量进行比较。

    如果要将范围对象的值与字符串进行比较,请尝试以下操作: ElseIf FoundWO.value = PsblWOMatch 和 FoundSub.value = PsblSubMatch

    接下来,尽管您测试了 FoundWO 的存在,但您永远不会测试 FoundSub 的存在。如果未找到分包商,您将收到 Object Variable Not Set 错误。在尝试使用此对象之前,以与测试 FoundWO 相同的方式对此进行测试。

    希望这会有所帮助...

    【讨论】:

    • 谢谢。我认为范围/字符串比较是其中的一部分。但无法通过它进行推理并在我的脑海中理解它。
    • 跟进问题。为了处理子名称是否存在的测试,我想确保我只查看 WONumber 与用户输入 WONumber 匹配的范围以及该 WONumber 上的所有关联子名称。我是否正确地认为我需要定义一个新范围,即 WONumber.value = user input 和 SubName 的交集,并将用户输入 SubName 与新范围进行比较?在某些情况下,SubName 确实存在但与同一个 WONumber 没有关联。
    • 首先,测试对象是否存在。在您知道找到范围之前,您不应该尝试将其与任何东西进行比较。不需要创建另一个范围对象。可以通过嵌套“If..Then..Else”语句来处理比较。
    • 我认为您正在寻找类似的内容: If FoundWO Is Nothing Then MsgBox "工单不存在。请在添加分包商之前添加工单。" Else If FoundSub is nothing then Cells(eRow, 1).Value = txtWONumber.Text Cells(eRow, 2).Value = "" Cells(eRow, 3).Value = txtSubName.Text Cells(eRow, 4).Value = txtsubLocation.Text Else MsgBox "分包商已添加到工单中。"结束如果结束如果结束
    【解决方案2】:

    我认为您正在寻找类似的东西:

    If FoundWO Is Nothing Then 'need to add a work order first
      MsgBox "Work Order does not exist. Please add Work Order before adding subcontractors."
    Else
      If FoundSub Is Nothing Then 'No subcontractor found. OK to add.
        Cells(eRow, 1).Value = txtWONumber.Text
        Cells(eRow, 2).Value = ""
        Cells(eRow, 3).Value = txtSubName.Text
        Cells(eRow, 4).Value = txtsubLocation.Text
      Else
        MsgBox "SubContractor has already been added to Work Order." 'Someone already added the subcontractor
      End If
    End if
    

    【讨论】:

    • 我非常感谢这个反馈。在您回复后,我昨天尝试使用 If FoundSub is Nothing Ok 添加路由,但我没有收到错误消息,但它允许将重复的 FoundSub 添加到 WONumber。
    • 我探索了基于将 WONumber 添加到集合然后查看集合中的 SubName 来创建集合的想法。我仍在学习 VBA,所以我不确定是否需要 Collection,或者交叉路口是否会更加精简。就像我说的,我真的很感激这些反馈。您已经提供的见解非常有用。
    • 我发布的代码只会在您正在搜索的范围内不存在的情况下添加 FoundSub。如果您还没有,请尝试一下。
    • 使用值时,您还需要确保拼写完全相同。匹配字符串时,“重复”一词看似简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多