我有一个问题,我想知道是否有人可以帮助我...我想以类似于“收集”工作方式的方式使用“范围”数据类型。我想使用一个计数器和一个循环:“ rng(i)= value”,其中我可以是1、7、100等。因此,如果我在rng中加上“ A1,A5,C3,D6”,我想“ rng(3)= 3”将单元格C3设置为等于3。对于代码应如何工作,“对于范围内的每个x”都不是一个选择。有可能做到这一点吗?
对我来说,另一种解决方案是,我可以将7个不同集合中的所有单个单元格添加到数据类型范围的一个变量中。
有什么建议吗?
关于, 亚历山大
答案 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