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:
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!
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.
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
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.