web-dev-qa-db-fra.com

Comment diviser une ligne en plusieurs lignes avec Excel?

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.

9
GreysonD

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

Code VBA

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

Explication

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.

Capture d'écran du résultat

enter image description here

7
nixda

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:

  1. Dans la première ligne de votre nouvelle table, sous Namename__, entrez une référence directe au premier Namedans 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).
  2. Dans la cellule ci-dessous, entrez la formule suivante:
     = 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.
    Remplissez cette formule aussi loin que vous le souhaitez (jusqu'à ce qu'elle retourne un 0 au lieu d'un nom).
  3. Dans la première ligne sous Descriptionname__, entrez la formule suivante et remplissez-le.
     = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, 2 $ A: 5 $ A))
  4. Dans la première ligne sous SKUname__, 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).
  5. De même, dans la première ligne sous Pricename__, 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.

Screenshot of table

2
Excellll