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 :

Reformater un fichier Excel "étrange"


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut Reformater un fichier Excel "étrange"
    Bonjour,
    Je me permets de vous (re)solliciter (car je l'ai fait précédemment dans la même intention mais la structure du fichier qui m'avait été communiquée n'était pas tout à fait réelle).
    le fichier est exporté d'une base très importante d'addhérents à une association qui ne eput être exploté en l'état.
    la formule communiquée initialement ne peut malheureusement me permettre de traiter ces infos.
    J'ai fait du bricolage qui est resté au stade du bricolage. J'y suis depuis ce matin et j'ai du me résoudre à soumetter le sujet à nouveau.

    J'ai cette fois-ci repris un échantillon réel de ce fichier auquel je n'ai fait que modifier les données personnelles.
    Dans ce fichier ne figurent que les données exportées de 3 pages; il en existe dans la réalité des centaines!

    si vous pouviez m'aider, je vous en serai très reconnaissant car je galère "terrible".

    Bonne soirée,

    Hervé
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut
    Bonjour,

    Peu de membre ouvrent les fichiers attaché.
    Pourrais-tu nous fournir une capture d écran de tes données, et du résultat escompté ?

    Un bout de code même partiel ou erroné sur lequel tu aurais déjà planche ?

    Bat
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  3. #3
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Je suppose que les underscore sont la pour le coté graphique de l'exemple.

    La procédure suivante accepte une plage de donnée, et la dimension des blocs à remettre en place, donnée en nombre de ligne et de colonne. Tu peux aussi ne rien préciser, la procédure se débrouille à condition qu'il y ait bien une ligne vide entre les blocs et que la série commence en cellule A1.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    Option Explicit
     
    Sub test()
        Reorganisation
    End Sub
     
     
    Sub Reorganisation(Optional Plage As Range, Optional NbrRow As Long, Optional NbrCol As Integer)
    Dim tiTab As Variant
    Dim tiRetour As Variant
    Dim xRow As Long, xCol As Integer
    Dim iRow As Long, iCol As Integer
    Dim WTab As Integer
    Dim iRetRow As Integer, iRetCol As Long
     
        'On place les données dans un tableau interne
        If Not Plage Is Nothing Then
            tiTab = Plage.Value
        Else
            'On cherche les données
            With Feuil1 ' A adapter
                tiTab = .Range("A1", .Cells(.Cells(.Rows.Count, "A").End(xlUp).Row, .Range("A1").End(xlToRight).Column)).Value
            End With
        End If
     
        'On vérifie qu'il s'agit d'un tableau
        If Not IsEmpty(tiTab) Then
            If UBound(tiTab) > -1 Then
                'Mode auto
                If NbrRow <= 0 Then
                    'On boucle sur les ligne du tableau
                    iRow = 1
                    While iRow < UBound(tiTab) And xRow = 0
                        'On recherche la 1ère valeur vide
                        If tiTab(iRow, 1) = "" Then 'Ou "__________________________________" mais je penses que les underscore sont là juste pour le coté graphique
                            'On prend donc en compte
                            xRow = iRow
                        End If
                        iRow = iRow + 1
                    Wend
                Else
                    xRow = NbrRow
                End If
     
                If NbrCol <= 0 Then
                    'On prend la largeur de la plage
                    xCol = UBound(tiTab, 2)
                Else
                    xCol = NbrCol
                End If
     
                'On regarde si un nombre de lignes et de colonnes ont été défini
                If (xCol <> 0) And (xRow <> 0) Then
                    'On défini le nombre de colonne du tableau retour
                    WTab = (UBound(tiTab) + 1) / xRow
     
                    'On redimensionne le tableau
                    ReDim tiRetour(1 To xRow, 1 To (WTab * xCol))
     
                    'On initialise les variables qui pointe la case cible de tiRetour
                    iRetRow = 1
                    iRetCol = 1
     
                    'On boucle si tiTab
                    For iCol = 1 To UBound(tiTab, 2)
                        For iRow = 1 To UBound(tiTab)
                            'On inscrit s'il ne s'agit pas de la ligne vide de séparation
                            If iRow Mod xRow <> 0 Then
                                tiRetour(iRetRow, iRetCol) = tiTab(iRow, iCol)
                            End If
                            'On pointe la ligne suivante
                            iRetRow = iRetRow + 1
                            'Si on dépasse le nombre de ligne, on retourne à la 1ère, on passe à la colonne suivante
                            If iRetRow > UBound(tiRetour) Then
                                iRetRow = 1
                                iRetCol = iRetCol + xCol
                            End If
                        Next
                        'On remplace le pointeur sur la 1ère ligne
                        iRetRow = 1
                        'On repositionne le pointeur de colonne
                        iRetCol = iCol + 1
                    Next
                End If
     
                'On crée une nouvealle feuille
                With ThisWorkbook.Worksheets.Add
                    .Range("A1").Resize(UBound(tiRetour), UBound(tiRetour, 2)).Value = tiRetour
                End With
            End If
        End If
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mfoxy Voir le message
    Bonjour,

    Je n'arrive pas à copier une capture d'écran

    Citation Envoyé par Qwazerty Voir le message

    Merci Quaz pour ton retour

    Les underscores que tu identifies corerspondent, je le pense, aux bordures dessinées automatiquement dan sl'export; je peux les supprimer.

    Quant à l'exploitation du code que tu m'as transmis ... je sais pas faire!!!
    Je l'ai mis dans une macro mais ... elle m'indique ne pas connaiter "OptionExplicit" si je l'exécute.
    Je vous l'indiquais en préambule d ema sollicitation:je ne sais pas faire.
    Maintenant, ej me rends compte que c'est même pire: je ne sais même pas exploiter les solutions des autres!!!
    Je n'imaginais pas (re)tomber aussi bas...

    Si tu peux me guider...

    Merci d'avance,

    Hervé

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Il te faut mettre le code dans un module standard.

    Dans VBE (Alt+F11 à partir d'Excel), dans le menu Insertion, Module.

    Ensuite dans l'explorateur de projet (F4 pour l'afficher/masquer), dans le répertoire "module", tu vas trouver le nouveau module, tu places dedans l'intégralité du code fourni.

    Dans ce code, il faut adapter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            'On cherche les données
            With Feuil1 ' A adapter
    Ici Feuil1 correspond au codename de la feuille Excel contenant tes données (il est possible d'adapter pour utiliser le nom de l'onglet si besoin)

    Pour les underscores, j'avais mis en commentaire le code permettant de les gérer s'ils existaient vraiment.

    Nom : 2020-02-04_180140.png
Affichages : 316
Taille : 106,4 Ko

    Pour lancer la procédure, étant donné qu'elle a des paramètre, il faut passer par la procédure "test" qui appelle Reorganisation (en laissant les valeur de paramètre par défaut, donc vide). Pour éxécuter un procédure, tu cliques à l'intérieur et tu utilise la touche F9 (un le bouton représentant lecture [le triangle])

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Bonjour Qwaz,

    Merci pour la procédure qui m'a permis d'intégrer le code



    Lorsque j'exécute la macro (test) sur mon fichier Exemple (mis en ligne sur ce Forum), J'obtiens l'erreur l'erreur d'exécution '6' (Dépassement de capacité)

    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim tiRetour(1 To xRow, 1 To (WTab * xCol))
    Si j'exécute la macro sur mon fichier de base (avec les vraie données), j'obtiens l'erreur d'exécution '7' (Mémoire insuffisante)

    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tiTab = .Range("A1", .Cells(.Cells(.Rows.Count, "A").End(xlUp).Row, .Range("A1").End(xlToRight).Column)).Value


    As-tu une idée sur les raisons de ces ereurs?

    Merci de ton aide,

    Hervé

  7. #7
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par RV_EH Voir le message
    Bonjour Qwaz,


    Lorsque j'exécute la macro (test) sur mon fichier Exemple (mis en ligne sur ce Forum), J'obtiens l'erreur l'
    erreur d'exécution '6' (Dépassement de capacité)
    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ReDim tiRetour(1 To xRow, 1 To (WTab * xCol))

    Hervé
    J'ai réussi à solutionner ce problème en passant WTab en Long

    Maintenant, l'erreur suivante apparait:
    Erreur d'exécution '1004': Erreur définie par l'application ou par l'objet
    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Range("A1").Resize(UBound(tiRetour), UBound(tiRetour, 2)).Value = tiRetour
    Un idée?

  8. #8
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par RV_EH Voir le message
    Bonjour Qwaz,

    Si j'exécute la macro sur mon fichier de base (avec les vraie données), j'obtiens l'erreur d'exécution '7' (Mémoire insuffisante)

    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tiTab = .Range("A1", .Cells(.Cells(.Rows.Count, "A").End(xlUp).Row, .Range("A1").End(xlToRight).Column)).Value


    Hervé
    J'ai solutionné ce problème en modifiant augmentant les valeurs de SharedSection de la valeur Windows de la clé System\CurrentControlSet\Control\Session Manager\SubSystems de la sous-arborescence HKEY_LOCAL_MACHINE du registre.

    Et je me retrouve avec l'erreur d'exécution
    '1004': Erreur définie par l'application ou par l'objet
    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A1").Resize(UBound(tiRetour), UBound(tiRetour, 2)).Value = tiRetour
    AU moins tout cela est cohérent quel que soit les données dans le fichier.

    Une idée?

  9. #9
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Le nombre de colonne sur excel est limité au max d'un Integer, c'est à dire 65535 colonnes, s'il y a plus de colonnes ça plante. C'est peut-être le problème, est-ce que tu as fait un essai avec peu de données pour voir si ça fonctionne?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Salut

    Le nombre de colonne sur excel est limité au max d'un Integer, c'est à dire 65535 colonnes, s'il y a plus de colonnes ça plante. C'est peut-être le problème, est-ce que tu as fait un essai avec peu de données pour voir si ça fonctionne?

    ++
    Qwaz
    Oui, le fichier Exemple (en PJ de mon premier message) sur lequel je travail est constitué de 6 colonnes et 30 lignes.
    Le fichier complet est quant à lui également constitué 1089 lignes mais toujours de 6 colonnes.
    Ils doivent restituer un document de 9 colonnes et respectivement 21 et 8470 lignes.
    Cela devrait passer, non?
    Même si une ligne est composée de plusieurs lignes (Chaine de caractères + ALT + Chaine de caractères + ALT Chaine de caractères + ...)

    Si ça passe avec l'exmple transmis, cela devrait fonctionner avec la base d'origine (que je ne peux pas communiquer pour des raisons de protection de données personnelles)
    As-tu pu exécuter le programme de ton côté sur ma base?

    Merci de ton aide,

    Hervé

  11. #11
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Ci-joint le fichier que j'ai utilisé.
    Il suffit de lancer la procédure test()

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  12. #12
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Salut

    Ci-joint le fichier que j'ai utilisé.
    Il suffit de lancer la procédure test()

    ++
    Qwaz
    Wouah!!!!
    Je me suis trompé de fichier; je suis navré et un peu honteux!!!
    C'est ce qui arrive à vouloir appeler les fichiers exemple ... et ne pas maitriser cette plateforme qui est partie sans doute cherches ma pièce jointe dans le cache.
    Je l'ai rebaptisé...en exemple2
    En fait, le premier fichier envoyé était la traduction qui m'avait été faite des données exportées.
    Sauf que cela ne correspondait pas à la réalité. Mais je ne l'ai constaté qu'une fois le fichier reçu.
    D'où cette demande.

    A voir si maintenant je peux être aidé sur cette version...
    En m'excusant à nouveau

    Bonne soirée,

    Hervé
    Fichiers attachés Fichiers attachés

  13. #13
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Plutôt étrange de mettre les tableaux les uns à la suite des autres.

    J'ai modifié un peu le code pour pouvoir s'adapter au besoin. La feuille de travail est précisée en paramètre ainsi que le nombre de colonnes, la détection automatique n'est pas possible puisque la 1ère ligne ne comporte pas de données sur l'ensemble des colonnes.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Option Explicit
     
    Sub test()
        'Tu dois adapter ici pour tenir compte de la bonne feuille et du nombre de colonne
        Reorganisation Feuil1, NbrCol:=6
    End Sub
     
     
    Sub Reorganisation(Optional ShtData As Worksheet, Optional Plage As Range, Optional NbrRow As Long, Optional NbrCol As Integer, Optional Limite As String = "")
    Dim tiTab As Variant
    Dim tiRetour As Variant
    Dim xRow As Long, xCol As Integer
    Dim iRow As Long, iCol As Integer
    Dim WTab As Long
    Dim iRetRow As Integer, iRetCol As Long
     
        'On place les données dans un tableau interne
        If Not Plage Is Nothing Then
            tiTab = Plage.Value
            'On prend en compte les limites de la plage donnée
            xCol = Plage.Columns.Count
        Else
            'On cherche les données
            With ShtData ' A adapter
                'On regarde si des bornes sont imposées
                xRow = .Cells(.Rows.Count, "A").End(xlUp).Row + IIf(Limite = "", 1, 0)
                xCol = IIf(NbrCol = 0, .Cells(1, .Columns.Count).End(xlToRight).Column, NbrCol)
                'On enregistre les données présentes dans un tableau interne
                tiTab = .Range("A1", .Cells(xRow, xCol)).Value
            End With
        End If
     
        'On vérifie qu'il s'agit d'un tableau
        If Not IsEmpty(tiTab) Then
            If UBound(tiTab) > -1 Then
     
                'On recherche la limite
                If NbrRow <> 0 Then
                    xRow = NbrRow
                Else
                    xRow = 0
                    iRow = 1
                    While xRow = 0 And iRow <= UBound(tiTab)
                        If UCase(tiTab(iRow, 1)) = UCase(Limite) Then xRow = iRow
                        iRow = iRow + 1
                    Wend
                End If
     
                'On défini le nombre de colonne du tableau retour
                WTab = (UBound(tiTab)) / xRow
     
                'On redimensionne le tableau
                ReDim tiRetour(1 To xRow, 1 To (WTab * xCol))
     
                'On initialise les variables qui pointe la case cible de tiRetour
                iRetRow = 1
                iRetCol = 1
     
                'On boucle si tiTab
                For iCol = 1 To UBound(tiTab, 2)
                    For iRow = 1 To UBound(tiTab)
                        'On inscrit
                        tiRetour(iRetRow, iRetCol) = tiTab(iRow, iCol)
                        'On pointe la ligne suivante
                        iRetRow = iRetRow + 1
                        'Si on dépasse le nombre de ligne, on retourne à la 1ère, on passe à la colonne suivante
                        If iRetRow > UBound(tiRetour) Then
                            iRetRow = 1
                            iRetCol = iRetCol + xCol
                        End If
                    Next
                    'On remplace le pointeur sur la 1ère ligne
                    iRetRow = 1
                    'On repositionne le pointeur de colonne
                    iRetCol = iCol + 1
                Next
     
                'On crée une nouvealle feuille
                With ThisWorkbook.Worksheets.Add
                    .Range("A1").Resize(UBound(tiRetour), UBound(tiRetour, 2)).Value = tiRetour
                End With
            End If
        End If
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #14
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Bonjour Qwaz,

    Et merci pour ton aide.

    Cette fois-ci, j'obtioens l'erreur suivante (sur le fichier exemple2):
    Erreur d'exécution '9'
    L'indice n'appartient pas à la sélection
    Sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tiRetour(iRetRow, iRetCol) = tiTab(iRow, iCol)
    Dois-je modifier des paramètres?
    Est-ce du à autre chose?

    Hervé

  15. #15
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Mince j'ai oublié...
    sur ton fichier il y a 1 ligne vide qui sépare la 2ème tranche de données et 2 lignes vides qui sépare la 3ème tranche.
    Il n'est pas possible de faire un code si polyvalent... enfin si c'est possible mais ça devient ingérable, il faut faire en sorte que l'organisation soit uniforme.
    Pour que le code fonctionne il faut supprimer la ligne 21

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  16. #16
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Salut

    Mince j'ai oublié...
    sur ton fichier il y a 1 ligne vide qui sépare la 2ème tranche de données et 2 lignes vides qui sépare la 3ème tranche.
    Il n'est pas possible de faire un code si polyvalent... enfin si c'est possible mais ça devient ingérable, il faut faire en sorte que l'organisation soit uniforme.
    Pour que le code fonctionne il faut supprimer la ligne 21

    ++
    Qwaz
    On y est presque...
    Je te joint Exemple3 qui intègre la feuille résultant de l'opération: "Ce que j'ai obtenu"

    Si on le compare avec "Ce que j'aimerais avoir", il y a quelques écarts:
    J'aimerais ne pas récupérer la ligne récapitulant les pages (ex: Fichier membres: page 1)
    J'aimerais que les données des différents membres se cumulent les uns après les autres afin de pouvoir ensuite les trier selon le type de membre, l'année de naissance, la ville, ...
    Par ailleurs:
    Il faudrait que les données du champ "Adresse CP-Ville" soient redistribuées en 2 champs: ADRESSE (1ère ligne du champ d'origine) et CP-VILLE (2ème ligne du champ d'origine)
    Il faudrait que les données du champ "Informaions" soient redistribuées en 3 champs: TELEPHONE (derniers numéros (tous - 11) de la 2ère ligne du champ d'origine), DATE DE NAISSANCE (derniers numéros (tous - 19) de 3ème ligne du champ d'origine) et ACTIVITE (derniers numéros (tous - 10) de la 4ème ligne du champ d'origine)

    Cela est-il possible?

    Merci d'avance,

    Hervé
    Fichiers attachés Fichiers attachés

  17. #17
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Citation Envoyé par RV_EH Voir le message
    On y est presque...
    La communication positive a ses limites, par exemple quand on demande un truc au final totalement différent de ce qu'on demande au début, il sera difficile de me faire croire "qu'on y est presque..."

    Le code modifie directement les données sur la feuille.
    Dernier code après je passe à autre chose.

    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
    Sub ReorganisationBis()
    Dim iRow As Long
     
        'A adapter
        With Feuil1
            'On désactive l'affichage
            Application.ScreenUpdating = True
     
            'On boucle sur les données en partant du bas
            iRow = .Cells(.Rows.Count, "A").End(xlUp).Row
     
            While iRow > 1
                'On regarde si la cellule est fusionnée
                If .Cells(iRow, 1).MergeCells Then
                    'On supprime de la ligne d'avant à la ligne d'après
                    .Cells(iRow - 1, "A").Resize(3).EntireRow.Delete
                End If
                iRow = iRow - 1
            Wend
     
            'On supprime la 1ère ligne
            .Rows(1).EntireRow.Delete
     
            'On désactive l'affichage
            Application.ScreenUpdating = False
        End With
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  18. #18
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    La communication positive a ses limites, par exemple quand on demande un truc au final totalement différent de ce qu'on demande au début, il sera difficile de me faire croire "qu'on y est presque..."
    Je respecte totalement ton point de vue du sujet d'autant plus que c'est moi qui ai généré cette incohérence par envoi erroné du fichier.

    Je jugeais par mes faibles voires nulles compétences que la difficulté majeure résidait dans la restructuration du tableau, c'est à dire la suppression de toutes ces lignes polluantes et inutiles.
    C'est ce que fait ton programme et je t'en remrcie sincèrement.

    Je vais maintenant pousuivre mes recherches pour essayer d'éclater les 2 champs évoqués en 5 champs diféfrents me permettant (maintenant que les données sont compilées de manière cohérente) de pouvoir exploiter ces informations.

    Encore merci pour ton aide et en espérant que tu comprendras mon embarras

    Et si quelqu'un veut bien me guider pour cett edernière phase, je suis preneur.

    Hervé

  19. #19
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    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
    57
    58
    59
    60
    61
    62
    Sub ReorganisationBis()
    Dim iRow As Long
    Dim Adresse As Variant
    Dim StrTmp As String
     
        'A adapter
        With Feuil1
            'On désactive l'affichage
            Application.ScreenUpdating = False
     
            'On supprime la 1ère ligne
            .Rows(1).EntireRow.Delete
     
            'On ajoute les colonnes
            .Columns(4).Insert
            .Columns(6).Insert
            .Columns(7).Insert
     
            'On boucle sur les données en partant du bas
            iRow = .Cells(.Rows.Count, "A").End(xlUp).Row
     
            While iRow > 1
                'On regarde si la cellule est fusionnée
                If .Cells(iRow, 1).MergeCells Then
                    'On supprime de la ligne d'avant à la ligne d'après
                    iRow = iRow - 1
                    .Cells(iRow, "A").Resize(3).EntireRow.Delete
                Else
                    'On partage les données de la cellule Adresse
                    If InStr(1, .Cells(iRow, "C").Value, vbLf) <> 0 Then
                        Adresse = Split(.Cells(iRow, "C").Value, vbLf)
                        .Cells(iRow, "C").Value = Adresse(0)
                        .Cells(iRow, "D").Value = Adresse(1)
                    End If
                    'On partage les données de la cellule Info
                    If InStr(1, .Cells(iRow, "E").Value, vbLf) <> 0 Then
                        'On supprime les données parasites
                        StrTmp = Replace(.Cells(iRow, "E").Value, "Téléphone: ", "")
                        StrTmp = Replace(StrTmp, "Date de naissance: ", "")
                        StrTmp = Replace(StrTmp, "Activité: ", "")
                        'On découpe en suivant les sauts de ligne
                        Adresse = Split(StrTmp, vbLf)
                        .Cells(iRow, "E").Value = Adresse(1)
                        .Cells(iRow, "F").Value = Adresse(2)
                        .Cells(iRow, "G").Value = Adresse(3)
                    End If
                End If
                iRow = iRow - 1
            Wend
     
            'On modifie les entêtes
            .Range("C1").Value = "Adresse"
            .Range("D1").Value = "CP"
            .Range("E1").Value = "Téléphone"
            .Range("F1").Value = "Date de naissance"
            .Range("G1").Value = "Activité"
     
            'On active l'affichage
            Application.ScreenUpdating = True
        End With
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  20. #20
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 25
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sub ReorganisationBis()
    End Sub
    ++
    Qwaz
    Merci Qwaz!
    Le code fonctionne parfaitement sur mon fichier test et produit le résultat attendu.

    Si je l'exécute sur le fichier original, je reçoit à nouveau le message suivant:

    Erreur d'exécution '9'
    L'indice n'appartient pas à la sélection
    Mais cette-fois sur: .Cells(iRow, "G").Value = Adresse(3).

    J'ai balayé ce fichier et ai constaté certaines incohérenecs en termes de données:

    Les données adresse n'ont pas toujours de CP...
    Et sont pafois toutes sur 1 seule ligne (mais je ne crois pas à la lecture de ton code que cela influe).
    Par contre, je remarque que la partie adresse est toujours de 20 caractères (avec soit ajout d'espaces,, soit tronqué)

    Cela peut-il être la cause de l'erreur?

    Hervé
    Hervé

Discussions similaires

  1. Reformater un fichier Excel: 3 lignes sur une seule
    Par RV_EH dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/02/2020, 08h19
  2. [Batch] Fichier excel étrange via batch
    Par android59 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 26/04/2018, 09h49
  3. [XL-2010] exporter un fichier excel avec double quotes
    Par Melvine dans le forum Excel
    Réponses: 1
    Dernier message: 06/03/2014, 23h32

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