VBA变体对某些对象?
我开始使用VBA中的Collection
(Excel AddIn – > xlam),但是觉得很难使用。 我无法取回任何我投入,其他变种。 例如,在Java中,如果你创build了一个Collection
,那么就为它分配一个types,比如Collection<MyPerfectObjectThatStoresSomeData>
,所以当我对它进行foreach的时候,我知道我得到了我的对象并且可以像这样使用它。 当我想在VBA中做同样的事情时,我得到了Variant
types,我甚至不能将它转换为我的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
获取不同于Variant
types的条目吗?
编辑:更具体地说,这段代码将需要范围的坐标,但在一个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\Range
types的Variant\Object\Range
。 这意味着它包含Variant
types和Range
types的对象。 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 。