Excel VBA:重置循环计数器

3

你好,我正在尝试重新启动我的循环计数器(iColumn)。我正在循环遍历列来替换模板(TemplateSheet)中的多个单词。在循环完所有列(内部循环)后,是否可以重新启动循环计数器?

我的唯一问题是,在增加行值后,它返回到循环(列),然后iColumn的值变为4,并终止内部循环。

While Sheets("DataSheet").Cells(iRow, 1).Value <> ""

   While Sheets("DataSheet").Cells(1, iColumn) <> ""

      sFind = Sheets("DataSheet").Cells(1, iColumn)

      sReplacement = Sheets("DataSheet").Cells(iRow, iColumn)

      sTemplate = Replace(sTemplate, sFind, sReplacement)

      iColumn = iColumn + 1

Wend
      Sheets("OutputSheet").Cells(iRow, 1) = sTemplate
      iRow = iRow + 1
   Wend

问题已经通过重新启动循环计数器解决。但现在我必须覆盖替换函数,因为它不存储新的替换数据。

如果在iRow = iRow + 1之后添加iColumn = 1会怎么样?另外,sFind的定义是否应该放在进入内部循环之前? - Ioannis
非常感谢@loannis!但我还有另一个问题。我必须覆盖替换函数。因为它不会存储下一个新替换的数据。 - bigbryan
1
你能否在问题中补充说明除了为什么你的方法不起作用之外,你想要实现什么目标?这样可以更好地获得帮助。我感觉你试图做的事情可以用更简单的方式完成。请参考这个链接。如果FreeMan的回答解决了你最初的问题,那么如果你接受它或者点赞它会很好。 - Ioannis
谢谢您的建议,@loannis。 - bigbryan
此外,不要将您在 OP 中的错误代码替换为现在可用的代码,这只会让那些稍后来到并试图弄清楚这个问题/答案是否有帮助的人感到困惑和减缓速度。如果您认为这真的有帮助,可以在错误代码后发布工作代码,并附上说明这是修复内容的注释。 - FreeMan
显示剩余5条评论
2个回答

2

只需将iColumn的值重置为你的初始值即可。我假设是1

While Sheets("DataSheet").Cells(iRow, 1).Value <> ""
   While Sheets("DataSheet").Cells(1, iColumn) <> ""
      sFind = Sheets("DataSheet").Cells(1, iColumn)
      sReplacement = Sheets("DataSheet").Cells(iRow, iColumn)
      sTemplate = Replace(sTemplate, sFind, sReplacement)
      iColumn = iColumn + 1
   Wend
   MsgBox sTemplate
   iRow = iRow + 1
   iColumn = 1
Wend

你可以像这样简化你的代码:

你可以这样简化你的代码:

While Sheets("DataSheet").Cells(iRow, 1).Value <> ""
   While Sheets("DataSheet").Cells(1, iColumn) <> ""
      sTemplate = Replace(sTemplate, Sheets("DataSheet").Cells(1, iColumn), Sheets("DataSheet").Cells(iRow, iColumn))
      iColumn = iColumn + 1
   Wend
   MsgBox sTemplate
   iRow = iRow + 1
   iColumn = 1
Wend

最后,注意你的MsgBox调用的位置,你只会得到sTemplate的最终值,而不是任何中间值。当然,这可能是你想要的。


@bigbryan 看起来我在另一天给出了类似的循环答案。那个没有修复你的循环吗?http://stackoverflow.com/a/30673171/3347858 - Tony L.
是的,@TonyL先生。谢谢您。但我还有一个问题。我有三张数据表:DataSheet、TemplateSheet和OutputSheet。我正在尝试循环遍历每一列(DataSheet),以查找要替换的代码名称(与TemplateSheet上相同的代码名称)。我将从“DataSheet”中获取替换词。然后我将把新模板存储在“OutputSheet”中。现在我的问题是,我不知道如何覆盖新模板的替换函数。输出存储了第一次循环模板的相同数据,并且从未进行替换, 谢谢! - bigbryan
那应该是你一开始的问题:我正在尝试做“X”。这是我已经完成的工作。这是我遇到的问题。 - FreeMan

1
如果sTemplate中包含你想要的值,则需要将单元格设置为该数据,如下所示:
Sheets("DataSheet").Cells(iRow, iColumn) = sTemplate

这是整个循环:

While Sheets("DataSheet").Cells(iRow, 1).Value <> ""
    While Sheets("DataSheet").Cells(1, iColumn) <> ""
        sFind = Sheets("DataSheet").Cells(1, iColumn)
        sReplacement = Sheets("DataSheet").Cells(iRow, iColumn)
        sTemplate = Sheets("TemplateSheet").Cells(1, 1)
        Sheets("OutputSheet").Cells(iRow, iColumn) = Replace(sReplacement, sTemplate, sFind)
        iColumn = iColumn + 1
    Wend
    MsgBox sTemplate
    iRow = iRow + 1
    iColumn = 1
Wend

@bigbryan,sTemplate目前在OutputSheet中获取到了你想要的正确值吗? - Tony L.
@bigbryan,在做出一些假设后,我还改变了Replace函数参数的顺序。 - Tony L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接