web-dev-qa-db-fra.com

Automatisation VBA Excel - nombre de copies de la ligne "x" en fonction de la valeur de la cellule

J'essaie d'automatiser Excel de manière à m'épargner d'innombrables heures de saisie de données fastidieuse. Voici mon problème.

Nous devons imprimer des codes à barres pour l’ensemble de notre inventaire, qui comprend 4 000 variantes, chacune avec une quantité spécifique.

Shopify est notre plate-forme de commerce électronique et ils ne prennent pas en charge les exportations personnalisées. Cependant, vous pouvez exporter un fichier CSV de toutes les variantes, ce qui inclut une colonne de comptage d'inventaire.

Nous utilisons Dymo pour notre logiciel/matériel d’impression de codes à barres. Dymo n’imprimera qu’une seule étiquette par ligne (il ignore la colonne de quantité).

Est-il possible d'automatiser Excel pour dupliquer le nombre de fois de la ligne "x" en fonction de la valeur de la colonne d'inventaire?

Voici un échantillon des données:

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

  • Si la colonne N = 0, ignorer et passer à la ligne suivante
  • Si la colonne N> 1, copie la ligne actuelle, "N" nombre de fois (sur une feuille séparée)

J'ai essayé de trouver quelqu'un qui avait fait quelque chose de similaire pour pouvoir modifier le code, mais après une heure de recherche, je suis toujours au même point. Merci d'avance pour votre aide!

4
Judson Hanna

David m'a battu, mais une approche alternative ne faisait de mal à personne. 

Considérons les données suivantes

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

Avec cette fonction

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

Génère la sortie suivante sur la feuille2

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

Les mises en garde avec ce code sont qu'il ne peut y avoir de champs vides dans la colonne Quantité. J'ai utilisé D alors n'hésitez pas à substituer N à votre cas. 

7
Matt

Devrait être suffisant pour vous aider à démarrer:

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
2
David Zemens

Peut-être un peu tard pour répondre, mais cela pourrait aider les autres. J'ai testé cette solution sur Excel 2010. Dites: "Sheet1" est le nom de la feuille contenant vos données Et "Sheet2" est la feuille où vous voulez. vos données répétées. En supposant que ces feuilles soient créées, essayez le code ci-dessous.

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

Cette solution est une version légèrement modifiée de la solution de David Zemens.

1
Kiran Kodukula