Comment puis-je 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 ayant de 1 à 3 niveaux de prix: Standard, Deluxe et Premium. Chaque niveau a son propre SKU (A, B ou C ajouté à la fin du SKU de base) et le 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 pourrais-je faire en sorte 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 vous aide, je importerai 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 le mettre en place.
    Je suppose que vos données sont dans la colonne A à la colonne H.

    Aller à Excel » Developer » Visual Basic »Sur le volet gauche, ouvrir la sheet1 (ou) la feuille où résident les données» Insérer le code dans la fenêtre de droite »Exécuter 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

    J'avais l'intention de garder le code le plus court possible pour l'expliquer mieux. Fondamentalement, nous utilisons deux boucles. La boucle externe ( i ) est pour les lignes et la boucle interne ( j ) pour les colonnes de prix.

    Nous utilisons fortement les cells(rowNumber,columnNumber) pour lire / écrire des cellules.

    • Ligne 2 | Démarrez une boucle de la rangée 2 à votre dernière rangée. Nous itérons à travers chaque rangée utilisée

    • Ligne 3 | Commencez une seconde boucle de 0 à 2 (en fait, 3 boucles, une pour chaque colonne Prix)

    • Ligne 4 | Nous utilisons cette boucle intérieure pour vérifier les valeurs dans notre ligne et colonne en cours Prix A, puis Prix B et dans la dernière boucle Prix C. Si nous trouvons une valeur dans une colonne Prix, nous allons et copier des cellules. Si aucun prix n'est inséré, nous ne faisons rien et passons à la prochaine colonne Prix

    • Ligne 5 | Comptez un compteur pour connaître le nombre de lignes que nous avons déjà copiées,
      Donc, nous savons qu'après quelle ligne, nous pouvons copier notre ligne actuelle

    • Ligne 6 | Copiez la colonne du nom

    • Ligne 7 | Copiez la colonne de description

    • Ligne 8 | Copiez la colonne A ou B ou C en fonction de la boucle interne que nous avons 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 de résultat

    Entrez la description de l'image ici

    Voici une solution de fonction de feuille de calcul. Les formules sont un peu denses, alors soyez averti, mais cela donnera ce que vous voulez.

    Pas:

    1. Dans la première rangée de votre nouvelle table, sous Name , entrez une référence directe au premier Name dans vos données. Dans votre exemple, vous devez entrer =A2 où A2 est le prénom figurant dans vos données. Dans l'exemple de capture d'écran que j'ai fourni ci-dessous, cette formule va dans A8 . Toutes les formules suivantes suivront la mise en page utilisée dans la capture d'écran. Vous devrez évidemment mettre à jour toutes les références de gamme pour correspondre à vos feuilles.
    2. Dans la cellule ci-dessous, entrez la formule suivante:
       = SI (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFF $ ($ C $ 1: $ E $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0)), INDEX ($ A $ 2 : $ A $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0) +1), A9)
      

      Ceci vérifie essentiellement le nombre de lignes qu'il devrait y avoir pour le nom ci-dessus (en A9 ), et si le nombre de lignes déjà dans votre nouvelle table correspond à cela, il passe au prochain nom. Sinon, une autre ligne pour le nom ci-dessus sera ajoutée.
      Remplissez cette formule aussi loin que vous le souhaitez (jusqu'à ce qu'il retourne un 0 au lieu d'un nom).

    3. Dans la première ligne sous Description saisissez la formule suivante et complétez.
       = INDICE ($ B $ 2: $ B $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0)) 
    4. Dans la première ligne sous SKU , collez la formule suivante dans la barre de formule et appuyez sur Ctrl + Maj + Entrée .
       = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0), PETIT (IF (OFFSET ($ F $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0) <> "", COLONNE ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9))) 

      Il s'agit d'une formule de tableau; Si elle est entrée correctement, la formule apparaîtra dans la barre de formule située dans les crochets. Remplissez cette formule dans votre table (chaque instance devrait également apparaître dans des crochets).

    5. De même, dans la première rangée sous Price , collez la formule suivante dans la barre de formule et entrez-la en tant que formule de tableau (en appuyant sur Ctrl + Maj + Entrée ).
       = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), PETIT (IF (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9 , $ A $ 2: $ A $ 5,0), 0) <> "", COLONNE ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9))) 

      Remplissez, et cela devrait compléter votre table.

    Capture d'écran du tableau