在VBA-Excel中使用范围数组

8

VBA是否支持使用范围变量的数组?

dim rangeArray() as range
dim count as integer
dim i as integer

count = 3

redim rangeArray(1 to count)

for i = 1 to count
  msgbox rangeArray(i).cells(1,1).value
next

我无法在这种类型的应用程序中使其工作。 我想将一系列范围按特定顺序存储为“主副本”。 然后,我可以向该数组添加,删除,排序或执行任何操作,然后只需将其打印到Excel中的一系列范围即可。 似乎Excel不支持此功能-它只强制您将数据存储在电子表格中,并且必须重新读取才能使用它。


我想要做的是在Java中实现类似“容器类”的功能,以便能够将混合数据存储在一个方便且不易被发现的位置。 在我的程序中,有一个模板部分从另一个表格中复制并重复粘贴到活动表格中,并进行标记,以便用户可以识别各个部分,同时也进行命名,以便我可以引用它。 - GenericJam
这段代码有什么问题?你想实现什么效果?从上面的代码来看,你没有用实际的范围引用填充数组。Set rangeArray(1) = Range("A1") 后跟 Set rangeArray(2) = Range("A2") 再跟 Set rangeArray(3) = Range("A3") - shahkalpesh
感谢所有做出贡献的人。最终,我只是复制了范围,添加了新的部分,按顺序重命名它们,并将它们复制回原始空间。虽然有点笨重,但它确实有效。对我来说,主要的启示是:除非在工作表上,否则Excel不支持持久数据和混合数据组。问题是,如果将数据放入错误的单元格中,您可能会意外复制数据,因此必须非常勤奋地放置和跟踪数据。 - GenericJam
3个回答

13

不,数组不能容纳对象。但是对象可以容纳对象。我认为你想要的是一个包含各种特定其他范围对象的范围对象。在这个例子中,rMaster是我所谓的“数组”,它包含三个单元格。对象可以容纳对象。我认为你可能需要一个范围对象,其中包含各种特定的其他范围对象。在本例中,rMaster是我的“数组”,它包含三个单元格。

Sub StoreRanges()

    Dim rMaster As Range
    Dim rCell As Range

    Set rMaster = Sheet1.Range("A1")
    Set rMaster = Union(rMaster, Sheet1.Range("A10"))
    Set rMaster = Union(rMaster, Sheet1.Range("A20"))

    For Each rCell In rMaster
        MsgBox rCell.Address
    Next rCell

End Sub

在我获得了数组可以存储范围的新知识后(感谢jtolle),这是一个示例,说明如何将范围存储在数组中并对它们进行排序。

Sub UseArray()

    Dim aRng(1 To 3) As Range
    Dim i As Long

    Set aRng(1) = Range("a1")
    Set aRng(2) = Range("a10")
    Set aRng(3) = Range("a20")

    BubbleSortRangeArray aRng

    For i = LBound(aRng) To UBound(aRng)
        Debug.Print aRng(i).Address, aRng(i).Value
    Next i

End Sub

Sub BubbleSortRangeArray(ByRef vArr As Variant)

    Dim i As Long, j As Long
    Dim vTemp As Variant

    For i = LBound(vArr) To UBound(vArr) - 1
        For j = i To UBound(vArr)
            If vArr(i).Value > vArr(j).Value Then
                Set vTemp = vArr(i)
                Set vArr(i) = vArr(j)
                Set vArr(j) = vTemp
            End If
        Next j
    Next i

End Sub

如果我使用这种方法,能否在不复制现有数据的情况下对其进行排序? - GenericJam
3
如果你编辑这篇文章,我很乐意将-1移除,但数组可以包含对象,包括范围对象。 - jtolle
真是太对了。我只用Excel 15年而已。:) 感谢您的纠正。 - Dick Kusleika
完成!很高兴为您服务...我对Excel还比较新,所以从您的博客档案中学到了很多。 - jtolle

5

我不完全清楚你想做什么,但是...

如果你想要一个集合,为什么不使用VBA集合对象呢?

Dim myRanges as New Collection

Collection.Item可以是任何对象,包括Range。

Range对象并不保存数据;它保存对工作表单元格的引用。如果你想要Collection中的Range内容,你需要将其从工作表复制到Collection中,然后在需要时再将其从Collection复制回工作表。

与Java一样,VBA变量无论是在数组还是集合中都是短暂存在的。如果你希望在关闭文件后再次打开文件时仍然有数据,你必须将其放在工作表单元格中。工作表是持久化机制。

我想这里可能涉及到一个比较大的问题,如果我理解错了,请忽略我的建议。我认为你可能需要设置一个独立的工作表作为你的“数据库”,其中填充着包含原始数据的列表/表对象,然后在其前面,你的“用户工作表”中进行有趣的操作,引用数据库工作表中的数据。给所有对象命名。


能否在不使用工作表的情况下,仅将数据存储在变量中来实现呢? - Ans

1

我还不太清楚你在谈论什么。

如果你是在询问能否创建一个映射到空白区域的Range并单独存在的能力,那么答案是否定的。一个 Range 对象只是指向工作表上某个特定区域的东西。它本身没有任何存储或其他属性。而且多个不同的Range 类实例也可以引用同一个工作表区域。

如果你只是想将某些引用存储在数组中,那么没问题,可以这样做。你的代码唯一的问题在于在使用数组元素之前没有初始化它们:由于Range是引用类型,所有元素默认都被初始化为Nothing


那么,为了实现我的概念,我需要做的就是将我想要使用的部分复制到工作表中未使用的部分,对其进行调整,然后在完成后将其复制回来。 - GenericJam
@GenericJam 使用一个隐藏的工作表。 - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接