VBA变体对某些对象?

我开始使用VBA中的Collection (Excel AddIn – > xlam),但是觉得很难使用。 我无法取回任何我投入,其他变种。 例如,在Java中,如果你创build了一个Collection ,那么就为它分配一个types,比如Collection<MyPerfectObjectThatStoresSomeData> ,所以当我对它进行foreach的时候,我知道我得到了我的对象并且可以像这样使用它。 当我想在VBA中做同样的事情时,我得到了Varianttypes,我甚至不能将它转换为我的types。

例。

假设我想从Collection获取最后一个条目,如下所示:

 Private Function FindTargets(sheet As Worksheet, target As String) As Collection Dim result As New Collection Dim aCell As range Dim i As Long For i = 1 To 10456 Set aCell = sheet.Rows(i).Find(What:=target, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not aCell Is Nothing Then MsgBox "Value Found in Cell " & aCell.Address & _ " and the Cell Column Number is " & aCell.Column result.Add aCell End If Next i Set FindTargets = result End Function 

之后,我想循环播放结果,但是我不能在没有错误的情况下获取最后一个input。

 Dim targetCollection As Collection Set targetCollection = FindTargets(targetSheet, "some text") Dim target As range target = targetCollection.Item(targetCollection.Count - 1) 

我得到的错误:

 Run-time error '91': Object variable or With block variable not set 

如果我尝试

 Set target = targetCollection.Item(targetCollection.Count - 1) 

我得到:

 Run-time error '1004': Application-defined or object defined error 

我只能循环并从一个Collection获取不同于Varianttypes的条目吗?

编辑:更具体地说,这段代码将需要范围的坐标,但在一个Variant我得到单元格的文本。 我想过要创build一个新的类,就像CellProperties的属性都是文本和坐标,并把它放到Collection中,但是我再也不能从Collection检索Variant以外的东西了。

看起来你的错误是由于假定一个集合的项目是从零开始的,但是一个Collection的第一个项目的索引是1

下面是我用来testing的FindTargets一个缩减版本,以及一个testing子程序,它返回添加到Collection中的最后一个单元格的Address

 Private Function FindTargets(sheet As Worksheet, target As String) As Collection Dim result As New Collection Dim i As Long For i = 1 To 100 result.Add Cells(i, 1) Next i Set FindTargets = result End Function Sub test() Dim targetCollection As Collection Set targetCollection = FindTargets(Worksheets("Sheet1"), "some text") Dim target As Range Set target = targetCollection.Item(targetCollection.Count) MsgBox target.Address 'will display $A$100 End Sub 

VBA-Collection是可以包含异构对象的数据结构。 因此,不像Collection Of MyPerfectObjectThatStoresSomeData集合可以确保某些数据types的对象可以被添加进来,在VBA-Collection我们可以在集合中存储任何东西,因此它可以同时包含异类对象types。 但在你的情况下,集合实际上包含Variant\Object\Rangetypes的Variant\Object\Range 。 这意味着它包含Varianttypes和Rangetypes的对象。 VBA-Collection可以枚举,它具有Item方法,可用于访问第一个项目索引为1的集合项目。

在你的情况下,你可以做这样的事情:

 targetCollection.Add "Banana" targetCollection.Add ActiveSheet targetCollection.Add Excel.Application Dim itm As Variant For Each itm In targetCollection If TypeName(itm) = "Range" Then _ Debug.Print itm.Address Next itm 

安全地获取最后一个元素(如果最后一个元素的types是Range ):

 Dim lastElement As Range If targetCollection.Count > 0 Then _ Set lastElement = targetCollection.Item(targetCollection.Count) 

作为一个方面的说明:为什么不使用Dim As New 。