IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Transformer la forme d'un tableur [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut Transformer la forme d'un tableur
    Bonjour à vous,

    Pour simplifier la gestion de mes docs eXcel, j'aimerais faire une petite macro pour cette transformation (valable pour 50 000 lignes, quelque soit le nombre de produits rattachés à une pièce) :

    Tableau avant macro :

    Aj B Ci
    01764565 Pièce 1 Produit 1
    01765085 Pièce 2 Produit 2
    Produit 3
    01765266 Pièce 3 Produit 4
    Produit 5
    Produit 6


    Tableau après macro :

    Aj B Ci
    01764565 Pièce 1 Produit 1
    01765085 Pièce 2 Produit 2 Produit 3
    01765266 Pièce 3 Produit 4 Produit 5 Produit 6


    Si besoin j'ai détaillé en 'naturel perso' la façon dont je pensais procéder, mais n'étant pas informaticien, je pense que cela peut être imparfait...

    Motif global : (Somme pour j=1àN(somme pour i=1àn(Ci=Aj)) ; k défini après

    étape A Prendre les données de la ligne i+k à supprimer
    étape B Déplacer les données dans la ligne i à conserver (i=j)
    étape C Supprimer la ligne i+k

    étape A Sélectionner C(i+k)
    Sélectionner tout le contenu
    Copier le texte CTRL+C
    étape B Sélectionner Ci
    Cliquer gauche derrière le dernier caractère
    Cliquer sur la barre espace
    Coller CTRL V
    Cliquer sur Entrée
    étape C Sélectionner ligne l(i+k)
    Supprimer l(i+k)

    Condition d'application vis-à-vis de Aj
    Règle 1 Ci réfère à Aj pour i=j
    Règle 2 C(i+k) réfère Aj pour A(j+k)=0

    Merci en tout cas pour votre aide, j'espère que vous pourrez rapidement me répondre, je gagnerai beaucoup de temps dans mon travail

  2. #2
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Tu pourrais passer par une variable tableau, sur laquelle tu bouclerais en vérifiant les valeurs vides afin de remonter le nom du produit par concaténation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    VA = Range("A2:C50000").Value
       For i= 1 to Ubound(VA)
          If VA(i,1) > "" Then
              L = i
          Else
               VA(L,3) = VA(L,3) & " - " & VA(i,3)
               VA(i,3) = ""
          End If
       Next
       Cells(2, 1).Resize(Ubound(VA), 3).Value = VA
    Après utiliser l'enregistreur de macro pour supprimer les lignes vides pouvant se faire manuellement
    PS : fais de mon phone, donc j'ai pas vérifié et à tester (faire la déclaration des variables cf. Faq)
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    Bonjour,

    Tu pourrais passer par une variable tableau, sur laquelle tu bouclerais en vérifiant les valeurs vides afin de remonter le nom du produit par concaténation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    VA = Range("A2:C50000").Value
       For i= 1 to Ubound(VA)
          If VA(i,1) > "" Then
              L = i
          Else
               VA(L,3) = VA(L,3) & " - " & VA(i,3)
               VA(i,3) = ""
          End If
       Next
       Cells(2, 1).Resize(Ubound(VA), 3).Value = VA
    Après utiliser l'enregistreur de macro pour supprimer les lignes vides pouvant se faire manuellement
    PS : fais de mon phone, donc j'ai pas vérifié et à tester (faire la déclaration des variables cf. Faq)

    Bonjour et merci pour votre retour rapide,

    Seulement étant néophyte j'ai sûrement du oublier qqch, message d'erreur d'argument non facultatif...
    Voilà ce que j'ai fait :
    J'ai créé ce module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub transformer_tableur(VA)
    Dim VA As Range
    Dim L As Long
    VA = Range("A2:C50000").Value
       For i = 1 To UBound(VA)
          If VA(i, 1) > "" Then
              L = i
          Else
               VA(L, 3) = VA(L, 3) & " - " & VA(i, 3)
               VA(i, 3) = ""
          End If
       Next
       Cells(2, 1).Resize(UBound(VA), 3).Value = VA
    End Sub
    Puis j'ai exécuté la macro dans mon eXcel.
    Je vous remercie encore pour votre aide

  4. #4
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Déclaration des variables :
    VA est un variant ici et non une Range

    Edit : il manquait aussi la déclaration de i :
    dans ton code
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    Déclaration des variables :
    VA est un variant ici et non une Range
    Même message en corrigeant les déclarations de variables... Est-ce qu'il faut redéfinir le UBound ? Je ne vois pas ou se trouve mon erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub transformer_tableur(VA)
    Dim VA As Variant
    Dim L As Long
    Dim i As Long
    VA = Range("A2:C50000").Value
       For i = 1 To UBound(VA)
          If VA(i, 1) > "" Then
              L = i
          Else
               VA(L, 3) = VA(L, 3) & " - " & VA(i, 3)
               VA(i, 3) = ""
          End If
       Next
       Cells(2, 1).Resize(UBound(VA), 3).Value = VA
    End Sub

  6. #6
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Attention : bien connaitre les limites d'Excel : https://support.office.com/fr-fr/art...7-269d656771c3
    concernant la limitation dans une cellule
    sur l'exemple donné pas de souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim VA, i&, L&
        DL = Cells(Rows.Count, 3).End(xlUp).Row
        VA = Range("A2:C" & DL).Value
        For i = 1 To UBound(VA)
            If VA(i, 1) > "" Then
                L = i
            Else
                VA(L, 3) = VA(L, 3) & " - " & VA(i, 3)
                VA(i, 3) = ""
            End If
        Next
        Cells(2, 1).Resize(UBound(VA), 3).Value = VA
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    Attention : bien connaitre les limites d'Excel : https://support.office.com/fr-fr/art...7-269d656771c3
    concernant la limitation dans une cellule
    sur l'exemple donné pas de souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim VA, i&, L&
        DL = Cells(Rows.Count, 3).End(xlUp).Row
        VA = Range("A2:C" & DL).Value
        For i = 1 To UBound(VA)
            If VA(i, 1) > "" Then
                L = i
            Else
                VA(L, 3) = VA(L, 3) & " - " & VA(i, 3)
                VA(i, 3) = ""
            End If
        Next
        Cells(2, 1).Resize(UBound(VA), 3).Value = VA
    End Sub

    Merci RyuAutodidacte, code ok, me reste à faire la macro pour supprimer les lignes vides mais ça devrait être moins compliqué pour moi
    Je renvoie un message pour statuer sur ce dernier point dans la journée.

  8. #8
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Pour indication, le code de suppression des lignes vides, tient sur une ligne; la boucle est superfétatoire
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    Pour indication, le code de suppression des lignes vides, tient sur une ligne; la boucle est superfétatoire
    Rebonjour,

    j'ai peur d'avoir encore échoué, voici mon idée de code pour la suppression de ligne vide :
    Sub suppr()
    Dim i As Long
    If Cells(i, 1) = "0,00" Then
    Rows(Selection.Row).Delete shift:=xlUp
    End If
    End Sub

    Pouvez-vous apporter une correction à ce code svp ?

    Merci encore !

  10. #10
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    pourquoi avons nous ceci :
    If Cells(i, 1) = "0,00"
    De plus dans le code il n y a pas de boucle

    pourtant avec l'enregistreur de macro, une base de code est donné sur un plateau :
    1- sélectionner la plage concernée
    2- faire F5
    3- cliquer sur "Cellules…"
    4- dans "Sélectionner", choisir "Vide" et valider
    5- avec l'outil supprimer, supprimer les lignes

    Edit : à moins qu'il y a des paramètres dont je n'ai pas la connaissance …
    PS : voir dans ma signature comment baliser le code dans un message
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    pourquoi avons nous ceci :
    If Cells(i, 1) = "0,00"
    De plus dans le code il n y a pas de boucle

    pourtant avec l'enregistreur de macro, une base de code est donné sur un plateau :
    1- sélectionner la plage concernée
    2- faire F5
    3- cliquer sur "Cellules…"
    4- dans "Sélectionner", choisir "Vide" et valider
    5- avec l'outil supprimer, supprimer les lignes

    Edit : à moins qu'il y a des paramètres dont je n'ai pas la connaissance …
    PS : voir dans ma signature comment baliser le code dans un message
    Parfait ! Merci

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut nouvelle forme de tableau
    Bonjour,

    je reviens à nouveau vers vous pour faire une deuxième transposition de tableau.

    Tableau initial

    Aj B Ci Di Ei
    1764565 Pièce 1 C1 D1 E1
    1765085 Pièce 2 C2 D2 E2
    C3 D3 E3
    1765266 Pièce 3 C4 D4 E4
    C5 D5 E5
    C6 D6 E6



    Tableau obtenu avec code ci après

    Aj B Ci Di Ei
    1764565 Pièce 1 C1 D1 E1
    1765085 Pièce 2 C2 - C3 D2 - D3 E2 - E3
    1765266 Pièce 3 C4 - C5 - C6 D4 - D5 - D6 E4 - E5 - E6


    Autre tableau final souhaité en complément

    Aj B Ci Di Ei Ci Di Ei Ci Di Ei
    1764565 Pièce 1 C1 D1 E1
    1765085 Pièce 2 C2 D2 E2 C3 D3 E3
    1765266 Pièce 3 C4 D4 E4 C5 D5 E5 C6 D6 E6

    Voici mes codes de module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Sub TestC()
    ' Ramener contenu de C
    Dim VA, i&, L&
        DL = Cells(Rows.Count, 3).End(xlUp).Row
        VA = Range("A2:C" & DL).Value
        For i = 1 To UBound(VA)
            If VA(i, 1) > "" Then
                L = i
            Else
                VA(L, 3) = VA(L, 3) & " - " & VA(i, 3)
                VA(i, 3) = ""
            End If
        Next
        Cells(2, 1).Resize(UBound(VA), 3).Value = VA
    End Sub
     
    Sub TestD()
    ' Ramener contenu de D
    Dim VA, i&, L&
        DL = Cells(Rows.Count, 4).End(xlUp).Row
        VA = Range("A2:D" & DL).Value
        For i = 1 To UBound(VA)
            If VA(i, 1) > "" Then
                L = i
            Else
                VA(L, 4) = VA(L, 3) & " - " & VA(i, 4)
                VA(i, 4) = ""
            End If
        Next
        Cells(2, 1).Resize(UBound(VA), 4).Value = VA
    End Sub
     
    Sub TestE()
    ' Ramener contenu de E
    Dim VA, i&, L&
        DL = Cells(Rows.Count, 5).End(xlUp).Row
        VA = Range("A2:E" & DL).Value
        For i = 1 To UBound(VA)
            If VA(i, 1) > "" Then
                L = i
            Else
                VA(L, 5) = VA(L, 5) & " - " & VA(i, 5)
                VA(i, 5) = ""
            End If
        Next
        Cells(2, 1).Resize(UBound(VA), 5).Value = VA
    End Sub
     
    Sub Lignesvides()
    ' Supprimer les lignes vides
        Columns("A:A").Select
        Selection.SpecialCells(xlCellTypeBlanks).Select
        Selection.ClearContents
        Selection.ClearContents
        Selection.EntireRow.Delete
    End Sub

    Je n'arrive pas à transformer les lignes en colonnes sans écraser certaines cellules dans la manip... Quelqu'un a une idée de code qui soit robuste à N éléments C D et E ?

    Merci pour votre retour

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur en conception et projet
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en conception et projet

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Par défaut Tentative non fructueuse
    Bonjour,

    J'ai essayé d'avancer de mon côté,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub TestC()
    ' Ramener contenu de C
    Dim VA, i&, L&
        DL = Cells(Rows.Count, 3).End(xlUp).Row
        VA = Range("A2:AH" & DL).Value
        For i = 1 To UBound(VA)
            If VA(i, 1) > "" Then
                L = i
            Else
                VA(i, 3.L-9) = VA(L, 3)
                VA(i, 3) = ""
            End If
        Next
        Cells(2, 1).Resize(UBound(VA), 3).Value = VA
    End Sub
    Mais j'ai un message d'erreur sur la ligne en gras, quelqu'un aurait une idée svp ? merci à vous

  14. #14
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    • Afin que le code soit lisible merci de modifier les posts afin de baliser celui-ci des balises [Code] - cf mon PS ci-dessous
    Citation Envoyé par RyuAutodidacte Voir le message
    PS : voir dans ma signature comment baliser le code dans un message
    • Pour faire le 2d tableau (avec : Ci Di Ei), il suffit de reprendre le 1er code que j'ai fait,
    de modifier la plage et d'ajouter les colonnes manquantes dans le/après le Else, comme cette exemple qui reprends la colonne 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Else
                VA(L, 3) = VA(L, 3) & " - " & VA(i, 3)
                VA(i, 3) = ""
            End If
    VA(i, 3) pourrait s’apparenter Cells(i, 3) => Cellule(Ligne, Colonne) ; mais cela dans la variable Tableau
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformer Windows form en WPF ?
    Par juliensmarties dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 02/04/2010, 18h47
  2. Transformer un Form en XML
    Par mahdidadi1 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/11/2009, 00h31
  3. Transformer un Form en XML
    Par clavelski dans le forum Services Web
    Réponses: 0
    Dernier message: 24/02/2009, 13h41
  4. Transformer une Form principale en page web
    Par sondo dans le forum Composants VCL
    Réponses: 6
    Dernier message: 12/09/2008, 11h27
  5. mise en forme d'un tableur Excel
    Par bossLINDROS dans le forum VBA Access
    Réponses: 6
    Dernier message: 09/04/2008, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo