【问题标题】:Using an Array of Ranges in VBA - Excel在 VBA 中使用范围数组 - Excel
【发布时间】:2011-04-07 12:56:38
【问题描述】:

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 中的“容器类”所做的事情,以便能够将混合数据存储在方便的位置,最好是看不见的。在我的程序中,有一个模板部分从另一个工作表中复制进来,然后重复粘贴到活动工作表上并标记,以便用户可以识别各个部分并命名,以便我可以参考它。
  • 这段代码有什么问题?你想达到什么目的?查看上面的代码,您还没有用实际的范围引用填充数组。 Set rangeArray(1) = Range("A1") 后跟 Set rangeArray(2) = Range("A2") 后跟 Set rangeArray(3) = Range("A3")
  • 感谢所有贡献的人。最后,我只是复制了范围,添加了新部分,按顺序重命名它们并将它们复制回原始空间。它有点厚实,但它有效。对我的主要启示是:excel 不支持持久数据和混合数据组,除非它在工作表上。问题是您可能会不小心将数据复制到错误的单元格中,因此您必须非常勤奋地放置和跟踪数据。

标签: arrays excel vba range


【解决方案1】:

不,数组不能保存对象。但是o对象可以容纳对象。我认为您可能想要的是一个 Range 对象,它由各种特定的其他 Range 对象组成。在本例中,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

根据我新发现的关于数组可以保存范围 (thnx 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

【讨论】:

  • 如果我使用这种方法,是否可以在不复制现有数据的情况下对其进行排序?
  • 如果您编辑这篇文章,我会很乐意删除 -1,但数组可以保存对象,包括 Range 对象。
  • 如果你错了,那就去吧。好吧,我只使用 Excel 15 年。 :) 感谢您的更正。
  • 完成!很高兴为您服务...我对 Excel 比较陌生,所以我从您的博客档案中学到了很多东西。
【解决方案2】:

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

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

Dim myRanges as New Collection

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

Range 对象不保存数据;它包含对工作表单元格的引用。如果您想要集合中的 Range contents,则必须将它们复制到工作表中或从工作表中复制出来。

与 Java 一样,您的 VBA 变量是短暂的,无论是在数组还是集合中。如果要关闭文件并在再次打开文件时将数据保存在其中,则必须将其保存在工作表单元格中。工作表是您的持久性机制。

我要在这里迈出一大步,所以如果我走远了,请忽略我。我认为您正在寻找的建议设置一个单独的工作表作为您的“数据库”,其中填充了包含原始数据的列表/表格对象。前面是您的“用户表”,您可以在其中做一些有趣的事情,参考数据库表中的数据。命名一切。

【讨论】:

  • 是否可以不使用工作表而仅将数据存储在变量中来实现?
【解决方案3】:

我不太清楚你在说什么。

如果您问的是创建Ranges 的能力,该Ranges 映射到任何东西并独立存在,那么不,没有办法。 Range 对象只是指工作表的某个区域。它没有任何自己的存储或其他东西。 Range 类的多个不同实例也可以引用同一个工作表区域。

如果你只是想在一个数组中存储一些引用,那没关系,去吧。您的代码的唯一问题是您没有在使用数组元素之前对其进行初始化:由于Range 是一种引用类型,所有元素默认使用Nothings 进行初始化。

【讨论】:

  • 我必须做的,然后实现我的概念是将我想要使用的部分复制到工作表的未使用部分中,弄乱它,然后在我使用时将其复制回来完成了。
  • @GenericJam 然后使用隐藏表。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2016-06-28
  • 2014-01-27
  • 1970-01-01
  • 2018-02-25
相关资源
最近更新 更多