我对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
编辑:我改变了方法,找到了更好的方法来达到最终目标。但是,我仍然很好奇为什么退出我的表格。
答案 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