是否有可能让一行VBA脚本重复" N"次数?

时间:2015-08-11 14:30:33

标签: excel vba

我第一次尝试递归。在这个问题中,我有一个包含许多行的庞大数据集,并且在每一行中,要复制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次?"

1 个答案:

答案 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语句可能会错误地/不确定地运行,并且有点难以阅读。