简体   繁体   English

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

[英]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. 您显然需要将样本重新适应您自己的数据。

Declare a vector of ranges 声明范围的向量

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

Define your ranges 定义范围

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"

Nest two loops 嵌套两个循环

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

To sum up 总结一下

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM