首页 > 解决方案 > 运行时错误 91 - 在用户窗体中测试代码时

问题描述

Office 360​​、64 位、Excel。子程序Private Sub Card_FindCardNumber_AfterUpdate()textbox (Card_FindCardNumber)在我输入要查询的数字后,代码应该查看它是否存在。

在测试代​​码时,不管它是一个存在还是不存在的数字,我都会收到相同的错误消息"Runtime Error 91", Object Variable or With Block variable not set

我是 VBA 的业余爱好者,无法弄清楚为什么特定代码行存在问题。

我已经改编了来自 YouTube 和他的网站的 Trevor Easton(在线 PC 学习)“带有 Userform Vlookup 的 Excel VBA ”的代码:

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

如果数字存在,我当然希望它将值返回到用户窗体上的文本框中,但如果它不存在,那么我希望它会弹出一条消息告诉我数字不不存在。

如果有任何帮助,我将不胜感激 :) 当然,一旦解决此问题,我不知道是否还会出现其他错误。

标签: excelvbavariablesuserform

解决方案


如果您已经有一个带有代号的工作表,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

推荐阅读