我第一次尝试递归。在这个问题中,我有一个包含许多行的庞大数据集,并且在每一行中,要复制N个4个单元格范围(从列O到列GB)。我写了以下函数:
Function Recursive(Rng As Range)
If N = 1 Then
Rng.Offset(, -3).Resize(, 670).Copy
Rng.Offset(1, -3).Insert Shift:=xlDown
Rng.Offset(, 6).Resize(, 4).Copy
Rng.PasteSpecial Paste:=xlPasteValues
Else
Rng.Offset(, -2).Resize(, 670).Copy
Rng.Offset(1, -2).Insert Shift:=xlDown 'Repeat these two lines N times'
Rng.Offset(, 7 + 4 * N).Resize(, 3).Copy
Rng.Offset(N, 0).PasteSpecial Paste:=xlPasteValues
Recursive (N - 1)
End If
N = 0
End Function
我知道它非常粗糙,我已经看到了一些问题。基本上,如果N等于4,那么我希望Else指令的前两行重复4次,然后继续前后执行接下来的三行,直到N等于1.基本上,那里有在数据集中有很多范围,我想创建一个新行来放入它们,包括Rng左边的单元格。是否有可能在我发表评论的地方加上一句话,即"返回并重复这两行N次?"
答案 0 :(得分:1)
详细说明@ MarcB的评论,有很多种类的循环。我选择做一个主循环,将N减少1直到N = 0.在该循环中,如果N = 1,那么你的特殊N = 1代码运行;否则如果N = 4,它会在该部分代码上循环4次,否则它会运行你的“其他”代码。代码块。
Function Recursive(Rng As Range)
Dim OriginalN as Integer
OriginalN = N
While N <> 0
If N = 1 Then
Rng.Offset(, -3).Resize(, 670).Copy
Rng.Offset(1, -3).Insert Shift:=xlDown
Rng.Offset(, 6).Resize(, 4).Copy
Rng.PasteSpecial Paste:=xlPasteValues
ElseIf N = OriginalN Then
For x = 1 To OriginalN
Rng.Offset(, -2).Resize(, 670).Copy
Rng.Offset(1, -2).Insert Shift:=xlDown 'Repeat these two lines N times'
Next x
Else
Rng.Offset(, 7 + 4 * N).Resize(, 3).Copy
Rng.Offset(N, 0).PasteSpecial Paste:=xlPasteValues
Recursive (N - 1)
End If
N = N - 1
Wend
End Function
你指的是&#39;回去&#39;并且重做代码,但是如果有其他方法可用,则使用GoTo语句通常被认为是草率的,因为没有适当的关注GoTo语句可能会错误地/不确定地运行,并且有点难以阅读。