J'ai une base de données de produits dans Excel avec plusieurs centaines d'entrées, chacune comportant de 1 à 3 "niveaux" de tarification: Standard, Deluxe et Premium. Chaque niveau a son propre SKU (A, B ou C ajouté à la fin du SKU de base) et son prix. Mes données sont comme ceci:
Name, Description, Price A, Price B, Price C, SKU A, SKU B, SKU C
name1, desc1, 14.95, 19.95, , sku1A, sku1B,
name2, desc2, 4.95, 9.95, 12.95, sku2A, sku2B, sku2C
name3, desc3, 49.95, , , sku3A, ,
Comment ferais-je pour que les données ressemblent à ceci:
Name, Description, SKU, Price
name1, desc1, sku1A, 14.95
name1, desc1, sku1B, 19.95
name2, desc2, sku2A, 4.95
name2, desc2, sku2B, 9.95
name2, desc2, sku2C, 12.95
name3, desc3, sku3A, 49.95
Si cela peut aider, je vais importer ces produits dans une installation Magento.
Merci d'avance.
Ces tâches sont généralement plus rapides avec VBA. En fait, il m'a fallu environ 10 minutes pour l'installer.
Je suppose que vos données figurent dans les colonnes A à H.
Allez à Excel » Developer » Visual Basic
"dans le volet de gauche, ouvrez sheet1
(ou) la feuille où se trouvent vos données" Insérez le code dans la fenêtre de droite "Exécutez le code
1 |Sub NewLayout()
2 | For i = 2 To Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
3 | For j = 0 To 2
4 | If Cells(i, 3 + j) <> vbNullString Then
5 | intCount = intCount + 1
6 | Cells(i, 1).Copy Destination:=Cells(intCount, 10)
7 | Cells(i, 2).Copy Destination:=Cells(intCount, 11)
8 | Cells(i, 3 + j).Copy Destination:=Cells(intCount, 12)
9 | Cells(i, 6 + j).Copy Destination:=Cells(intCount, 13)
10| End If
11| Next j
12| Next i
13|End Sub
Mon intention était de garder le code aussi court que possible pour mieux l'expliquer. Fondamentalement, nous utilisons deux boucles. La boucle externe (i
) concerne les lignes et la boucle interne (j
) les colonnes de prix.
Nous utilisons beaucoup cells(rowNumber,columnNumber)
pour lire/écrire des cellules.
Ligne 2 | Commencez une boucle de la ligne 2 à la dernière ligne. Nous parcourons chaque rangée utilisée
Ligne 3 | Commencez une seconde boucle de 0 à 2 (qui sont en réalité 3 boucles, une pour chaque colonne Price)
Ligne 4 | Nous utilisons cette boucle interne pour rechercher des valeurs dans notre ligne et colonne actuelles Prix A, puis Prix B et dans la dernière boucle Prix C. Si nous trouvons une valeur dans une colonne Prix, nous continuons et copions des cellules. Si aucun prix n'est inséré, nous ne faisons rien et passons à la colonne de prix suivante
Ligne 5 | Comptez un compteur pour savoir combien de lignes nous avons déjà copiées,
pour savoir après quelle ligne on peut copier notre ligne actuelle
Ligne 6 | Copier la colonne du nom
Ligne 7 | Copier la colonne de description
Ligne 8 | Copiez la colonne Price A ou B ou C en fonction de la boucle interne que nous sommes actuellement.
Ligne 9 | Copiez la colonne SKU A ou B ou C en fonction de la boucle interne que nous sommes actuellement.
Voici une solution de fonction de feuille de calcul. Les formules sont un peu denses, alors soyez prévenus, mais cela vous donnera ce que vous voulez.
Pas:
Name
name__, entrez une référence directe au premier Name
dans vos données. Dans votre exemple, entrez =A2
, où A2 est le premier nom indiqué dans vos données. Dans l'exemple de capture d'écran que j'ai fourni ci-dessous, cette formule est décrite dans A8
. Toutes les formules suivantes suivront la mise en page utilisée dans la capture d'écran. Vous devrez bien sûr mettre à jour toutes les références de plage pour qu'elles correspondent à votre (vos) feuille (s).= IF (COUNTIF (9 $ A: A9, A9) = COUNTA (COMPENSATION (1 $ C: 1 E $, MATCH (A9, 2 $ A: 5,0 $ US), 0)), INDEX (2 dollars australiens: 5 dollars américains, MATCH (A9, 2 dollars américains: 5,0 dollars américains) +1), A9)Ceci vérifie le nombre de lignes pour le nom indiqué ci-dessus (dans
A9
), et si le nombre de lignes déjà présentes dans votre nouvelle table correspond à cela, il passe au nom suivant. Sinon, une autre ligne pour le nom ci-dessus sera ajoutée.Description
name__, entrez la formule suivante et remplissez-le. = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, 2 $ A: 5 $ A))
SKU
name__, collez la formule suivante dans la barre de formule et appuyez sur Ctrl+Shift+Enter. = INDEX (OFFSET (1 USD: 1 USD, 1 $ MATCH (A9, 2 USD: 5,0 USD), 0), PETIT (SI (OFFSET (1 USD: 1 USD $ 1, MATCH (A9, 2 USD: 5,0 USD), 0) <> "", COLONNE (1 USD: 1 USD), COUNTIF (9 USD: 9 USD: 9 USD)))Ceci est une formule matricielle; si elle est entrée correctement, la formule apparaîtra dans la barre de formule entre accolades. Remplissez cette formule dans votre tableau (chaque instance doit également apparaître entre accolades).
Price
name__, collez la formule suivante dans la barre de formule et entrez-la sous forme de formule matricielle (en appuyant sur Ctrl+Shift+Enter). = INDEX (OFFSET (1 $ A: 1 $ H, MATCH (9 €, 2 USD: 5,0 USD), 0), PETIT (SI (OFFSET (1 $ C: 1 $ E , MATCH (A9 $, 2 A $: 5,0 A $), 0) <> "", COLONNE (1 $ C: 1 E $)), COUNTIF (9 A $: 9 A $, A9)))Remplissez, et ceci devrait compléter votre tableau.