VB-在Excel中复制和粘贴嵌套循环

时间:2018-11-26 19:01:48

标签: excel vba loops nested

所以我有一个问题,那就是生成数量随机结果。

我正在尝试在新电子表格中将每个数量(以其数量计​​)换行。

它创建新的工作表,并引用旧的工作表... 代码复制并粘贴行... 它只是不会在正确的时间内循环执行。我尝试了不同的操作数(> = 0)并更改了变量值以使其工作。

它似乎并没有说明为什么会发生。有时,它会在正确数量的循环周期中执行此操作,而其他情况则不是。这在多个值上发生。任何帮助将不胜感激。

Sub copyPasta()
'
' copyPasta Macro
' This will take the qty, if greater than one  in Column C and copy the row 
'to a new sheet the amount of time the qty.
'
'
'Set Variable Types
Dim lineItemQty As Integer
Dim newLineItemQty As Integer
Dim LastRow As Integer
Dim strSheetName As String
Dim newSheetName As String
Dim i As Integer

Application.DisplayAlerts = False

'name a variable after the existing active sheet
strSheetName = ActiveSheet.Name
'add a sheet in addition to the current
Sheets.Add After:=ActiveSheet
'set a variable used in loops to the sheet being copied to
newSheetName = ActiveSheet.Name
'Return to first sheet
Sheets(strSheetName).Activate
' Set For Loop to max row
LastRow = Sheets(strSheetName).Range("C:C").Find("*", searchdirection:=xlPrevious).Row

'for loop to run through all rows
For i = 3 To LastRow Step 1

    'initializing variable to Qty value in table
    lineItemQty = Range("C" & i).Value

    'initializing variable within in line of for looping
    newLineItemQty = lineItemQty

    'do while loop to keep copying/pasting while there are still qty's
        Do While newLineItemQty > 0

        'do while looped copy and paste
            'copy the active row
                Sheets(strSheetName).Activate
                Rows(i).Select
                Selection.Copy
            'paste active row into new sheet
                Sheets(newSheetName).Select
                Rows("3:3").Select
                Selection.Insert Shift:=xlDown


            newLineItemQty = newLineItemQty - 1

        Loop
Next i

Application.DisplayAlerts = True

End Sub

1 个答案:

答案 0 :(得分:0)

您可以考虑使用以下替代方案(或从中提取)。几个值得注意的笔记是

  1. 您应避免使用.Select.Activate。有关详情,请参见here
  2. 声明短变量时,生活会更轻松。这里我们只有ws的{​​{1}}和worksheet的{​​{1}}。然后,您需要在代码中主动声明要引用的工作表(而不是通过使用适当的工作表变量为所有对象添加前缀来使用nsnewsheet
  3. 您不需要在循环中添加.Select。这是默认设置-您只需在偏离默认设置时添加它!
  4. 有几种添加工作表的方法。您的操作没有错-这只是我的首选方法(一种学习方法),碰巧是。
  5. 要多次复制.Activate,只需创建一个嵌套循环并用于Step 1。请注意,我们从未真正在循环内使用变量n,这意味着将执行完全相同的操作,我们只希望它执行1 to n次。

n