[英]Copy-paste loop with skipped values in VBA
I am fairly new to code-writing in general and VBA in particular. 对于一般的代码编写,尤其是VBA,我还是一个新手。
I have tried to write a fairly simple macro that copies values from one cell to another on a daily basis, however I am wondering if there is a way to have fewer variables for the loop counters, in other words, can a loop counter skip certain values? 我试图编写一个相当简单的宏,每天将值从一个单元格复制到另一个单元格,但是我想知道是否有一种方法可以减少循环计数器的变量,换句话说,循环计数器可以跳过某些值?
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
Thanks in advance 提前致谢
Here's an example of how you could re-think your code. 这是一个如何重新思考代码的示例。 You will clearly need to readapt the sample to your own data.
您显然需要将样本重新适应您自己的数据。
The size of it, as many as your intervals are (I counted 14 in your case, but I might be wrong). 它的大小(取决于您的间隔)(在您的情况下,我算为14,但我可能错了)。
Dim ranges(1 To 5)
Dim j As Integer '<-- counter of the ranges
Dim k As Long '<-- counter of your loop
Here you define, as strings, your specific ranges. 在这里,您可以将特定范围定义为字符串。 In my example I've put random numbers, but in your case should be "5-16", "21-23" etc.
在我的示例中,我放置了随机数,但在您的情况下应为“ 5-16”,“ 21-23”等。
ranges(1) = "1-2"
ranges(2) = "5-10"
ranges(3) = "15-20"
ranges(4) = "25-30"
ranges(5) = "35-40"
The outside one will loop through the ranges, the inside one will split the ranges and use the lower and upper bounds to loop through your cells 外面的一个将遍历范围,内部的一个将拆分范围并使用上下限遍历您的单元格
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
Your code should look something like this: 您的代码应如下所示:
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
You can just declare 1 int and use it for every loop. 您可以只声明1个int并将其用于每个循环。 U give it a new value at the start of the loop anyway!
您还是要在循环开始时给它一个新值!
So: 所以:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.