Возможно для моего кода VBA более компактным и упрощенным - PullRequest
0 голосов
/ 01 февраля 2020

Мой код VBA ниже, чтобы проверить текстовое поле пользовательской формы на наличие дублирующихся данных в 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

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Поскольку Search = ISBNTextBox.Text, то

Set FoundISBN = ws.Columns(5).Find(Search, LookIn:=xlValues, Lookat:=xlWhole)

и

ISBN = Application.WorksheetFunction.CountIf(ws.Range("E:E"), Me.ISBNTextBox)

используются для одной и той же вещи. Вы можете переписать свой код как

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

Примечание : при использовании .Find помните 2 вещи

  1. Excel запоминает последние настройки .Find и следовательно, чтобы избежать путаницы, используйте все ее параметры.
  2. Всегда проверяйте, вернул ли .Find что-то или нет, прежде чем пытаться использовать его, иначе вы получите «Ошибка времени выполнения 91 - Переменная объекта или С переменной блока» не установлена ​​"ошибка
0 голосов
/ 01 февраля 2020

Здесь много повторений, с ограниченным числом переменных частей, так что реорганизуйте общий код в отдельный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...