在 VBA 中跳过值的复制粘贴循环

Copy-paste loop with skipped values in VBA

总体而言,我对代码编写相当陌生,尤其是 VBA。

我试图编写一个相当简单的宏,每天将值从一个单元格复制到另一个单元格,但是我想知道是否有一种方法可以减少循环计数器的变量,换句话说,可以循环计数器跳过某些值?

Private Sub YesButton_Click()
Dim z As Integer
Dim z1 As Integer
Dim z2 As Integer
Dim z3 As Integer
Dim z4 As Integer
Dim z5 As Integer
Dim z6 As Integer
Dim z7 As Integer
Dim z8 As Integer
Dim z9 As Integer
Dim z10 As Integer
Dim z11 As Integer
Dim z12 As Integer
Dim z13 As Integer

Application.Calculation = xlCalculationManual 'turn off autocalc to speed up copy paste process

For z = 5 To 16
Sheet68.Range("H" & z) = Sheet68.Range("D" & z).Value
Next z

For z1 = 21 To 33
Sheet68.Range("H" & z1) = Sheet68.Range("D" & z1).Value
Next z1

For z2 = 38 To 51
Sheet68.Range("H" & z2) = Sheet68.Range("D" & z2).Value
Next z2

For z3 = 73 To 86
Sheet68.Range("H" & z3) = Sheet68.Range("D" & z3).Value
Next z3

For z4 = 92 To 94
Sheet68.Range("G" & z4) = Sheet68.Range("D" & z4).Value
Next z4

For z5 = 100 To 110
Sheet68.Range("G" & z5) = Sheet68.Range("D" & z5).Value
Next z5

For z6 = 115 To 126
Sheet68.Range("G" & z6) = Sheet68.Range("D" & z6).Value
Next z6

    For z7 = 131 To 142
Sheet68.Range("G" & z7) = Sheet68.Range("D" & z7).Value
Next z7

For z8 = 149 To 151
Sheet68.Range("G" & z8) = Sheet68.Range("D" & z8).Value
Next z8

For z11 = 157 To 164
Sheet68.Range("G" & z11) = Sheet68.Range("D" & z11).Value
Next z11

For z9 = 169 To 175
Sheet68.Range("G" & z9) = Sheet68.Range("D" & z9).Value
Next z9

For z10 = 180 To 186
Sheet68.Range("G" & z10) = Sheet68.Range("D" & z10).Value
Next z10

For z12 = 191 To 203
Sheet68.Range("H" & z12) = Sheet68.Range("D" & z12).Value
Next z12


Application.Calculation = xlCalculationAutomatic 'turn autocalc back on

Unload Me

End Sub

提前致谢

您可以只声明 1 个 int 并在每个循环中使用它。无论如何,你在循环开始时给它一个新值!

所以:

Dim z As Integer

For z = 0 To 10 Step 1
     //Do something
Next

For z = 11 To 21 Step 1
     //Do something
Next

这是一个您可以如何重新考虑您的代码的示例。您显然需要根据自己的数据重新调整示例。

声明一个范围向量

它的大小,与你的间隔一样多(我在你的情况下计算为 14,但我可能错了)。

Dim ranges(1 To 5)
Dim j As Integer '<-- counter of the ranges
Dim k As Long '<-- counter of your loop

定义您的范围

在这里您可以将您的特定范围定义为字符串。在我的示例中,我输入了随机数,但在您的情况下应该是“5-16”、“21-23”等。

ranges(1) = "1-2"
ranges(2) = "5-10"
ranges(3) = "15-20"
ranges(4) = "25-30"
ranges(5) = "35-40"

嵌套两个循环

外面的将遍历范围,内部的将拆分范围并使用下限和上限循环遍历单元格

For j = 1 To 5
    For k = Split(ranges(j), "-")(0) To Split(ranges(j), "-")(1)
        'your code here
        'test it with a msgbox:
        MsgBox "k is now equal to " & k
    Next k
Next j

总结

您的代码应如下所示:

Dim ranges(1 To 14) '<-- not sure, please check it first!
Dim j As Integer, k As Long

ranges(1) = "5-16"
ranges(2) = "21-33"
'....
ranges(14) = "191-203"

For j = 1 To 14
    For k = Split(ranges(j),"-")(0) To Split(ranges(j),"-")(1)
        Sheet68.Range("G" & k) = Sheet68.Range("D" & k).Value
    Next k
Next j
Sub YesButton_Click()
    Dim rngTemp As Range

    For Each rngTemp In Range("H5:H16, H21:H33, H38:H51, H73:H86, H191:H203")
        rngTemp.Value = rngTemp.Offset(, -4).Value
    Next rngTemp

    For Each rngTemp In Range("G92:G94, G100:G110, G115:G126, G131:G142, G149:G151, G157:G164, G169:G175, G180:G186")
        rngTemp.Value = rngTemp.Offset(, -3).Value
    Next rngTemp
End Sub