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

时间:2014-03-26 16:02:50

标签: excel vba excel-vba

我是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上自学,但这已经超过了我目前所在的地方,我无法在网上找到一个来源以简单的方式向我解释这一点 - 希望有人在这里可以帮助!!

我希望我已经彻底解释了一切,

感谢。

2 个答案:

答案 0 :(得分:4)

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

例如,如果您要按顺序将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

结果:

enter image description here


如果你真的想通过循环来做,并且想要在一系列范围内进行,请使用Step属性,如下所示:

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或某些人):

Sub RapidFireThree()

    'This one copies each cell sequentially.
    Dim SrcRng As Range
    Set SrcRng = Sheet1.Range("A1:A5")

    'Copy each cell in order to Column B.
    Set TargetRng = Sheet1.Range("B1:B5")
    For Each Cell In SrcRng
        Cell.Copy TargetRng
        Set TargetRng = TargetRng.Offset(5, 0).Resize(5, 1)
    Next

End Sub

结果:

enter image description here


如果有帮助,请告诉我们。

答案 1 :(得分:1)

此代码可帮助您完成此任务。在另一个循环中执行循环非常简单,但您应尽量避免使用它。例如,此代码采用O(n ^ 2)时序(http://en.wikipedia.org/wiki/Big_O_notation),这意味着如果静态1或静态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