【问题标题】:Identifying the iteration of a For Each loop in VBA?在 VBA 中识别 For Each 循环的迭代?
【发布时间】:2013-02-15 00:42:07
【问题描述】:

如果我有一个开始的循环:

For each c in Range("A1:C8")

占位符c (c.count, c.value, c.something,...) 是否有一个属性来标识循环到目前为止的迭代次数?我宁愿使用这样的东西,也不愿包含另一个变量。

【问题讨论】:

  • 不。你得自己数。

标签: vba excel foreach iteration


【解决方案1】:

您可以执行以下操作,而不是使用“for each c in range”:

Dim c as Long 'presumably you did this as a Range, just change it to Long.
Dim myRange as Range 'Use a range variable which will be easier to call on later
Set myRange = Range("A1:C8")

For c = 1 to myRange.Cells.Count
    'Do something to the cell, identify it as myRange.Cells(c), for example:
    myRange.Cells(c).Font.Bold = True   '<--- replace with your code that affects the cell
Next

这允许您执行完全相同的 For/Next 循环,而无需包含不必要的计数器变量。在这种情况下,c 是一个计数器,但也用于识别受代码影响的单元格。

【讨论】:

  • 如果你使用For Each c In Range语法,你可以在循环内使用c.Font.Bold = True,所以不需要Long变量...
  • 这种技术的问题是它需要索引访问才能到达单元格范围,这通常是迭代的重点。
  • @OlleSjögren is 如果 OP 希望能够在不使用额外计数器变量的情况下计算迭代次数,则需要 Long 变量。
  • @DaleM For Each c ... 中每次迭代的结果 c 不与myRange.Cells(c) 相同吗?因此,对于 OP 的查询,有一种方法可以在没有“额外”计数器变量的情况下做他想做的事。它可能不适用于所有方面,但根据我的经验,它适用于范围内的单元格、特殊单元格、数组中的项目、系列中的点、图表中的系列、表单上的控件、表格上的形状等——你能举一些例子吗?在这种方法不起作用的情况下,OP 可以确定解决他的问题的最佳方法是什么?
  • @DavidZemens 好的,也许 OP 需要计数器来做其他事情,但在这个答案中,计数器唯一的用途是你并不真正需要计数器(将字体设置为当您已经在 OP 代码示例中的 c 中有引用时,使用索引加粗)。
【解决方案2】:

你需要自己这样算

Dim i as integer
i = 0    
For each c in Range("A1:C8")
    i = i + 1

或者

Dim i as integer
Dim c as Range
For i = 0 to Range("A1:C8").Count - 1
    Set c = Range("A1:C8").Cells(i)

【讨论】:

  • 如果循环结构稍有不同,则无需添加额外的变量来执行计数。只要c 的尺寸为长/整数,您就可以引用Range("A1:C8").Cells(c) 之类的单元格范围。
【解决方案3】:

(修订)

根据您正在迭代的方向,使用 Column 或 Row 属性,您可以即时计算序数。因此

For Each c1 in myRange
    myOrdinal = c1.row - myRange.row + 1       ' down contiguous cells in one column
    myOrdinal = c1.Column - myRange.Column + 1 ' contiguous columns, L2R
Next

【讨论】:

  • 我喜欢你的想法,但不应该是 myOrdinal = (c1.Row - 1)*myRange.Columns.Count + c1.Column 吗?作为一个老 C/C++ 程序员,我假设 for each 循环首先遍历一行,然后遍历列,但你知道他们对假设的看法。如果它首先是列,那么它将是 myOrdinal = (c1.Column - 1)*myRange.Rows.Count + c1.Row.. 顺便说一句,是否可以为每个指定哪种方式循环遍历范围,类似于 .find 函数(byRows 或 byColumns)?
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多