2013-04-26 26 views
4
已存在

VBA6代碼(EXCEL)偉大的工作。升級到Office 2010/VBA7,代碼中斷。升級VBA 6-> 7的原因錯誤:如果集合

使用代碼從SO:

Determining whether an object is a member of a collection in VBA

Public Function Contains(col As Collection, key As Variant) As Boolean 
Dim obj As Variant 
On Error GoTo err 
    Contains = True 
    obj = col(key) 
    Exit Function 
err: 

    Contains = False 
End Function 

我得到運行時錯誤5:無效的過程調用或參數。

這對我來說沒有任何意義,但是因爲obj = col(key)行上出現錯誤,應該由On Error GoTo err語句覆蓋,但它會停止。

其他如果X存在於收集型解決方案有同樣的問題。

而不是修復破損的代碼,我真正需要的是能夠查看是否已經爲一個集合設置了一個記錄,如果可以在VBA7中做一些其他(新的)方式,那就可以解決問題(我可以夢想)。

+0

如何解決方案在已批准的答案中提供的問題(循環)中放入的鏈接中... – 2013-04-26 19:53:18

+0

作爲一種臨時解決方案,我在前面提供了「On Error Resume Next」收集檢查和事情似乎沒問題,但這讓我感到緊張。 – MECU 2013-04-26 20:12:15

+2

這是側步進問題,所以不是一個真正的答案,但我更喜歡'Scripting.Dictionary'對象,而不是,那些具有一個內置'.exists()'調用。對於我的許多功能,他們似乎也跑得更快。 – Gaffi 2013-04-26 20:15:58

回答

2

我覺得,如果我改變指定的對象,例如,一個worsheet,它的工作原理:

Public Function Contains(col As Collection, key As Variant) As Boolean 
Dim ws As Excel.Worksheet 

On Error GoTo err 
Contains = True 
Set ws = col(key) 
Exit Function 
err: 
Contains = False 
End Function 

我這樣稱呼它:

Sub test() 
Dim ws As Excel.Worksheet 
Dim coll As Collection 

Set coll = New Collection 
For Each ws In ThisWorkbook.Worksheets 
coll.Add ws, ws.Name 
Next ws 
Debug.Print Contains(coll, ActiveSheet.Name) 
Debug.Print Contains(coll, "not a worksheet name") 
End Sub 

我得到真正的第一個呼叫,第二個假。

+0

我認爲在你的情況下'Set'關鍵字比對象規範更重要,不是嗎? +1無論如何:) – 2013-04-26 19:58:23

+0

更改'Dim obj As Variant'和'Dim obj As Excel.Worksheet'也無法正常工作。我試着只是你的代碼,並得到相同的錯誤。開始認爲這不是代碼和其他配置。我沒有檢查參考4檢查:VBA,Excel 14.0,OLE自動化,Office 14.0 – MECU 2013-04-26 20:07:30

+0

@KazJaw,謝謝。對我來說,他們是攜手並進的,也就是說,你不能設置一個變體。 – 2013-04-26 20:08:00