【问题标题】:Error on Userform.Hide inside Workbook_Deactivate eventUserform 出错。在 Workbook_Deactivate 事件中隐藏
【发布时间】:2015-09-24 20:10:53
【问题描述】:

正如标题所说,我的用户表单一直存在一个特殊问题。当我关闭它(使用命令按钮)时,Userform.Hide 会在 Workbook_Deactivate 事件中弹出一个错误。

这是 Userform_initialize 事件的代码:

这里所有的变量都是全局的

VBA:

Private Sub Userform_Initialize()
    subRemoveCloseButton Me
    Set pagina = ThisWorkbook.Worksheets("Ruta")
    Set libro = Workbooks.Open(pagina.Range("B4").Value, False, True)
    Set pagina2 = libro.Worksheets("GLOBAL")
    pasadas = 0
    If pagina2.AutoFilterMode Then
        If pagina2.FilterMode Then
            pagina2.ShowAllData
        End If
    ElseIf pagina2.FilterMode Then
        pagina2.ShowAllData
    End If
    pagina2.Columns("A:IV").EntireColumn.Hidden = False
    lastRow = pagina2.Cells(pagina2.Rows.Count, "B").End(xlUp).Row
    Call RemoveDuplicates
    With Me.ImagenDatos
        .ScrollBars = fmScrollBarsBoth
        'Change 8.5 to suit your needs
        .ScrollHeight = .InsideHeight * 5
        .ScrollWidth = .InsideWidth * 3
    End With
End Sub

然后在 CommandButton_Click 事件中我有这个:

VBA:

Private Sub BotonCerrar_Click()
    Unload Consultas
    libro.Saved = True
    libro.Close
    ThisWorkbook.Close
End Sub

正如已经评论的那样,错误来自:

VBA:

Private Sub Workbook_Deactivate()
    Consultas.Hide
End Sub

如果我评论该单行,用户窗体将毫无问题地关闭,但我需要它,以便用户窗体(Consultas)在用户在工作簿之间切换时隐藏。

错误消息说:对象变量或未设置块变量(错误 91)

有人知道出了什么问题吗? 这是我的第一篇文章,如果需要其他内容,请告诉我。

我将不胜感激。

编辑:我有更多代码,但我认为这几乎是必不可少的,因为我所做的就是打开 excel 工作簿,然后显示用户窗体,然后单击关闭用户窗体的按钮

【问题讨论】:

  • 嗨,IvnBam。在我看来,您使用该按钮卸载表单,然后由于某种原因自动调用 Workbook_Deactivate,并尝试在已卸载的表单上调用 Hide 方法。也许在 Consultas.Hide 之前 On Error Resume Next 会解决问题?你试过了吗?
  • 您还可以在尝试隐藏之前检查Consultas 是否仍然存在:stackoverflow.com/questions/18584438/…
  • 嗨@A.S.H 感谢您的回复。我确实尝试过,然后错误转移到我关闭“libro”的部分。似乎该变量的范围,即使是全局的,在“BotonCerrar_Click()”子例程中丢失了
  • 是的,我认为如果 libro 是表单对象的成员,那么在卸载表单时它也会失去作用域。但是您可以通过更改 BotonCerar_Click() 中的顺序来解决这个问题:尝试在卸载 Consultas 之前关闭 libro。
  • 非常感谢 A.S.H 和 Ralph 的帮助(:我找到了解决方案以及我遇到的所有错误 n.n

标签: excel hide userform excel-2003 vba


【解决方案1】:

这就是我解决这个问题的方法:

在尝试在Workbook_Deactivate 事件中隐藏用户表单Consultas 之前,我首先使用@Ralph 提供的link 检查用户表单是否可见。

这解决了部分问题,但随后错误转移到我关闭 libro 的部分:

Private Sub BotonCerrar_Click()
    Unload Consultas
    libro.Saved = True
    libro.Close
    ThisWorkbook.Close
End Sub

即使在按照@A.S.H 的建议卸载用户表单之前错误仍然存​​在,但我将其修复为调用Application.Workbooks(libro.Name).Close False 而不是libro.close False(如果有人可以向我解释这一点,我将非常感激)

最终代码如下:

Private Sub BotonCerrar_Click()
    Dim wb As Workbook
    Dim otrolibro As Boolean
    otrolibro = False
    Application.Workbooks(libro.Name).Close False
    Unload Consultas
    For Each wb In Workbooks
        If wb.Name <> ThisWorkbook.Name Then
            otrolibro = True
            Exit For
        End If
    Next wb
    If otrolibro = True Then
        ThisWorkbook.Close False
    Else
        ThisWorkbook.Saved = True
        Application.Quit
    End If
End Sub

如果没有打开另一个工作簿,则 For cicle 将退出 excel 应用程序,因为如果我关闭所有工作簿,Excel 窗口仍然打开,上面什么都没有。

【讨论】:

  • 很高兴您解决了这个问题。要了解为什么必须调用 Application.Workbooks(libro.Name),我们需要知道 libro 的定义位置和方式。我猜想作为 UserFom 模块中的工作簿参考?
  • 顺便说一句,在新代码中,在关闭 false 之前,您不会像使用 libro 那样分配 .saved 属性。你有没有尝试对 libro 做同样的事情?虽然这一切都很奇怪,但我见过更奇怪的事情;)
  • 嗨,A.S.H.我在任何子例程之外的用户表单模块的开头将 libro 定义为 Public libro 作为工作簿,然后我仅在用户表单的初始化事件中使用该变量。是的,我尝试对 libro 做同样的事情,但问题是 libro 没有被识别为变量。我尝试使用“MsgBox libro.name”显示其名称,但提示相同的错误。
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多