使用类似于“集合”的数据类型“范围”-VBA

时间:2019-03-24 18:10:56

标签: vba

我有一个问题,我想知道是否有人可以帮助我...我想以类似于“收集”工作方式的方式使用“范围”数据类型。我想使用一个计数器和一个循环:“ rng(i)= value”,其中我可以是1、7、100等。因此,如果我在rng中加上“ A1,A5,C3,D6”,我想“ rng(3)= 3”将单元格C3设置为等于3。对于代码应如何工作,“对于范围内的每个x”都不是一个选择。有可能做到这一点吗?

对我来说,另一种解决方案是,我可以将7个不同集合中的所有单个单元格添加到数据类型范围的一个变量中。

有什么建议吗?

关于, 亚历山大

3 个答案:

答案 0 :(得分:1)

我不确定您要问什么。

也许这就是您想要的:

  

MSDN: Looping Through a Range of Cells

     

另一种遍历范围的简便方法是使用 For Each ... Next   循环,并使用 Range属性中指定的单元格集合。   Visual Basic自动为下一个单元格设置一个对象变量   每次循环运行。以下过程循环遍历   范围A1:D10,将绝对值为0的任何数字设置为0(零)   小于0.01。

Sub RoundToZero2() 
 For Each c In Worksheets("Sheet1").Range("A1:D10").Cells 
 If Abs(c.Value) < 0.01 Then c.Value = 0 
 Next 
End Sub

答案 1 :(得分:1)

不幸的是,只有在您的集合包含单个连续范围的情况下,这种方法才有效。

有了一组断开连接的单元格,每个单元格都是其自己的Area,尝试直接为组合的Range编制索引将为您带来意想不到的结果:该索引将首先应用于 区域,因为它是一个单元格区域,所以它将go out of bounds,例如对于A1, A5, C3, D6的范围,rng(3)指的是单元格A3(相对于A1向下的第三个单元格)。

要使索引按您希望的方式工作,您需要明确提及Areas属性:

Dim coll As Range

' Set initial contents - has to be at least one cell, can be more
Set coll = some_worksheet.Range("A1,A5,C3")  

' This is how you add to already stored "collection"
Set coll = Application.Union(coll, some_worksheet.Range("D6"))

coll.Areas(3) = 42  ' Sets C3 to 42

答案 2 :(得分:1)

这适用于任何范围,连续的或相反的范围

Sub Test()
    Dim rng As Range
    Set rng = Sheet1.Range("A1,B5,E7:E9")

    Dim v As Variant, a As Range, r As Range

    ReDim v(1 To 1)
    For Each a In rng.Areas
        For Each r In a
            v(UBound(v)) = r.Value
            ReDim Preserve v(1 To UBound(v) + 1)
        Next
    Next
    ReDim Preserve v(1 To UBound(v) - 1)

    Debug.Print v(1)
    Debug.Print v(2)
    Debug.Print v(3)

End Sub