如何在Excel VBA中执行循环拷贝?

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

所以基本面如下。 我有两个静态列表,一个包含6个string(static1),另一个包含37个string(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中我需要在循环中创build一个循环来复制单元格G1并将其粘贴到312个连续的行中,然后复制单元格G2并将其粘贴到312个连续的行中,依此类推,直至到达G37。

我已经逐渐在vba上进行自我教育了,但是这个领先于我目前所在的位置,我无法在网上find一个来源以简单的方式向我解释 – 希望在这里的人可以帮助!

我希望我已经解释得很清楚了,

谢谢。

顺序的行动更多的是想象力的锻炼。 有很多方法可以做你想做的事情。

例如,如果B1:B25顺序将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 

结果:

在这里输入图像说明


如果你真的想要通过循环来完成,而且你想通过一系列的范围来完成,可以使用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 ,下面的方法可以工作,只需修改它(基本上改变5317或者其他):

 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 

结果:

在这里输入图像说明


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

这段代码应该可以帮助你完成这个任务。 在另一个循环内做一个循环是相当简单的,但是你应该尽可能地避免它。 例如,这个代码需要O(n ^ 2)时间( http://en.wikipedia.org/wiki/Big_O_notation ),这意味着如果静态1或静态2的大小增长,那么性能会降低两倍。 在编程中,您总是希望拍摄O(1)或静态时间(这意味着无论您通过它input多less数据,过程都将运行相同。

也请注意我列出的意见。 你可以用更less的代码来完成这个任务,因为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