Ошибка выполнения 91 - при тестировании кода в пользовательской форме - PullRequest
0 голосов
/ 17 июня 2019

Office 360, 64 бит, Excel.Подпрограмма Private Sub Card_FindCardNumber_AfterUpdate() - это textbox (Card_FindCardNumber), что после того, как я ввел номер, который запрашиваю, код должен проверить, существует ли он.

Во время тестирования кода не имеет значения, существует ли это число или нет, я получаю то же сообщение об ошибке "Runtime Error 91", Object Variable or With Block variable not set.

Я любитель VBA и не могу понять, почему существует проблема с конкретной строкой кода.

Я адаптировал код от Тревора Истона, (Онлайн-обучение ПК) " Excel VBA с пользовательской формой Vlookup " от YouTube и его веб-сайта:

На самом деле Ws01 - это кодовое имя электронной таблицы, представляющей рабочий лист cnVisitorCard_Database.

Vlookupотносится к именованному диапазону: «LookupCardNo», который имеет функцию смещения, охватывающую данные из 9 столбцов (от столбца AC (Card #) до последнего столбца диапазона имен AK)

    Private Sub Card_FindCardNumber_AfterUpdate()
              'Define the Variables
              Dim ws01 As Worksheet
              Dim cnVisitorCard_Database As Worksheet
              Set ws01 = cnVisitorCard_Database

             'Check to see if value exists
             If WorksheetFunction.CountIf(ws01.Range("AC:AC"), Me.Card_FindCardNumber.Value) = 0 Then
                MsgBox "This is an incorrect ID"
                Me.Card_FindCardNumber.Value = ""
                Exit Sub
             End If

            'Lookup values based on first control
               With Me
                .Card_ExpiryDate = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 2, 0)
                .Card_Status = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 3, 0)
                .Card_ReturnDate = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 4, 0)
                .Card_Description = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 5, 0)
                .Card_TypeCode_Hidden = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 6, 0)
                .Card_ValidNo_ofDays_Hidden = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 7, 0)
                .Card_UpdatedInHW = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 8, 0)
                .Card_UpdatedInFF = Application.WorksheetFunction.VLookup(CLng(Me.Card_FindCardNumber), ws01.Range("LookupCardNo"), 9, 0)

                End With

     End Sub

Я получаюошибка 91 в строке:

 If WorksheetFunction.CountIf(ws01.Range("AC:AC"), 
Me.Card_FindCardNumber.Value) = 0 Then

Я, конечно, ожидаю, что он вернет значения в текстовые поля пользовательской формы, если число существует, но если оно не существует, то я ожидаюэто, чтобы хлопнуть меня с всплывающим сообщением, говорящим мне, что номер не существует.

Я был бы очень признателен за любую помощь :), конечно, я бы не знал, будут ли другие ошибки после того, как это будет устранено.

1 Ответ

1 голос
/ 17 июня 2019

Если у вас уже есть лист с кодовым именем cnVisitorCard_Database, то это объявление переменной будет «скрывать» этот лист:

Dim cnVisitorCard_Database As Worksheet

, поэтому ваша локальная переменная имеет значение Nothing.Поэтому, когда вы делаете это:

Set ws01 = cnVisitorCard_Database

вы действительно пишете

Set ws01 = Nothing

Это не вызывает ошибку, но делает ваш Countif вызов на следующей строке неудачным.

Это должно работать (а код немного проще / короче):

Private Sub Card_FindCardNumber_AfterUpdate()

    Dim rngSrch As Range, m 'as variant

    Set rngSearch = cnVisitorCard_Database.Range("LookupCardNo")

    m = Application.Match(CLng(Me.Card_FindCardNumber), rngSearch.Columns(1), 0)

    If IsError(m) Then
        'if no match then m is an error value
        MsgBox "This is an incorrect ID"
        Me.Card_FindCardNumber.Value = ""
    Else
        'if found match then m is the matching row number in rngSearch
        With rngSearch.Rows(m)
            Me.Card_ExpiryDate = .Cells(2).Value
            '...etc
            Me.Card_UpdatedInFF = .Cells(9).Value
        End With
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...