Comment diviser une ligne en plusieurs lignes avec Excel?

9

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 sa propre référence (A, B ou C ajoutée à la fin de la référence) 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 pourrais-je obtenir les données pour qu'elles 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.

GreysonD
la source
Existe-t-il une possibilité qu'il existe plusieurs noms et descriptions similaires? Par exemple, deux lignes ont name1et desc1mais avec des prix différents pour le prix A, le prix B, le prix C, etc.
Jerry
Dans les données d'origine? Non, je suis sûr qu'ils sont uniques. Mais, dans les nouvelles données, il y aura certainement des répétitions.
GreysonD
D'accord, j'avais quelque chose en tête, mais il s'est avéré que cela ne fonctionnera pas à moins qu'il n'y ait plus de manipulation derrière pour corriger certains résultats. Si vous êtes curieux, j'essayais un tableau croisé dynamique consolidé, mais le champ Description et les champs SKU devraient être extraits séparément en utilisant index / match / vlookup, ce qui le rend assez long à la fin.
Jerry

Réponses:

8

Ces tâches sont généralement plus rapides avec VBA. En fait, il m'a fallu environ 10 minutes pour le configurer.
Je suppose que vos données sont dans la colonne A à la colonne H.

Allez dans Excel » Developer » Visual Basic»Dans le volet 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

J'avais l'intention de garder le code aussi court que possible pour mieux l'expliquer. 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 beaucoup cells(rowNumber,columnNumber)pour lire / écrire des cellules.

  • Ligne 2 | Commencez une boucle de la ligne 2 à votre dernière ligne. Nous parcourons chaque ligne utilisée

  • Ligne 3 | Démarrer une deuxième boucle de 0 à 2 (qui sont en fait 3 boucles, une pour chaque colonne de prix)

  • Ligne 4 | Nous utilisons cette boucle interne pour vérifier les 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 les 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,
    donc nous savons 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 Prix A ou B ou C selon la boucle intérieure que nous sommes actuellement

  • Ligne 9 | Copiez la colonne SKU A ou B ou C selon la boucle interne que nous sommes actuellement

Capture d'écran du résultat

entrez la description de l'image ici

nixda
la source
1
C'est fantastique! Exactement ce dont j'ai besoin. Mes données sont en fait un peu plus complexes que mon exemple, et je suis nouveau sur VBA, donc votre explication aide énormément. Merci!
GreysonD
2

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

Pas:

  1. Dans la première ligne de votre nouveau tableau, sous Name, entrez une référence directe au premier Namede vos données. Dans votre exemple, vous devez saisir =A2où A2 est le premier nom répertorié dans vos données. Dans l'exemple de capture d'écran que j'ai fourni ci-dessous, cette formule entre en jeu A8. Toutes les formules suivantes suivront la disposition utilisée dans la capture d'écran. Vous devrez bien sûr mettre à jour toutes les références de gamme pour qu'elles correspondent à vos feuilles.
  2. Dans la cellule en dessous, entrez la formule suivante:
    = IF (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFFSET ($ 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)
    
    Cela vérifie essentiellement le nombre de lignes du nom répertorié ci-dessus (en A9) et si le nombre de lignes déjà 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 renvoie un 0 au lieu d'un nom).
  3. Dans la première ligne sous, Descriptionentrez la formule suivante et remplissez.
    = INDEX ($ 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+ Shift+ Enter.
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0), SMALL (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 matricielle; si elle est saisie correctement, la formule apparaîtra dans la barre de formule entre crochets. Remplissez cette formule dans votre tableau (chaque occurrence doit également apparaître entre crochets).
  5. De même, dans la première ligne sous Price, collez la formule suivante dans la barre de formule et entrez-la en tant que formule matricielle (en appuyant sur Ctrl+ Shift+ Enter).
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), SMALL (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 tableau.

Capture d'écran du tableau

Excellll
la source
Formules impressionnantes! Entre cela et la réponse VBA, je suis prêt pour à peu près tout. Merci!
GreysonD