Excel 可能使我的vba代码更加紧凑和简化

Excel 可能使我的vba代码更加紧凑和简化,excel,vba,Excel,Vba,下面是我的vba代码,用于在userform文本框中检查3行上的任何重复数据。一旦发现重复数据,它将通知用户并选择重复数据的整行。它的工作和完成工作。但是,代码似乎很长且重复。是否可以简化我的代码并使其更紧凑?我仍然在学习vba代码,不知道更多的高级函数来获得更紧凑的代码。多谢各位 Private Sub ISBNTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim ISBN Dim FoundISBN As Range

下面是我的vba代码,用于在userform文本框中检查3行上的任何重复数据。一旦发现重复数据,它将通知用户并选择重复数据的整行。它的工作和完成工作。但是,代码似乎很长且重复。是否可以简化我的代码并使其更紧凑?我仍然在学习vba代码,不知道更多的高级函数来获得更紧凑的代码。多谢各位

Private Sub ISBNTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim ISBN
    Dim FoundISBN As Range
    Dim Search As String
    Dim ws As Worksheet

    Set ws = Worksheets("booklist")
    Search = ISBNTextBox.Text
    Set FoundISBN = ws.Columns(5).Find(Search, LookIn:=xlValues, Lookat:=xlWhole)
    ISBN = Application.WorksheetFunction.CountIf(ws.Range("E:E"), Me.ISBNTextBox)
    If ISBN > 0 Then
        ISBN_checker.Caption = "Duplicate" & " " & FoundISBN.Address
        FoundISBN.EntireRow.Select
    Else
        ISBN_checker.Caption = ChrW(&H2713)
    End If

End Sub
Private Sub TitleTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim Title
    Dim FoundTitle As Range
    Dim Search As String
    Dim ws As Worksheet

    Set ws = Worksheets("booklist")
    Search = TitleTextBox.Text
    Set FoundTitle = ws.Columns(2).Find(Search, LookIn:=xlValues, Lookat:=xlWhole)
    Title = Application.WorksheetFunction.CountIf(ws.Range("B:B"), Me.TitleTextBox)
    If Title > 0 Then
        Title_checker.Caption = "Duplicate" & " " & FoundTitle.Address
        FoundTitle.EntireRow.Select
    Else
        Title_checker.Caption = ChrW(&H2713)
    End If

End Sub

Private Sub CallNoTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim CallNo
    Dim FoundCallNo As Range
    Dim Search As String
    Dim ws As Worksheet

    Set ws = Worksheets("booklist")
    Search = CallNoTextBox.Text
    Set FoundCallNo = ws.Columns(6).Find(Search, LookIn:=xlValues, Lookat:=xlWhole)
    CallNo = Application.WorksheetFunction.CountIf(ws.Range("F:F"), Me.CallNoTextBox)
    If CallNo > 0 Then
        CallNo_checker.Caption = "Duplicate" & " " & FoundCallNo.Address
        FoundCallNo.EntireRow.Select
    Else
        CallNo_checker.Caption = ChrW(&H2713)
    End If

End Sub
因为Search=ISBNTextBox.Text,所以

都被用来做同样的事情。您可以将代码重写为

Option Explicit

Private Sub ISBNTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim FoundISBN As Range
    Dim ws As Worksheet

    Set ws = Worksheets("booklist")
    ISBN_checker.Caption = ChrW(&H2713) '<~~ Set this as default value

    Set FoundISBN = ws.Columns(5).Find(What:=ISBNTextBox.Text, LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    '~~> Check if find returned anything
    If Not FoundISBN Is Nothing Then
        ISBN_checker.Caption = "Duplicate" & " " & FoundISBN.Address
        FoundISBN.EntireRow.Select
    End If
End Sub
注意:使用时,请记住两件事

Excel会记住.Find的最后设置,因此为了避免任何混淆,请使用它的所有参数。 在尝试使用它之前,请始终检查.Find是否返回了某些内容,否则将出现运行时错误91-对象变量或With block Variable not set Error
这里有很多重复,变量部分的数量有限,所以将公共代码重构为一个单独的子代码并对其进行参数化

更简单:

Private Sub ISBNTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    DupCheck ISBNTextBox.Text, 5, ISBN_checker    
End Sub

Private Sub TitleTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    DupCheck TitleTextBox.Text, 2, Title_checker    
End Sub

Private Sub CallNoTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    DupCheck CallNoTextBox.Text, 6, CallNo_checker    
End Sub

Sub DupCheck(txt, ColNo As Long, theLabel As Object)
    Dim m
    With Worksheets("booklist")
        m = Application.Match(txt, .Columns(ColNo), 0)
        If Not IsError(m) Then '<-Fixed
            theLabel.Caption = "Duplicate" & " " & .Cells(m, ColNo).Address
            .Rows(m).Select
        Else
            theLabel.Caption = ChrW(&H2713)
        End If
    End With
End Sub

如果你有工作代码,你只是想得到帮助来改进,你应该继续问——这正是创建它的原因。这个网站是关于你无法使用的代码的问题。好的,注意。非常感谢。我会在那里问你,你也应该在这里删除它。强烈建议不要在多个网站上发布相同的问题:-@肯怀特:实际上不是。我最近也意识到了这一点。这是两个网站的主题:你可能想看看和@SiddharthRout:政策非常不明确。根据你发布的第二个链接,似乎根本没有存在的理由,因为这里没有任何与提问相关的话题。看来,SO应该采取一套明确的指导方针并加以实施,而不是在什么应该/不应该/可能/可能应该/谁知道现在已经到位的问题上来回摇摆。现在在这里做任何事情都已经够困难的了,来自版主和工作人员的相互冲突或混乱的指导也于事无补。
Option Explicit

Private Sub ISBNTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim FoundISBN As Range
    Dim ws As Worksheet

    Set ws = Worksheets("booklist")
    ISBN_checker.Caption = ChrW(&H2713) '<~~ Set this as default value

    Set FoundISBN = ws.Columns(5).Find(What:=ISBNTextBox.Text, LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    '~~> Check if find returned anything
    If Not FoundISBN Is Nothing Then
        ISBN_checker.Caption = "Duplicate" & " " & FoundISBN.Address
        FoundISBN.EntireRow.Select
    End If
End Sub
Private Sub ISBNTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    DupCheck ISBNTextBox.Text, 5, ISBN_checker    
End Sub

Private Sub TitleTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    DupCheck TitleTextBox.Text, 2, Title_checker    
End Sub

Private Sub CallNoTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    DupCheck CallNoTextBox.Text, 6, CallNo_checker    
End Sub

Sub DupCheck(txt, ColNo As Long, theLabel As Object)
    Dim m
    With Worksheets("booklist")
        m = Application.Match(txt, .Columns(ColNo), 0)
        If Not IsError(m) Then '<-Fixed
            theLabel.Caption = "Duplicate" & " " & .Cells(m, ColNo).Address
            .Rows(m).Select
        Else
            theLabel.Caption = ChrW(&H2713)
        End If
    End With
End Sub