【问题标题】:Runtime Error 91 - when testing code in Userform运行时错误 91 - 在用户窗体中测试代码时
【发布时间】:2019-10-30 14:40:41
【问题描述】:

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 学习)“Excel VBA with Userform Vlookup”的代码:

Ws01 实际上是代表 cnVisitorCard_Database 工作表的电子表格的代码名称。

Vlookup指的是命名范围:“LookupCardNo”,它有一个覆盖9列数据的偏移函数(从AC列(卡号)到名称范围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

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

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

【问题讨论】:

  • 你能省略Set ws01 = cnVisitorCard_Database这一行并检查它是否正在运行。同时删除Dim ws01 as Worksheet
  • 因为ws01是电子表格的代号,所以不需要设置。
  • 我注释掉了“Set ws01 = cnVisitorCard_Database”,得到了同样的错误(01)。
  • 我注释掉了“Dim ws01 as Worksheet”,当然我得到了错误,指出变量 ws01 尚未定义。
  • 我在代码窗口顶部有 Option Explicit,因此必须定义工作表……我对其他项目中的那部分代码没有问题我做了

标签: excel vba variables userform


【解决方案1】:

如果您已经有一个代号为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多