2017-08-28 95 views
0

我已经开发了以下两个创建和删除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 

它会给我一个错误。如果我然后尝试运行我的某个复选框,他们将无法正常工作了。该集合被错误删除,我不再能够访问集合。为什么会发生这种情况,并且我能够反制这种情况而不会导致错误?有没有更好的方法来实施这样的系统,收集损失不是问题?

+0

这只是一个VBA的正常行为。如果您停止(而不是暂停)代码的执行(例如由于豁免),则所有变量都将被清除。如果您需要保存数据,则需要将其放入工作表中,如果重新启动代码,则可以在初始化时读取该数据。正确的错误处理也会阻止你的代码被终止。 –

+0

程序终止时,所有变量都会丢失,一种方法是通过错误。阅读关于错误处理。很少有兴趣的话是恢复下一个等等。 – cyboashu

+0

你应该改变你的VBA代码,它会在你每次运行代码的时候加载全局变量。永远不要指望Vba会在全局变量保持不变的情况下,并且由于错误的原因,它会清除所有变量,从而转向idel时间。 – Rolfi

回答

1

你可以换Collection对象的属性,让它处理对象的创建:

Private mCollection As Collection 

Public Property Get TheCollection() As Collection 
    If mCollection Is Nothing Then Set mCollection = New Collection 
    Set TheCollection = mCollection 
End Property 

要叫它:

TheCollection.Count 
+0

很高兴知道!在所有告诉我最终解决不了问题的人之后。我已经想过只使用工作表的OLEObjects集合并手动确保只有正确的对象被删除。谢谢! –

0

尝试On Error Resume Next在导致错误的行之前。它将跳过这个问题,你的可变参数仍然可用。 但是这不会解决你的错误。尝试在工作簿中制作一个单独的隐藏工作表来存储您的全局变量,以便它们不会丢失。 f.ex:

Private Sub CreateSheet() 
    Dim ws As Worksheet 
    With ThisWorkbook 
     Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count)) 
     ws.Name = "Global" 
     .Worksheets("Global").Visible = False 
    End With 
End Sub 
相关问题