为什么这个VBA代码退出我的表单?

时间:2016-09-24 21:53:25

标签: excel forms vba combobox

我对VBA很新,但总是能够在网上找到我的答案,直到现在才弄明白。

我的用户表单有几个组合框。一个组合框“cmboCERNumber”列表始终是静态的,而另一个组合框“cmboPONumber”列表根据第一个组合框中选择的内容而变化。 cmboPONumber中的列表临时在“Sheet1”上创建。

我可以让盒子正确改变,这不是问题。

当表单加载时,如果用户在“cmboCERNumber”中选择CER编号,则会创建一个新表单“Sheet1”。一些数据被复制到“Sheet1”,并且还创建了“cmboPONumber”的列表。如果用户再次更改“cmboCERNumber”,则需要删除“Sheet1”,然后需要创建“cmboPONumber”的新列表。

我的问题是在下面代码的某处,删除“Sheet1”后表单正在退出。我不希望表单退出。

我已经将问题缩小到下面的代码,通过清除除了这个之外的所有内容。

Private Sub cmboCERNumber_Change()
'If the temporary Sheet1 exists, delete it
    Dim SheetExists As Boolean
    Dim shtName As String
    Dim wb As Workbook
    Dim sht As Worksheet
    Dim ws As Worksheet

    shtName = "Sheet1"

     If wb Is Nothing Then Set wb = ActiveWorkbook
     On Error Resume Next
     Set sht = wb.Sheets(shtName)
     On Error GoTo 0
     SheetExists = Not sht Is Nothing

     If SheetExists = True Then
            For Each ws In Worksheets
            If ws.Name = "Sheet1" Then
                Application.DisplayAlerts = False
                Sheets("Sheet1").Delete
                Application.DisplayAlerts = True
                End
            End If
            Next
        Else
        MsgBox ("Sheet1 does not exist")
        'Do other things
        End If
End Sub

编辑:我改变了方法,找到了更好的方法来达到最终目标。但是,我仍然很好奇为什么退出我的表格。

1 个答案:

答案 0 :(得分:0)

其他人已经告诉你为什么你的表格退出

以下是一些可能有用的代码提示

正在删除“Sheet1”

无需检查是否存在要删除的工作表,只需将其删除即可!

您可能希望将此任务委派给特定的子目录,如下所示:

arrangedSubviews

这是特定的子代码:

Option Explicit

Private Sub cmboCERNumber_Change()
    Dim shtName As String

    shtName = "Sheet1"
    DeleteSheet shtName '<-- If the temporary "Sheet1" exists in ActiveWorkbook, delete it

    'do your things
End Sub

它接受要删除的Sub DeleteSheet(shtName As String, Optional wb As Variant) If IsMissing(wb) Then Set wb = ActiveWorkbook '<--| assume Active Workbook if no workbook has been passed Application.DisplayAlerts = False On Error Resume Next '<--| ignore error messages should passed name worksheet not exist wb.Worksheets(shtName).Delete '<--| delete passed name worksheet, be it there or not! Application.DisplayAlerts = True End Sub 的{​​{1}} Parent可选参数:如果未传递此参数,则{{1} }被假定为workbook worksheet

此外,它使用Worksheets集合而不是Sheets,因为后者“可以包含图表或工作表”,而前者仅包含工作表

Eco 使用“Sheet1”

将“Sheet1”作为整个Userform生活中使用的临时表,然后您可以简单地:

  • 在userform级别为其声明变量

    即。在任何其他子代码或功能代码

    之前,将以下代码放在userform代码窗格的顶部
    Activeworkbook

    这样,userform代码窗格中的所有子/函数都将看到 Parent而无需始终设置它,这必须在适当的早期阶段完成(见下文)< / p>

  • 根据您的用户加载

    创建它

    这可以通过workbook sub

    完成
    Dim tempSht As Worksheet '<--| declare the temporary sheet variable at userfom level
    

    要求临时工作表创建到以下tempSht

    UserForm_Initialize
  • 在任何后续新活动之前清除其内容(例如,在任何Private Sub UserForm_Initialize() Set tempSht = SetSheet("Sheet") '<--| initialize temporary sheet to be used throughout your userfom life '... other code for your userform initialization End Sub 值更改时)

    这可以通过Function对象的ClearContents()方法完成,如下所示:

    Function SetSheet(shtName As String, Optional wb As Variant) As Worksheet
        If IsMissing(wb) Then Set wb = ActiveWorkbook '<--| assume Active Workbook if no workbook has been passed
        On Error Resume Next '<--| ignore error messages should passed name worksheet not exist
        Set SetSheet = wb.Worksheets(shtName) '<--| check if there's already a worksheet with passed name
        If SetSheet Is Nothing Then '<--| if it was not there then...
            Set SetSheet = wb.Worksheets.add.Name = shtName '<--| ...add a new worksheet
            SetSheet.Name = shtName '<--| ...and rename it
        Else '<--|... otherwise
            SetSheet.UsedRange.ClearContents '<--| ...clear its content
        End If
    End Function
    
  • 一旦不再需要它,即在userform退出或关闭时删除它

    这可以通过以下方式完成:

    cmboCERNumber

    在userform退出事件处理程序子

    中调用

    通常userform exit事件处理程序sub是一些按钮Range事件处理程序

    Private Sub cmboCERNumber_Change()        
        tempSht.Cells.ClearContents '<--| clear temporary sheet content
    
        'do your things
    End Sub
    

    但你最好把它放在UserForm_QueryClose()中,以确保即使用户通过单击右上角的白色十字来退出用户窗体,临时表也会被删除

    Sub DeleteTempSheet()
        Application.DisplayAlerts = False
        tempSht.Delete '<--| delete temporary sheet
        Application.DisplayAlerts = True
        Set tempSht = Nothing
    End Sub