2017-08-28 98 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 
相關問題