我已經開發了以下兩個創建和刪除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