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

对于一般的代码编写和特别是VBA来说,我是相当新的。

我试图写一个相当简单的macros,每天从一个单元格复制到另一个单元格,但是我想知道是否有一个方法有更less的variables为循环计数器,换句话说,循环计数器可以跳过某些值?

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 

提前致谢

下面是一个如何重新考虑代码的例子。 您将显然需要将样本重新适配到自己的数据。

声明一个范围向量

它的大小,和你的间隔一样多(我的数字是14,但是我可能是错的)。

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

定义你的范围

在这里,您将string定义为特定的范围。 在我的例子中,我已经把随机数字,但你的情况应该是“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 

你可以声明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 
 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