如何在Excel VBA中执行循环副本?

如何在Excel VBA中执行循环副本?,vba,excel,Vba,Excel,我是一个真正的VBA新手,我正在尝试创建一个复制/粘贴循环来自动化工作中的任务。我已经试了几天了,到目前为止还没有成功,所以需要一点帮助 因此,基本原理如下。我有两个静态列表,一个包含6个字符串(static1),另一个包含37个字符串(static2)。我需要这些以特定格式显示,以允许导入到具有固定导入规范的另一个程序中。我需要static1以6块的形式重复它自己,我使用以下代码执行此操作: Sheet3.Range("I1:I6").Copy For i = 0 To totalCh

我是一个真正的VBA新手,我正在尝试创建一个复制/粘贴循环来自动化工作中的任务。我已经试了几天了,到目前为止还没有成功,所以需要一点帮助

因此,基本原理如下。我有两个静态列表,一个包含6个字符串(static1),另一个包含37个字符串(static2)。我需要这些以特定格式显示,以允许导入到具有固定导入规范的另一个程序中。我需要static1以6块的形式重复它自己,我使用以下代码执行此操作:

Sheet3.Range("I1:I6").Copy
    For i = 0 To totalChannels
    Cells(1 + 6 * i, 2).Select
ActiveSheet.Paste
我完全理解它是如何工作的,static1保存在单元格I1:I6中,它只是一次又一次地复制和粘贴,直到达到totalChannels指定的最大数量

static2稍微复杂一点。static2包含在单元格G1中:G37我需要在循环中创建一个循环,复制单元格G1并将其粘贴到312个连续行中,然后复制单元格G2并将其粘贴到312个连续行中,依此类推,直到到达G37为止

我一直在逐步学习vba,但这比我目前所处的位置要超前,我无法在网上找到一个简单的方式向我解释这一点的来源-希望这里的人能帮助我

我希望我已经解释得足够透彻了


谢谢。

此代码将帮助您完成此任务。在另一个循环中进行循环是相当简单的,但是您应该尽可能避免它。例如,这段代码采用O(n^2)计时(),这意味着如果static 1或static 2的大小增加,那么性能将下降两倍。在编程过程中,您总是希望尝试O(1)或静态计时(这意味着无论您输入的数据量如何,进程都将运行相同的时间)

另外,请注意我列出的注释。你可以用更少的代码完成这项任务,因为VBA是一种脚本语言,可以让你在语法上作弊。但从长远来看,开发良好的编码实践将为你节省大量的痛苦

祝你好运!VBA是开始学习编程的好语言

Sub Test()
'Always explicitly define your variables
Dim oStatic2 As Range
Dim oWksht As Excel.Worksheet
Dim srow As Integer
Dim ct As Integer
Dim pstrow As Integer
Dim column As String

'Use 'SET' when setting object instances; primitive variables don't require it
Set oWksht = ThisWorkbook.Sheets("Sheet1")
Set static2 = oWksht.Range("G1:G37")

'set placemark
pstrow = 1

'set column to paste into
column = "A"

'Loop through each cell in static2
For srow = 1 To 37
    'Set individual cell to be copied
    Set static2 = oWksht.Range("G" & srow)
    static2.Copy
    'Loop through 312 sequential rows for each single row in the outer loop
    For ct = pstrow To (pstrow + 312)
        oWksht.Range(column & ct).PasteSpecial
        pstrow = pstrow + 1
    Next
Next

'Always release memory for objects after finished using
Set oWksht = Nothing
Set static2 = Nothing

End Sub

此代码将帮助您完成此任务。在另一个循环中执行循环相当简单,但您应该尽可能避免它。例如,此代码需要O(n^2)计时()这意味着,如果static 1或static 2的大小增加,那么性能将以两倍的速度下降。在编程中,您总是希望获得O(1)或静态计时(这意味着无论您输入多少数据,进程都将运行相同的时间)

另外,请注意我列出的注释。你可以用更少的代码完成这项任务,因为VBA是一种脚本语言,可以让你在语法上作弊。但从长远来看,开发良好的编码实践将为你节省大量的痛苦

祝你好运!VBA是开始学习编程的好语言

Sub Test()
'Always explicitly define your variables
Dim oStatic2 As Range
Dim oWksht As Excel.Worksheet
Dim srow As Integer
Dim ct As Integer
Dim pstrow As Integer
Dim column As String

'Use 'SET' when setting object instances; primitive variables don't require it
Set oWksht = ThisWorkbook.Sheets("Sheet1")
Set static2 = oWksht.Range("G1:G37")

'set placemark
pstrow = 1

'set column to paste into
column = "A"

'Loop through each cell in static2
For srow = 1 To 37
    'Set individual cell to be copied
    Set static2 = oWksht.Range("G" & srow)
    static2.Copy
    'Loop through 312 sequential rows for each single row in the outer loop
    For ct = pstrow To (pstrow + 312)
        oWksht.Range(column & ct).PasteSpecial
        pstrow = pstrow + 1
    Next
Next

'Always release memory for objects after finished using
Set oWksht = Nothing
Set static2 = Nothing

End Sub

连续的动作更像是一种想象力的锻炼,而不是其他任何东西

例如,如果您想按顺序将
A1:A5
复制到
B1:B25
,那么在没有For循环的情况下,以下操作就足够简单了

Sub RapidFireOne()

    Dim SrcRng As Range
    Set SrcRng = Sheet1.Range("A1:A5")

    'Copy in one go to Column B.
    SrcRng.Copy Sheet1.Range("B1:B25")

End Sub
结果:


如果您确实希望通过循环执行此操作,并且希望跨一系列范围执行此操作,请使用
步骤
属性,如下所示:

Sub RapidFireTwo()

    Dim SrcRng As Range
    Set SrcRng = Sheet1.Range("A1:A5")

    'Copy repeatedly to Column B with one space between.
    For Iter = 1 To 25 Step 5
        SrcRng.Copy Sheet1.Range("B" & Iter)
    Next

End Sub
结果与第一个相同


如果您想将每个单元格复制到批处理范围,就像您使用
static2
所做的那样,只需修改以下方法即可(基本上将
5
更改为
317
或类似内容):

结果:



让我们知道这是否有帮助。

连续动作更像是一种想象力的锻炼,而不是其他任何东西。有很多方法可以做你想做的事情

例如,如果您想按顺序将
A1:A5
复制到
B1:B25
,那么在没有For循环的情况下,以下操作就足够简单了

Sub RapidFireOne()

    Dim SrcRng As Range
    Set SrcRng = Sheet1.Range("A1:A5")

    'Copy in one go to Column B.
    SrcRng.Copy Sheet1.Range("B1:B25")

End Sub
结果:


如果您确实希望通过循环执行此操作,并且希望跨一系列范围执行此操作,请使用
步骤
属性,如下所示:

Sub RapidFireTwo()

    Dim SrcRng As Range
    Set SrcRng = Sheet1.Range("A1:A5")

    'Copy repeatedly to Column B with one space between.
    For Iter = 1 To 25 Step 5
        SrcRng.Copy Sheet1.Range("B" & Iter)
    Next

End Sub
结果与第一个相同


如果您想将每个单元格复制到批处理范围,就像您使用
static2
所做的那样,只需修改以下方法即可(基本上将
5
更改为
317
或类似内容):

结果:



让我们知道这是否有帮助。

你应该看看这篇关于感谢-有趣文章的帖子。你应该看看这篇关于感谢-有趣文章的帖子。为了增加更多的灵活性,在你的第二个例子中,你可以将Iter=1的
更改为25步骤5
,方法是
对于Iter=1到25步骤SrcRng.Rows.Count
nswer(+1)。这看起来绝对完美-谢谢。我现在还没有机会在我的代码中实现它,因为我刚刚出门,但我会在早上给它一个痛击-谢谢!!+1的Step命令-我不熟悉那个-太好了!+1(实际上我已经对这个答案投了赞成票),我最近发现了一个小问题:此代码仅在工作表的已用部分粘贴值:
SrcRng.Copy Sheet1.Range(“B1:B25”)
实际上它给出的结果与
SrcRng.Copy Intersect(Sheet1.Range(“B1:B25”),Sheet1.UsedRange)相同
。你可以在这里看到我是如何解决这个问题的:@simoco:我似乎记得这一点。它与另一个
UsedRange
问题同时存在。我想你也提出了这个问题。无论如何,值得注意的是,OP似乎有很大的范围来执行操作。增加灵活性ty,在第二个示例中,您可以将Iter=1的
更改为25步骤5
,方法是
将Iter=1的
更改为25步骤SrcRng.Rows.Count
。顺便说一句,回答得很好(+1)。这看起来绝对完美-谢谢。我还没有机会在