首页 > 解决方案 > 如何在 Excel VBA 中正确关闭用户窗体?

问题描述

我需要从通用模块内的过程中关闭用户窗体。下面的代码只是一个测试。一旦我离开了表单模块,我就无法使用 Me。

Private Sub btnCancel_Click()        
    On Error GoTo TreatError

    Dim screen As Object

    Set screen = UserForms.Add(Me.Name)
    Unload screen
Leave:
    Set screen = Nothing
    Exit Sub
TreatError:
    GoTo Leave
End Sub

这段代码缺少什么?当我按下取消按钮时,什么也没有发生,好吧,表单仍然保持加载。此用户窗体是 ShowModal True。

提前致谢。

好的 Pᴇʜ。这个给你:

Public Sub EditarCombo(nomeColuna As String, itemCombobox As Variant, novoValor As Variant)
    On Error GoTo TratarErro
    
    Dim planilha As Worksheet
    Dim planRamais As Worksheet
    Dim tela As UserForm
    
    If ((itemCombobox & "") <> "") Then
        If ((Trim(novoValor) & "") <> "") Then
            If (itemCombobox <> Trim(novoValor)) Then
                Set planilha = Worksheets("CombosRamais")
                Set planRamais = Worksheets("Ramais")
                
                EditarNaColuna planilha, nomeColuna, itemCombobox, novoValor
                ExcluirDuplicadasNaColuna planilha, nomeColuna, novoValor
                OrdemarColuna planilha, nomeColuna, True
                RedefinirAreaColuna planilha, planRamais, nomeColuna
                
                EditarNaColuna planRamais, nomeColuna, itemCombobox, novoValor
            Else
                MsgBox "Você deve digitar um novo valor para o item escolhido.", vbInformation + vbOKOnly, "Editar Item"
                GoTo Sair
            End If
        Else
            MsgBox "O campo de novo valor está vazio.", vbInformation + vbOKOnly, "Editar Item"
            GoTo Sair
        End If
    Else
        MsgBox "Escolha um item na lista para ser editado.", vbInformation + vbOKOnly, "Editar Item"
        GoTo Sair
    End If
    
    Set tela = UserForms.Add(Replace(nomeColuna, "Col", "frmEditar"))
    Unload tela
Sair:
    Set tela = Nothing
    Set planilha = Nothing
    Set planRamais = Nothing
    Exit Sub
TratarErro:
    GoTo Sair
End Sub

标签: excelvba

解决方案


不要卸载表单 - 只是隐藏它们。从表单本身,使用Me.Hide.

如果要在模块代码中隐藏表单,请使用UserForm1.Hide.

破坏表格,尤其是在错误的时刻,可能会导致令人惊讶的行为,这真的很难理解。如果您想了解更多信息,请阅读“默认实例”。隐藏表单只是将其从屏幕上隐藏起来,使其暂时不可见,但会保留在内存中。

更新 我的回答主要是指出您不应该销毁表格。如果从不同的表单调用子例程并且您将控件(例如组合框)作为参数传递,则可以使用Parent-property 获取表单对象并将其隐藏:

Public Sub EditarCombo(nomeColuna As String, itemCombobox As Control, novoValor As Variant)
    (...)
    itemCombobox.Parent.Hide
    (...)
End Sub

推荐阅读