【问题标题】:How to repeat VBA code using For-Loop如何使用 For-Loop 重复 VBA 代码
【发布时间】:2016-07-05 10:46:50
【问题描述】:

我需要帮助为 H 列中的每个 ID 执行第一个代码。我尝试建立一个“循环”和一个“for next”,但无济于事。

我想建立一个“i = 行号”类型并有一个“i + 1”命令,它将对列中的每个单元格执行相同的任务

真诚感谢任何帮助!

Sub GenerateAll_1()

'Copy the first ID in the list (cell H2) and paste it
    Sheets("Specialist Roster").Select
    Range("H2").Select
    Selection.Copy
    Sheets("Weekly Productivity").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'My code that saves as pdf based on other criteria goes here

'REPEAT task for the cells H3, H4... H260

【问题讨论】:

  • for each cell in range
  • 那么,您需要复制 H 列中的每个单元格,并放入“每周生产力”表中吗?我假设在下一个可用的地方?你想达到什么目的?如果你只需要做H中的所有单元格,为什么不直接复制整列(Range("H:H").Copy)?
  • 抱歉给您带来了困惑...“每周生产力”是为每位专家单独生成的报告。每当在输入单元格中输入员工 ID 时,都会填充该人的详细信息。目前,为了生成所有 pdf,必须手动输入 ID 或从下拉列表中选择。 “专家名册”中的 H 列列出了所有在职专家的 ID 号。我试图通过告诉代码“遍历此列表并为此列表中的每个 ID 创建一个 PDF”来自动化为每个人生成 PDF 的过程。

标签: vba excel loops for-loop


【解决方案1】:

这个示例实际上只是为了让您了解 for 循环在此处如何工作。应该注意的是,循环不是在工作表之间复制和粘贴值的最有效方式。我认为其他一些解决方案可以更好地解决有效的方法:

For i = 2 To 260
Sheets("Specialist Roster").Range("H" & i).Copy
'here you need to specify what range you want to copy to
Sheets("Weekly Productivity").Range("H" & i).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
 Next i

这不是一个很好的缩放解决方案,因为它被硬编码为执行第 2 行到第 260 行。但是使用一些变量可以做得更好。希望这有点帮助...

【讨论】:

  • 我知道,我只是懒得复制粘贴OP
  • 如果你把.Select清理干净,我就把dv带走。
  • 你搞定了!
  • 还有一个,第二行和第三行应该是一个Sheets("Specialist Roster").Range("H" & i).Copy
  • 您也可以编辑它,这样您就不必选择Sheets("Specialist Roster") 怎么样Sheets("Specialist Roster").Range("H" & i).Copy 或使用with sh.
【解决方案2】:

这是一个单行子:

Sub GenerateAll_1()
    Sheets("Specialist Roster").Range("H2:H" & Rows.Count).Copy Sheets("Weekly Productivity").Range("H2")
End Sub

不需要循环。如果您想避免第 260 行下方 H 列中的值,则:

Sub GenerateAll_1()
    Dim r1 As Range, r2 As Range

    Set r1 = Sheets("Specialist Roster").Range("H2:H260")
    Set r2 = Sheets("Weekly Productivity").Range("H2")

    r1.Copy r2
End Sub

【讨论】:

  • IMO,这是提高效率和易于维护的更好答案。
【解决方案3】:

如您的代码所示 (xlPasteValues),仅复制数据,请执行以下操作:

Sheets("Weekly Productivity").Range("H2:H260") = 
    Sheets("Specialist Roster").Range("H2:H260").Value

没有循环。

你甚至可以不用代码,只需在“每周生产力”中输入一个公式:

在单元格 H2 中:

='Specialist Roster'!H2

...并根据需要向下拖动。

如果你真的需要循环(因为你想根据中间结果执行其他任务),那么就这样做吧:

Sub GenerateAll_1()
    Dim source As Range ' cell from which you copy
    Dim target As Range ' cell to which you copy

    Set target = Sheets("Weekly Productivity").Range("H1")

    For Each source In Sheets("Specialist Roster").Range("H2:H260")
        target = source.Value ' copy the value (only)
        Set target = target.Offset(1) ' let target point to next cell
        ' perform other tasks here
    Next

End Sub

【讨论】:

  • 我不需要将整个 H 列粘贴到每周报告选项卡中。我需要代码 1. 获取第一个 ID (H2); 2.将该ID号粘贴到每周选项卡(H1)中; 3.另存为PDF; 4)回到花名册并获取下一个ID号(H3)并将其粘贴到每周选项卡(H2)中; 5. 对名册 H 列中列出的所有 ID 重复相同的任务。
  • ArcherBird 的示例运行良好,但是由于某种原因已经生成了一些 PDF 后代码停止了。
  • 我认为这是更多与 PDF 生成相关的问题,我认为值得提出一个新问题。您应该在那里指定您使用的库并提供您拥有的一些 PDF 生成代码。这是一个完全不同的问题。
  • 我添加了一个循环作为替代。也许尝试一下。由于我不了解 PDF 方面,您的问题的根源可能仍然存在,而不是在您的循环中。
  • pdf 生成方面完美运行,不是问题。感谢您的帮助。
猜你喜欢
  • 2020-10-22
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
相关资源
最近更新 更多