【问题标题】:Excel VBA automation - copy row "x" number of times based on cell valueExcel VBA自动化 - 根据单元格值复制行“x”次数
【发布时间】:2014-10-13 06:20:23
【问题描述】:

我正在尝试以一种可以节省无数小时繁琐数据输入的方式来自动化 Excel。这是我的问题。

我们需要为所有库存打印条形码,其中包括 4,000 个变体,每个变体都有特定的数量。

Shopify 是我们的电子商务平台,不支持自定义导出;但是,可以导出所有变体的 CSV,其中包括库存计数列。

我们将 Dymo 用于我们的条码打印硬件/软件。 Dymo 每行只会打印一个标签(它会忽略数量列)。

有没有办法让 excel 根据库存列中的值自动复制行“x”的次数?

以下是数据示例:

https://www.evernote.com/shard/s187/sh/b0d5b92a-c5f6-469c-92fb-3d4e03d97544/d176d3448ba0cafbf3d61506402d9e8b/res/254447d2-486d-454f-8871-a0962f03253d/skitch.png

  • 如果第 N 列 = 0,则忽略并移至下一行
  • 如果列 N > 1,复制当前行,“N”次(到单独的工作表)

我试图找到做过类似事情的人以便我可以修改代码,但经过一个小时的搜索后,我仍然在我开始的地方。提前感谢您的帮助!

【问题讨论】:

  • 您提供的链接拒绝访问。你能告诉我们你到目前为止做了什么吗?在这里您不会找到为您完成整个工作的人,但您会为下一步找到一些帮助。

标签: excel vba automation duplicates rows


【解决方案1】:

大卫击败了我,但另一种方法从未伤害过任何人。

考虑以下数据

Item           Cost Code         Quantity
Fiddlesticks   0.8  22251554787  0
Woozles        1.96 54645641     3
Jarbles        200  158484       4
Yerzegerztits  56.7 494681818    1

有了这个功能

Public Sub CopyData()
    ' This routing will copy rows based on the quantity to a new sheet.
    Dim rngSinglecell As Range
    Dim rngQuantityCells As Range
    Dim intCount As Integer

    ' Set this for the range where the Quantity column exists. This works only if there are no empty cells
    Set rngQuantityCells = Range("D1", Range("D1").End(xlDown))

    For Each rngSinglecell In rngQuantityCells
        ' Check if this cell actually contains a number
        If IsNumeric(rngSinglecell.Value) Then
            ' Check if the number is greater than 0
            If rngSinglecell.Value > 0 Then
                ' Copy this row as many times as .value
                For intCount = 1 To rngSinglecell.Value
                    ' Copy the row into the next emtpy row in sheet2
                    Range(rngSinglecell.Address).EntireRow.Copy Destination:= Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1)                                
                    ' The above line finds the next empty row.

                Next
            End If
        End If
    Next
End Sub

在 sheet2 上产生以下输出

Item            Cost    Code        Quantity
Woozles         1.96    54645641    3
Woozles         1.96    54645641    3
Woozles         1.96    54645641    3
Jarbles         200     158484      4
Jarbles         200     158484      4
Jarbles         200     158484      4
Jarbles         200     158484      4
Yerzegerztits   56.7    494681818   1

此代码的注意事项是数量列中不能有空字段。我用了 D 所以随意用 N 代替你的情况。

【讨论】:

  • 感谢马特,但当我尝试运行此宏时出现语法错误。我在 Excel for Mac 上,我的平台与它有什么关系吗?这是截图:note.io/1Fld6e5
  • @JudsonHanna 如果我猜你应该尝试删除评论' Find the next empty row.
  • Hrm,试了一下,结果一样:note.io/1EoMf2O下划线代表什么?
  • 它是一个续行字符。也许 Office for Mac 不支持它。将其移除并将其下方的线放在一起。会更新答案
【解决方案2】:

应该足以让您入门:

Sub CopyRowsFromColumnN()

Dim rng As Range
Dim r As Range
Dim numberOfCopies As Integer
Dim n As Integer

'## Define a range to represent ALL the data
Set rng = Range("A1", Range("N1").End(xlDown))

'## Iterate each row in that data range
For Each r In rng.Rows
    '## Get the number of copies specified in column 14 ("N")
    numberOfCopies = r.Cells(1, 14).Value

    '## If that number > 1 then make copies on a new sheet
    If numberOfCopies > 1 Then
        '## Add a new sheet
        With Sheets.Add
            '## copy the row and paste repeatedly in this loop
            For n = 1 To numberOfCopies
                r.Copy .Range("A" & n)
            Next
        End With
    End If
Next

End Sub

【讨论】:

  • 谢谢大卫,但是当我运行宏时,它似乎正在为第 14 列中的每个值创建一个新工作表(而不是新行)。我不肯定这是正在发生的事情,因为在工作簿中创建大约 80 个新工作表后,Excel 崩溃...
【解决方案3】:

回答可能有点晚,但这可以帮助其他人。 我已经在 Excel 2010 上测试了这个解决方案。 说:“Sheet1”是您的数据所在的工作表的名称 “Sheet2”是您想要重复数据的工作表。 假设您已创建这些工作表,请尝试以下代码。

Sub multiplyRowsByCellValue()
Dim rangeInventory As Range
Dim rangeSingleCell As Range
Dim numberOfRepeats As Integer
Dim n As Integer
Dim lastRow As Long

'Set rangeInventory to all of the Inventory Data
Set rangeInventory = Sheets("Sheet1").Range("A2", Sheets("Sheet1").Range("D2").End(xlDown))

'Iterate each row of the Inventory Data
For Each rangeSingleCell In rangeInventory.Rows
    'number of times to be repeated copied from Sheet1 column 4 ("C")
    numberOfRepeats = rangeSingleCell.Cells(1, 3).Value

    'check if numberOfRepeats is greater than 0
    If numberOfRepeats > 0 Then
         With Sheets("Sheet2")
            'copy each invetory item in Sheet1 and paste "numberOfRepeat" times in Sheet2

                For n = 1 To numberOfRepeats 
                lastRow = Sheets("Sheet1").Range("A1048576").End(xlUp).Row
                r.Copy
                Sheets("Sheet1").Range("A" & lastRow + 1).PasteSpecial xlPasteValues
            Next
        End With
    End If
Next

End Sub

此解决方案是 David Zemens 解决方案的略微修改版本。

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2015-09-24
    • 2017-09-23
    • 1970-01-01
    • 2017-08-23
    • 2014-12-27
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多