【问题标题】:How can I access non-contiguous content of a range variable without using arrays如何在不使用数组的情况下访问范围变量的非连续内容
【发布时间】:2012-07-21 15:30:50
【问题描述】:

重新声明:我是一个 excel vba 新手,所以请耐心等待......

我需要访问非连续范围变量中的单个单元格并更改其值。

没有顺序的方法来循环一个不连续的范围变量吗?

例如:

rng = Range("d1:d6, d12")  

此范围内有 7 个单元格,但我无法遍历此范围内的单元格,因为“cells”函数将第 7 个单元格视为 d7。或者我可以用其他方式吗?

我不能使用 FOR EACH,因为我需要使用范围本身以外的另一个变量来跳过范围并更改其中的值。

所以这是我想要做的一个不起作用的例子:

' If I could access a range like an array

    rng(1) = Application.InputBox(prompt:="Enter customer's name: ", Title:="CUSTOMER NAME", Type:=2)
    rng(2) = Application.InputBox(prompt:="Enter travel out date: ", Title:="TRAVEL OUT DATE", Type:=1)
    rng(3) = Application.InputBox(prompt:="Enter travel back date: ", Title:="TRAVEL BACK DATE", Type:=1)
    rng(4) = Application.InputBox(prompt:="Enter number of technicians: ", Title:="TECHNICIANS", Type:=1)
    rng(5) = Application.InputBox(prompt:="Enter number of engineers: ", Title:="ENGINEERS", Type:=1)
    rng(6) = Application.InputBox(prompt:="Enter location: ", Title:="LOCATION", Type:=2)
    rng(7) = Application.InputBox(prompt:="Enter todays date: ", Title:="TODAY'S DATE", Type:=1)

我不想使用数组,因为我不想单独操作单元格的值,我想更改单元格中的值并将其反映在该单元格中,而无需通过将数组内容重新加载到范围中的过程,无论如何这再次给我带来了同样的问题。

有什么建议吗?

【问题讨论】:

  • 啊。我没有说清楚(菜鸟错误)。我需要能够使用它在范围内的位置而不是它的值来访问第七个单元格(现在我似乎只能使用位置 rng.cells(12,1) 来访问它)。基本上,我需要能够像在数组中一样访问那个不连续的单元格,而无需将其设为数组,因为当我更改它时,我希望它更改单元格中的值。
  • 更多说明....我需要基于与范围无关的另一个值创建一个循环,访问范围中的这些单元格并更改它们,而无需将范围切换到数组并再次返回。

标签: excel vba variables range


【解决方案1】:

嗯,这个怎么样?

Sub test()

  Dim Arr() As String         ' dynamic array,
  ReDim Arr(Selection.Count)  ' ... properly sized
  i = 0
  For Each c In Selection
    i = i + 1
    Arr(i) = c.Address        ' save each cell address
  Next c

  ' now we can reference the cells sequentially
  Range(Arr(1)) = Application.InputBox(prompt:="Enter customer's name: ", Title:="CUSTOMER NAME", Type:=2)
  Range(Arr(2)) = Application.InputBox(prompt:="Enter travel out date: ", Title:="TRAVEL OUT DATE", Type:=1)
' ...

End Sub

【讨论】:

  • 啊,是的!让我的noobiness闪耀。虽然这不是我正在寻找的,但它表明答案不是期望范围像数组一样,而不是使范围成为数组,而是使范围中的引用单元格成为数组,这样我就可以随时重新分配数组,而不必重新编写每个范围引用,并且我可以在需要时通过它的数组位置调用一个单元格。对我可怕的不透明询问向大家表示抱歉,谢谢艾伦。
【解决方案2】:

如果您在电子表格本身上突出显示要访问的单元格,您可以这样做:

Sub accessAll()
    Dim cell As Range
    For Each cell In Selection
        (do something here)
    Next cell
End Sub

这会获取您突出显示的每个单元格并对其执行某些操作。

【讨论】:

  • +1: 或不选择单元格只需使用Range("d1:d6, d12") 而不是Selection
  • 啊。我没有说清楚(菜鸟错误)。我需要能够使用它在范围内的位置而不是它的值来访问第七个单元格(现在我似乎只能使用位置 rng.cells(12,1) 来访问它)。基本上,我需要能够像在数组中一样访问那个不连续的单元格,而无需将其设为数组,因为当我更改它时,我希望它更改单元格中的值。
  • 更多说明....我需要基于与范围无关的另一个值创建一个循环,访问范围中的这些单元格并更改它们,而无需将范围切换到数组并再次返回。
  • 老实说,我现在不知道你想要什么。
  • 好的。让我试试这个......见我上面的重新声明
【解决方案3】:

非常规或不连续的范围有Areas 代表常规的矩形子范围。 编辑:请注意两个区域可能重叠,所以如果使用下面的代码,请注意这一点......

Dim a as range, c as range

For each a in yourRange.Areas
    For each c in a
      'something with c
    Next c
Next a

编辑:您可以使用函数从您的范围中获取第 n 个单元格。

请注意,如果您请求超出范围大小的索引,这将返回 Nothing。

'get the n'th cell from a non-contiguous range
'probably not efficient for large ranges...
Function NthCell(rng as Range, n as integer) as Range
    Dim i as integer, c as Range
    Dim rv as Range

    i=1
    for each c in rng.Cells
        if i=n then
            Set rv=c
            Exit For
        end if
    Next c

    Set NthCell=rv
End Function


'Sample usage:
Set rng = Range("D1:D6,D12")
NthCell(rng, 1).Value = ....
NthCell(rng, 7).Value = ....

【讨论】:

  • 这也很好,并扩展了上述观点。非常感谢您的帮助。
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2022-11-07
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
相关资源
最近更新 更多