我已经开发了以下两个创建和删除listobject旁边复选框集合的子集。 listobject中每个不同的ID都有一个复选框。像这样我可以批准listobject条目。为什么在发生错误后公共变量丢失了?
的代码是follwing:
Public CBcollection As Collection
Public CTRLcollection As Collection
Sub create_chbx()
If Approval.CBcollection Is Nothing Then
Dim i As Integer
Dim tbl As ListObject
Dim CTRL As Excel.OLEObject
Dim CB As MSForms.CheckBox
Dim sht As Worksheet
Dim L As Double, T As Double, H As Double, W As Double
Dim rng As Range
Dim ID As Long, oldID As Long
Set CBcollection = New Collection
Set CTRLcollection = New Collection
Set sht = ActiveSheet
Set tbl = sht.ListObjects("ApprovalTBL")
Set rng = tbl.Range(2, 1).Offset(0, -1)
W = 10
H = 10
L = rng.Left + rng.Width/2 - W/2
T = rng.Top + rng.Height/2 - H/2
For i = 1 To tbl.ListRows.count
ID = tbl.Range(i + 1, 1).Value
If Not (ID = oldID) Then
Set CTRL = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H)
Set CB = CTRL.Object
CBcollection.Add Item:=CB
CTRLcollection.Add Item:=CTRL
End If
Set rng = rng.Offset(1, 0)
T = rng.Top + rng.Height/2 - H/2
oldID = ID
Next i
End If
End Sub
Sub remove_chbx()
If Not Approval.CBcollection Is Nothing Then
With Approval.CBcollection ' Approval is the module name
While .count > 0
.Remove (.count)
Wend
End With
With Approval.CTRLcollection
While .count > 0
.Item(.count).Delete
.Remove (.count)
Wend
End With
Set Approval.CBcollection = Nothing
Set Approval.CTRLcollection = Nothing
End If
End Sub
这一切都工作得很好。没有复选框,如果没有复选框没有错误。我正在开发一个批准方案,我需要开发和测试其他模块。如果我现在运行这个子:
Sub IdoStupidStuff()
Dim i As Integer
Dim Im As Image
i = 1
Set Im = i
End Sub
它会给我一个错误。如果我然后尝试运行我的某个复选框,他们将无法正常工作了。该集合被错误删除,我不再能够访问集合。为什么会发生这种情况,并且我能够反制这种情况而不会导致错误?有没有更好的方法来实施这样的系统,收集损失不是问题?
这只是一个VBA的正常行为。如果您停止(而不是暂停)代码的执行(例如由于豁免),则所有变量都将被清除。如果您需要保存数据,则需要将其放入工作表中,如果重新启动代码,则可以在初始化时读取该数据。正确的错误处理也会阻止你的代码被终止。 –
程序终止时,所有变量都会丢失,一种方法是通过错误。阅读关于错误处理。很少有兴趣的话是恢复下一个等等。 – cyboashu
你应该改变你的VBA代码,它会在你每次运行代码的时候加载全局变量。永远不要指望Vba会在全局变量保持不变的情况下,并且由于错误的原因,它会清除所有变量,从而转向idel时间。 – Rolfi