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 :

Séparer plusieurs données d'une cellule puis les insérer en colonne en décalant les lignes du bas [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut Séparer plusieurs données d'une cellule puis les insérer en colonne en décalant les lignes du bas
    Bonjour à tous,

    Tout d’abord, je n’ai pas une grande connaissance de VBA. J'essaye au maximum de me renseigner et ensuite de commenter mon code pour bien le comprendre.
    Ma demande est faisable sans macro mais très longuueeeee, car je dois faire la manip dans plusieurs classeurs qui eux-mêmes possèdent plusieurs onglets.

    Actuellement :
    Je lance une série de test sur un logiciel avec mes classeurs. Le logiciel rempli mes classeurs par rapport aux données du test (de « A » à « O » dans les xls) puis celui-ci me renvoi des KO ou OK. Si j'ai un KO, je dois regarder toutes les données des cellules de la colonne «P» et «Q» et les analyser.
    Je souhaite modifier mes classeurs car actuellement c'est très fastidieux de contrôler le contenu des cellules. Je le fais manuellement et ça me prend un temps considérable.

    Le but de ma demande :
    Mettre une SEUL donnée dans la colonne P et Q. Je pourrais me rendre compte directement qu'elle est la donnée qui est KO avec un simple filtre MAIS pour cela je dois convertir mes classeurs et c’est cette démarche que je souhaite faire avec vous.
    Si une macro pouvait me créer mon nouveau onglet, ça serait formidable.

    Mon classeur actuel : Dans un onglet, celui
    Contient en P14 : PC02/SRSW/P442/P60G/PR5E/PR2E
    Contient en Q14 : PRO-PR2E/PRO-PR10/PRO-SWBV-00/PRO-SPM1-00/PRO-SPM1-01
    Contient en P15 : S485/S672/S106/S34P/P140/P14B/PC00/PC01/P64C/S4GL
    Contient en Q15 : PRO-SPR2-01/PRO-SRMC-00/PRO-PRF5-00/PRO-SW3S-00
    Et ainsi de suite (jusqu’à la dernière ligne).

    J'ai donc une ligne pour faire les tests des éléments en P14 et Q14. Idem pour P15 et Q15.
    Les données dans ses cellules sont rarement identiques et peuvent parfois contenir 100 éléments séparer par "/".
    Aussi, les cellules en P ou Q et ne peuvent être toutes les deux vides en même temps sur la même ligne MAIS l'une ou l'autre peuvent être vide.

    Concernant les colonnes précédentes (A14, B14 etc..), il y a des données et c'est son contenu qui me permet de réaliser des tests. Ensuite en P14 et Q14 c’est l’attendu.
    Info : j’ai pris P, mais le fichier commence en ligne A. Désolé pour la confusion.

    Ma problématique actuelle :
    Je souhaiterais séparer les données de la cellule en P14 puis les mettre les un à la suite de autre à partir de la colonne P14.
    Mon souci, c'est qu'actuellement il y a des éléments en P14, en P15, P16 et ainsi de suite donc à chaque fois, il faut décaler d'autant de lignes que possède d'élément la cellule "P" ou "Q".

    Mon souhait:
    Il faudrait que ma cellule P14 (Q14 est vide) contienne seulement PC02, puis:
    P15 - SRSW (Q15 est vide)
    P16 - P442 (Q16 est vide)
    P17 - P60G (Q17 est vide)
    P18 - PR5E (Q18 est vide)
    P19 - PR2E (Q19 est vide)

    Puis on bascule sur les données en Q20 :
    Q20 - PRO-PR2E (P20 est vide)
    Q21 - PRO-PR10 (P21 est vide)
    Q22 - PRO-SWBV-00 (P22 est vide)
    Q23 - PRO-SPM1-00 (P23 est vide)
    Q24 - PRO-SPM1-01 (P24 est vide)

    Et ainsi de suite
    J'ai donc créé 10 lignes pour faire les tests des éléments qui se trouvaient en P14 et Q14.
    Concernant les colonnes précédentes (A14, B14 etc..), il faudra dupliquer les contenus pour correspondre aux tests.

    L'exemple en image de l'avant modification:
    Nom : donneesOrigine_A14-Q14.PNG
Affichages : 775
Taille : 32,1 Ko
    Info: sur l'image, les données sont renvoyer à la ligne automatiquement

    L'exemple en image de l'après :
    Nom : donneesTransforme_A14-Q14.PNG
Affichages : 791
Taille : 35,2 Ko
    Info: sur l'image, les données sont renvoyer à la ligne automatiquement

    Ensuite à partir de P25, je commence à insérer les éléments de P15


    J’espère avoir été clair.
    Au besoin, je peux vous fournir un fichier réduit.
    Merci pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Pantoufle (j'adore ton pseudo ),

    Voici une procédure écrite rapidement qui répond partiellement à ton besoin :
    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
    Option Explicit
    'Colonne P
    Const colP = 16
    'Définition de la ligne de départ
    Const oLign = 3
     
    Sub Decomposition()
    Dim oRng As Range
    Dim i As Integer, j As Integer
    Dim oTableP() As String
    Dim oTableQ() As String
     
    With Worksheets("MaFeuil")
        Set oRng = .Cells(Rows.Count, colP).End(xlUp)
     
        Do
            oTableP = Split(oRng.Offset(0, 0), "/")
            oTableQ = Split(oRng.Offset(0, 1), "/")
     
            oRng.Offset(0, 0) = oTableP(LBound(oTableP))
            oRng.Offset(0, 1) = ""
            For i = LBound(oTableP) + 1 To UBound(oTableP)
                oRng.Offset(i, 0).EntireRow.Insert
                oRng.Offset(i, 0) = oTableP(i)
                'TODO : recopier les valeurs de la ligne
            Next i
     
            For j = LBound(oTableQ) To UBound(oTableQ)
                oRng.Offset(i + j, 0).EntireRow.Insert
                oRng.Offset(i + j, 1) = oTableQ(j)
                'TODO : recopier les valeurs de la ligne
            Next j
     
            Set oRng = oRng.Offset(-1, 0)
        Loop Until oRng.Row < oLign
     
     
    End With
     
    End Sub
    Quelques précisions :
    1. je suis parti du principe que tu voulais faire tes décompositions de la ligne 14 à la dernière ligne non-vide de ta colonne P (dans mon exemple ligne 3),
    2. de fait - par soucis de simplicité pour ne pas me perdre dans des compteurs infernaux - je commence par décomposer la dernière ligne et remonte jusqu'à la ligne 14,
    3. je n'ai pas fait la recopie de toutes les cellules de chacune de tes lignes (je verrais si je m'y penche demain) - cf. TODO.

    Selon ma compréhension de ta demande, ça fonctionne bien chez moi.

    Je te laisse faire des essais de ton côté.
    N'hésite pas à revenir vers moi.

    Kimy

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ancien Etudiant
    Inscrit en
    Janvier 2019
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ancien Etudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 152
    Par défaut
    bonjour à tous,

    un essai à tester:
    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 EclatePQ()
    Dim i As Long, T1, T2, TT1 As Integer, TT2 As Integer, TT As Integer
     For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1 'adapter le 2 au N°ligne débutant les données
        T1 = Split(Cells(i, 16), "/") 'données de P séparées dans un tableau
        T2 = Split(Cells(i, 17), "/") 'données de Q séparées dans un tableau
        TT1 = UBound(T1) + 1
        TT2 = UBound(T2) + 1
        TT = TT1 + TT2
        Rows(i).Copy
        Rows(i + 1).Resize(TT - 1).Insert xlShiftDown 'insertion autant de ligne que de valeurs en P et Q
        Range("P" & i & ":Q" & i + TT - 1).ClearContents 'effacement des cellules P et Q des lignes insérées
        Range("P" & i).Resize(TT1, 1) = Application.Transpose(T1) 'copie des des données séparées en P
        Range("Q" & i + TT1).Resize(TT2, 1) = Application.Transpose(T2) ''copie des des données séparées en Q
     Next
    End Sub
    pour bien faire, il faudrait "rattacher" tous les cells et range à la feuille concernée (with worksheets("Nom de feuille") comme l'a fait Kimy_Ire

    A+

  4. #4
    Membre averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut
    Merci pour vos réponse Kimy_Ire & Algoplus. Vous êtes au top.
    Je regarde ça dans la soirée et je vous tiens au courant.

    Edite : Bien vu pour le "EclatePQ" Algoplus :-)

  5. #5
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour à tous les deux,

    Avec la recopie des lignes :
    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
    Option Explicit
    'Colonne P
    Const colP = 16
    'Définition de la ligne de départ
    Const oLign = 3
     
    Sub Decomposition()
    Dim oRng As Range
    Dim i As Integer, j As Integer, k As Integer
    Dim oTableP() As String
    Dim oTableQ() As String
     
    With Worksheets("MaFeuil")
        Set oRng = .Cells(Rows.Count, colP).End(xlUp)
     
        Do
            oTableP = Split(oRng.Offset(0, 0), "/")
            oTableQ = Split(oRng.Offset(0, 1), "/")
     
            oRng.Offset(0, 0) = oTableP(LBound(oTableP))
            oRng.Offset(0, 1) = ""
            For i = LBound(oTableP) + 1 To UBound(oTableP)
                oRng.Offset(i, 0).EntireRow.Insert
                oRng.Offset(i, 0) = oTableP(i)
                Range(.Cells(oRng.Offset(i, 0).Row, 1), .Cells(oRng.Offset(i, 0).Row, colP - 1)).Value = _
                Range(.Cells(oRng.Offset(i, 0).Row - 1, 1), .Cells(oRng.Offset(i, 0).Row - 1, colP - 1)).Value
            Next i
     
            For j = LBound(oTableQ) To UBound(oTableQ)
                oRng.Offset(i + j, 0).EntireRow.Insert
                oRng.Offset(i + j, 1) = oTableQ(j)
                Range(.Cells(oRng.Offset(i + j, 0).Row, 1), .Cells(oRng.Offset(i + j, 0).Row, colP - 1)).Value = _
                Range(.Cells(oRng.Offset(i + j, 0).Row - 1, 1), .Cells(oRng.Offset(i + j, 0).Row - 1, colP - 1)).Value
            Next j
     
            Set oRng = oRng.Offset(-1, 0)
        Loop Until oRng.Row < oLign
     
    End With
     
    End Sub
    D'après ma compréhension, ca fonctionne bien.

    Restant à ta dispo.

    Kimy

  6. #6
    Membre averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut
    Hello @Kimy_Ire & @Algoplus,
    j’espère que vous allez bien.

    Je viens de tester.
    sauf erreur de ma part, cela ne fonctionne pas.

    Nom : Erreur_execution.PNG
Affichages : 740
Taille : 4,2 Ko
    Nom : Erreur_execution_v1bis.PNG
Affichages : 748
Taille : 31,0 Ko


    J'ai testé aussi l'autre :
    Nom : Erreur_execution_v2.PNG
Affichages : 727
Taille : 4,2 Ko
    Nom : Erreur_execution_v2bis.PNG
Affichages : 737
Taille : 22,5 Ko


    A prendre en compte.
    Je ne comprends pas forcement tout ce que je lis donc n’hésitez pas a commenté un maximum, si possible.

    Merci d'avance à tous les deux.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/07/2012, 10h44
  2. [XL-2007] Recopier les données d'une cellule sur plusieurs feuilles
    Par anubis62 dans le forum Excel
    Réponses: 1
    Dernier message: 25/06/2009, 09h41
  3. Réponses: 2
    Dernier message: 18/06/2008, 18h29
  4. Réponses: 3
    Dernier message: 22/08/2007, 13h12
  5. [POI]recuperer et modifier les données d'une cellule
    Par corbier32 dans le forum Documents
    Réponses: 5
    Dernier message: 04/05/2006, 11h41

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