2010-04-30 54 views
2

我已經將一些表單控件添加到集合中,並且可以在通過索引引用成員時檢索它們的屬性。爲什麼我無法從此集合的成員獲取屬性?

但是,當我嘗試通過引用集合的成員來使用任何屬性時,我看到'無法設置ControlSource屬性。未找到會員。'在本地窗口中出現錯誤。

下面是代碼的簡化版本:

'Add controls to collection' 
For x = 0 To UBound(tabs) 
    activeTabs.Add Item:=Form.MultiPage.Pages(Val(tabs(x, 1))), _ 
     key:=Form.MultiPage.Pages(Val(tabs(x, 1))).Caption 
Next x 

'Check name using collection index' 
For x = 0 To UBound(tabs) 
    Debug.Print "Tab name from index: " & activeTabs(x + 1).Caption 
Next x 

'Check name using collection members' 
For Each formTab In activeTabs 
    Debug.Print "Tab name from collection: " & formTab.Caption 
Next formTab 

在即時窗口,結果是:

Tab name from index: Caption1 
Tab name from index: Caption2 
Tab name from collection: 
Tab name from collection: 

爲什麼一個方法的工作,其他的失敗?

這是在一個標準的代碼模塊,但我有類似的代碼在表單模塊內工作得很好。這可能與它有什麼關係?

編輯補充

formTab被宣佈爲控制,但我覺得,如果它被聲明爲一個對象,然後代碼工作。

這可能會解決我的問題,但爲了進一步提高我的知識水平,我將非常感謝任何有關此行爲的解釋,特別是關於在不同類型的模塊中運行代碼的差異。

回答

4

這是一個非常好的問題。您在文章末尾的編輯會揭示很多關於VBA如何工作和發生的事情。我不是100%這是怎麼回事,但我會解釋我的想法正在發生。

在VBA(和VB6,就此而言;相同的代碼庫)中的A Collection不是強類型。這意味着集合中的所有內容在技術上都是一個「對象」。在.NET世界中(從.NET 2.0開始),可以強類型化集合,這樣就可以說「這個集合中的所有東西都是一個Control對象。」在VBA中,這是不可能的,Collection

在您的第一次迭代中,您指的是activeTabs集合中索引的項目,activeTabs(x + 1)指的是object。當您告訴VBA查找該對象的.Caption時,它不知道底層類型是什麼(我認爲),因此它只需查看底層對象類型是否包含名爲Caption的屬性或方法。如您所見,Tab控件實際上包含一個名爲Caption的屬性。

在你的第二個互爲作用,你在哪裏做For Each循環,我認爲問題是,Control型可能不會有一個名爲Caption財產,雖然不同類型的控件可能做到。例如,文本框控件可能沒有Caption屬性,而標籤控件確實有Caption屬性。

你有幾個選項來修復你的第二個循環。 1)你可以聲明formTab是一個Tab控件(我不確定它究竟是什麼)。 Tab控件應該有一個Caption屬性。2)如果activeTabs中的每個控件都不是特定的Tab控件(在這種情況下,您應該將它稱爲activeControls而不是activeTabs),那麼可以在循環中檢查formTab是否實際上是Tab控件。如果是,則將其轉換爲Tab控件,然後致電.Caption。在將其轉換爲Tab控件之前,VBA不會知道它具有Caption屬性,因爲常規Control對象沒有標題屬性。最後,您可以避免在第一個循環中使用對象,並讓運行時找出要執行的操作,但這可能會導致非常糟糕的性能。一般來說,用強類型語言處理特定類型會更好。它還有助於在代碼中顯示您明確知道正在處理的內容,而不是將其留給運行時決定可以使用哪些屬性和方法。

+0

謝謝,這很有道理。我將formTab聲明爲Page(控件的正確名稱,我只是更喜歡將它們稱爲選項卡),並且您預測它可以正常工作。我也將代碼複製到一個表單模塊中,無論formTab是否聲明爲Control,Page或Object,它都可以工作。奇怪的。 – Lunatik 2010-04-30 12:17:26

+0

@Lunatik VB有時會跳過很多圈試圖找出你想要做的事情。不幸的是,這並不總是導致良好的代碼,並會讓你不知道你的代碼在做什麼。我寫了大量的代碼,我不知道它在做什麼,但VBA允許它工作:-)。 – 2010-04-30 12:21:52

相關問題