2011-10-11 70 views
0

下面的代碼是在VB.net,我怎麼可以做同樣的事情如何準備集合對象在VBA

Option Strict On 
Imports System.Collections 
Public Class Collect 
    Public Shared Sub Main() 
     Dim sta As New Collection 
     sta.Add("New York", "NY") 
     sta.Add("Michigan", "MI") 
     sta.Add("New Jersey", "NJ") 
     sta.Add("Massachusetts", "MA") 

    End Sub 
End Class 

準備集合對象後,我想關鍵找回它,假設拿我想要的鑰匙「紐約」的價值。它應該返回紐約。

回答

2

你不能在VBA集合中這樣做(更新:按照你在vb.net中的佈局順序,我注意到Jean已經重新排列了你的論點來滿足你的需求集合),你可以用一個字典做,請參見下面

詞典是更有效,比收藏更靈活,所以我建議去這樣

  1. 有用的書:帕特里克·馬修斯使用字典類的VBA(以及收藏和詞典如何不同)http://www.experts-exchange.com/A_3391.html

    Public Sub Main() 
    Dim sta 
    Set sta = CreateObject("scripting.dictionary") 
    sta.Add "New York", "NY" 
    sta.Add "Michigan", "MI" 
    sta.Add "New Jersey", "NJ" 
    sta.Add "Massachusetts", "MA" 
    MsgBox sta("New York") 
    End Sub 
    
+0

@ Thanks.Can我寫的功能相同,返回集合對象 – Raj

+0

*不能*做到這一點?你當然可以。這就是收藏的目的。 –

+0

那麼你做了反轉的論據JFC .....我推測(可能是錯誤的,因爲它證明了)vb.net使用相同的佈局作爲VBA。 – brettdj

0

否則就是創建一個你的類型,例如

Public Type City 
     Name As String 
     Acron As String 
End Type 

Sub FillType() 

Dim x(3) As City 
Dim y As Variant 

x(0).Name = "NewYork" 
x(0).Acron = "NY" 

x(1).Name = "Michigan":x(1).Acron = "MI" 

x(2).Name = "New Jersey":x(2).Acron = "NJ" 

x(3).Name = "Massachusetts":x(3).Acron = "MA" 

For i = LBound(x) To UBound(x) 
    Debug.Print x(i).Name, x(i).Acron 
Next i 

End Sub 

[]的

+0

這是如何幫助您通過鍵檢索項目的? –

+0

簡單,如果x(i).Name =「紐約」。 不是一個美麗的解決方案,但工程! 我是怎麼說的,這是一個否則! –

+0

你的意思是,遍歷所有'i'直到找到正確的'x(i).Name'?是的,好吧,當然,這將「工作」,但這是一個奇怪的建議,因爲這個功能已經在集合(和字典)中實現,所以爲什麼重新發明輪子... –

1

下面介紹如何將項目添加到一個Collection對象,通過鍵檢索它們:

Dim sta As Collection 
Set sta = New Collection 
'syntax is: sta.Add myItem, [myKey] 
sta.Add "NY", "New York" 
sta.Add "MI", "Michigan" 
sta.Add "NJ", "New Jersey" 
sta.Add "MA", "Massachusetts" 
MsgBox sta.Item("New York") ' Returns "NY" 

正如您所看到的,參數順序與.NET中的順序相反。爲避免混淆,可以使用命名參數,例如

sta.Add Item:="NY", Key:="New York"