如何使用For-Loop重复VBA代码

时间:2016-03-18 15:37:02

标签: excel vba excel-vba loops for-loop

我需要帮助为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

3 个答案:

答案 0 :(得分:3)

这是一行子:

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

答案 1 :(得分: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

答案 2 :(得分: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行。但是使用某些变量可以做得更好。希望这有点帮助...