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 :

Extraire les données d'une feuille vers une autre en les organisant via diverses méthodes


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Extraire les données d'une feuille vers une autre en les organisant via diverses méthodes
    Bonjour à toutes et à tous !

    Je me permets de vous solliciter dans le cadre du développement d'une appli VBA censée me faire gagner un temps énorme dans mon travail, disons-le clairement.

    Je suis assez calé sur EXCEL et l'utilisation de POWERPIVOT, mais en VBA, je nage (je coule en fait). Je pense que pour les habitués, mon problème est une petite broutille… en tout cas çà devrait faire un bon exercice sur les boucles à priori.

    Chaque jour, j’extrais deux fichiers de mon serveur concernant les statistiques d’appels de mon service (Fichier1) et des collaborateurs (Fichier2). Le problème est que les données ne sont absolument pas organisées pour que je puisse les exploiter via PORWERPIVOT.

    Elles sont organisées ainsi :
    Colonne B = inutile
    C1 = « Statistique » inutile également

    A1 = Objet
    D1 = Date d’extraction
    A2 = Valeur de l’objet (service ou nom du collaborateur suivant le fichier)
    C2 = Item1
    D2 = Valeur de l’Item1
    C3 = Item2
    D3 = Valeur de l’Item2
    Etc…

    Je suis parfois amené à extraire plusieurs journées. Dans ce cas les données s’organisent comme dans la colonne D en colonne E, et ainsi de suite. On retrouve en E1 le nom de la seconde journée extraite, et en E2 la valeur de l’Item1. Etc…

    Le nombre d’Item varie en fonction de ce que je choisi d’extraire au tout départ mais est identique sur les deux fichiers (leurs noms et leurs ordres également, et ce pour chaque date extraite)

    Une fois le dernier Item atteint, on redémarre avec un nouveau collaborateur sur la ligne suivante.
    L’organisation des données est inchangée, seules les valeurs de la ligne 1 ne sont pas reproduites.

    Je souhaite les organiser ainsi :
    En entête de colonnes = Objet(A), Date(B), Item1(C), Item2(D), etc…
    Puis
    Une ligne = 1 collaborateur (s'il y a plusieurs dates, je souhaite que la macro soit sur le même principe et qu'elle vienne mettre les données à la suite dans le tableau d'arrivée, POWERPIVOT se chargera du reste)

    La méthode est à mon avis la même pour les deux fichiers ( Service et collaborateurs ).

    J’ai testé plusieurs choses que j’ai trouvées sur le forum mais pour un novice comme moi, utiliser plusieurs méthodes dans une même macro relève de l’impossible.

    J’en viens donc à votre matière grise et votre expérience, à l’aide.

    Merci d’avance du temps que accorderez à ma demande.

    PS : Je peux joindre un fichier exemple afin d’illustrer mes propos pour ceux qui le souhaite.

  2. #2
    Membre actif Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Points : 253
    Points
    253
    Par défaut
    Bonjour,

    En suivant tes consignes, voici le code pour realiser la structure du tableau.
    On peut simplifier le code suivant, mais bon, il marche, je l'ai teste avec 5 objets differents (chaque objet contient des items differents) et 4 dates:

    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
     
    Sub MiseEnForme()
    Dim NbItem As Long, NbItembis As Long, NbObjet As Long, NbDate As Long, i As Long, j As Long, NbObjetbis As Long
    Dim tab_entete() As Variant, tab_objet() As Variant, tab_date() As Variant, tab_valeur() As Variant
     
    NbItem = 0
    NbItembis = 0
     
    For i = 2 To Sheet1.Cells(2, 3).End(xlDown).Row
        If WorksheetFunction.CountIf(Range(Sheet1.Cells(1, 3), Sheet1.Cells(i - 1, 3)), Sheet1.Cells(i, 3).Value) = 0 Then
            NbItem = NbItem + 1
        Else
        End If
    Next i
     
    ReDim tab_entete(NbItem + 1)
     
    tab_entete(0) = Sheet1.Cells(1, 1).Value
    tab_entete(1) = "date"
    For j = 2 To Sheet1.Cells(2, 3).End(xlDown).Row
        If WorksheetFunction.CountIf(Range(Sheet1.Cells(1, 3), Sheet1.Cells(j - 1, 3)), Sheet1.Cells(j, 3).Value) = 0 Then
            NbItembis = NbItembis + 1
            tab_entete(NbItembis + 1) = Sheet1.Cells(j, 3).Value
        Else
        End If
    Next j
     
    NbObjet = WorksheetFunction.CountA(Sheet1.Columns(1)) - 1
    NbDate = Sheet1.Cells(1, 4).End(xlToRight).Column - 3
    NbObjetbis = 0
     
    ReDim tab_objet(NbObjet * NbDate - 1)
    For i = 2 To Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
        If WorksheetFunction.CountIf(Range(Sheet1.Cells(1, 1), Sheet1.Cells(i - 1, 1)), Sheet1.Cells(i, 1).Value) = 0 And Sheet1.Cells(i, 1) <> "" Then
            NbObjetbis = NbObjetbis + 1
            tab_objet((NbObjetbis - 1) * NbDate) = Sheet1.Cells(i, 1).Value
            For j = 1 To NbDate - 1
                tab_objet((NbObjetbis - 1) * NbDate + j) = ""
            Next j
        Else
        End If
    Next i
     
    ReDim tab_date(NbObjet * NbDate - 1)
    For i = 0 To NbObjet - 1
        For j = 1 To NbDate
            tab_date(i * NbDate + j - 1) = Sheet1.Cells(1, 3 + j).Value
        Next j
    Next i
     
    Sheet1.Cells.ClearContents
    For i = 2 To NbObjet * NbDate + 1
        Sheet1.Cells(i, 1) = tab_objet(i - 2)
        Sheet1.Cells(i, 2) = tab_date(i - 2)
    Next i
    For i = 1 To NbItem + 2
        Sheet1.Cells(1, i) = tab_entete(i - 1)
    Next i
     
    End Sub
    dans un classeur vierge de 3 feuilles (Sheet1, Sheet2 et Sheet3), 1ere feuille reproduit le tableau en piece jointe.
    copie le code dans un module standard que tu auras cree
    ensuite dans la 2eme feuille, tu peux creer un bouton et lui associer la macro "MiseEnForme", execute la macro, et retourne dans ta premiere feuille, ca devrait fonctionner, puisque ca marche pour moi.

    Attention, mon Excel est en anglais, donc il peut y avoir des differences entre les noms de feuille qui peuvent empecher la macro de fonctionner correctement.

    Dis moi deja si la mise en forme te convient.

    Vanhoa
    Images attachées Images attachées  

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Tout d'abord merci pour ton message et le temps que tu as dû passer à çà, c'est vraiment sympa.

    J'ai testé rapidement, effectivement il y a un problème de compatibilité niveau anglais/francais.

    Je regarde çà à tête reposée ce soir et te ferai un retour un peu plus construit. Je mettrai des commentaires dans la macro pour voir si j'ai bien compris le process, c'est le plus important à mon sens.

    Merci encore !

  4. #4
    Membre actif Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Points : 253
    Points
    253
    Par défaut
    Tente de remplacer tous les "Sheet1" Par "Feuil1" (je crois que le nom de la premiere feuille par defaut est Feuil1 en francais)

    Je t'ai mis en piece jointe le fichier.

    Dans Sheet1, tu verras la mise en forme de depart selon tes consignes.
    Dans Sheet2 un bouton sur lequel tu cliques et ca va modifier la mise en forme dans Sheet1.

    Encore une fois, peut etre que Excel va automatiquement convertir les Sheet1 en Feuil1. Le probleme est que dans mon code, mes Sheet1 ne se transforment pas en Feuil1, c'est pourquoi tu dois le faire manuellement, si necessaire bien entendu.

    De toute facon, se ca ne marche pas, c'est juste une question de Sheet1/Feuil1

    Tiens moi au courant si ca ne marche toujours pas

    Vanhoa
    Fichiers attachés Fichiers attachés

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Re !

    Effectivement, le code fonctionne en remplaçant sheet1 par feuil1. J'ai réussi à comprendre pas mal de choses dans le code donc c'est cool. Je reste complètement largué dans les boucles, mais Paris c'est pas fait en 1 jour à ce qu'on dit.

    Cela dit, je savais que j'aurai dû mettre un fichier dès le départ. Je me suis très certainement mal exprimé au départ, méa culpa. Je mets un fichier joint. En feuille 1, c'est mon extraction de base. En feuille 3, le résultat attendu. En feuille 2, un début de macro, mais j'ai pas réussi à aller plus loin.

    J'aimerai que EXCEL comprennent qu'à chaque nouvelle date d'extraction, il fasse une ligne par collaborateur avec ses stats sur la ligne à partir de la colonne D. Quand une nouvelle date apparait, il refait une ligne avec le nom du collaborateur et ses stats du jour.

    De plus, pour simplifier les choses, je ne suis absolument pas contre à ce que les données aillent sur une autre feuille au contraire. Derrière cette mise en forme, j'ai tout un travail de déconcaténation à faire ainsi que le calcul de nouvelles stats à partir de celles extraites. Je maîtrise cette partie car elle se fait exclusivement à coup de formules EXCEL. Après j'envoie tout çà vers une autre base de données pour utiliser avec POWERPIVOT. Juste pour info, le tout premier fichier que j'extrait contient environ 1500 lignes (50 collaborateurs à peu près). Imagines la taille de ma base de données.

    Qu'en penses-tu?

    Merci d'avance ! :)

    TEST 3 EXTRACTION.zip

  6. #6
    Membre actif Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Points : 253
    Points
    253
    Par défaut
    Ok! Je vois!

    En fait, dans mon code je classais d'abord selon les objet, puis par date pour chaque objet, alors que le resultat attendu, c'est d'abord par les dates puis par les objets. Ce ne sera pas long a modifier je pense, mais je regarderais ca ce weekend certainement, car j'ai une journee de boulot chargee aujourd'hui

    Sinon, autre question, les valeurs correspondant a chaque item/date/objet, il faut que ca se remplisse aussi ou alors c'est simplement la mise en forme des entetes colonnes lignes? En reprennant ton extraction, les valeurs chiffrees, tu as besoin qu'elles se mettent automatiquement aussi?

    Oui je peux le faire dans une autre feuille au lieu d'ecraser la mise en forme initiale, c'est meme mieux et ca ne compliquera pas le code!

    Vanhoa

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Salut,

    Merci pour ton retour et surtout pour le temps que tu y passes encore une fois !

    Effectivement j'ai besoin que la macro s’exécute vers une autre feuille et que les données se mettent automatiquement dans cette feuille d'arrivée. Une donnée correspond toujours à un collaborateur, une date et un item.

    J'ai bossé un peu de mon coté aussi. Alors par contre je pense pas être sur la même méthode. Le code ci dessous me permet de créer les entêtes de colonnes en fonction du nombre d'item et de remplir la colonne objet en fonction du nombre de collaborateurs identifiés sur l'extraction. (je pense qu'il y a carrément moyen de simplifier..)

    Dans ma logique, la macro devrait ensuite :

    1/ Copier les données correspondantes à la première date extraite au départ vers le tableau créé
    2/ Recommencer l'intégralité de la macro tant qu'il y a des colonnes supplémentaires (en mettant à jour la colonne date dans la fonction de la macro?) dans la feuille d'extraction de départ et copier les données à la suite.

    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
    Sub copy()
     
    Application.ScreenUpdating = False
     
    Sheets("Feuil1").Activate
        Range("A1:A" & [A65000].End(xlUp).Row).SpecialCells(xlCellTypeConstants, 23).Select
        Selection.copy
        Sheets("Feuil2").Activate
        Range("A1").Activate
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = xlCut
     
     
     
    Dim cellule As Range, Plage As Range, Ctr As Long
        Sheets("Feuil1").Activate
        Set Plage = Range("C2", Range("C65536").End(xlUp))
        Ctr = 1
        For Each cellule In Plage
            If Not IsNumeric(Application.Match(cellule.Value, Sheets("Feuil2").Range("B:B"), 0)) Or Ctr = 1 Then
                Sheets("Feuil2").Range("B" & Ctr).Value = cellule.Value
                Ctr = Ctr + 1
            End If
        Next cellule
     
     
     
    Sheets("Feuil2").Activate
        Range("B1", Range("B65536").End(xlUp)).copy
        Range("C1").Activate
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
     
        Range("B1", Range("B65536").End(xlUp)).Select
        Selection.ClearContents
        Application.CutCopyMode = xlCut
     
     
     
    Range("B1").Activate
    ActiveCell.FormulaR1C1 = "Date"
     
    Sheets("Feuil1").Activate
     
    End Sub
    A très bientôt, je continue aussi de bosser de mon côté !

    ++

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour à toutes et à tous,

    Je relance un peu la communauté et remercie encore Vanhoa du temps passé à me répondre.

    Quelqu'un aurait il une idée pour faire comprendre à EXCEL que pour chaque "blocs d'item" rattaché à un collaborateur en Feuil1, il doit associer les valeurs correspondantes et venir les mettre sur la ligne dédiée au collaborateur en Feuil2 ? (voir Feuil3 pour résultat attendu)

    Le code que j'ai mis ci-dessus (sans balise, oui je sais, mais je pensais avoir fait ce qu'il fallait. Désolé pour les lecteurs ) s'exécute assez rapidement je trouve. Mon raisonnement pour la suite du déroulement de la macro me semble bon mais est ce vraiment réalisable? Bref, je renouvelle mon appel à l'aide !

    Je pense que pour l'instant, l'aspect plusieurs dates d'extraction peut être mis de côté, ce n'est pas une grosse priorité.

    Merci à d'avance à toi, lecteur ou contributeur du dimanche (c'est pas péjoratif, c'est juste qu'on est dimanche ! )

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Re,

    J'ai enfin trouvé une piste sérieuse ! J'ai préparé une partie du code, je n'arrive pas à comprendre comment créer la boucle en revanche.

    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
    Sub Transposer_les_données_collaborateurs()
     
     'calcul du nombre d'item par collaborateur, ici 25
      i = ((WorksheetFunction.CountA(Sheets("Feuil1").Columns(3)) - 1)) / ((WorksheetFunction.CountA(Sheets("Feuil1").Columns(1)) - 1))
     
    'for each cellule non vide de la colonne A à partir de A2, alors copy du range situé offset(0, 3).resize(i, 1)
    'ensuite paste special (transposer) à la ligne suivante sur feuil2 à partir de C2
    'si possible écrire en même temps la date de l'extraction (D1) à la ligne suivante sur Feuil2 à partir de B2
     
    'le code ci-dessous fonctionne mais uniquement pour mon premier collaborateur
     
    Sheets("Feuil1").Select
    Range("A2").Offset(0, 3).Resize(i, 1).copy
     
    Sheets("Feuil2").Select
        Range("C2").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=True
    Application.CutCopyMode = False
    End Sub

    Suis-je sur la bonne voie?

    Merci de votre aide !

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous !

    Toujours personne pour m'aider à comprendre comment faire? Je commence à me demander si j'ai fais quelque chose qu'il ne fallait pas, notamment sur les règles pour poster une demande...

    Est ce le cas ou c'est tout simplement que ma demande est irréalisable?

    Merci à tous.

  11. #11
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour Maaestro.

    Je trouve que tu te débrouilles très bien. J'aime bien ton approche du problème.

    Il ne te reste plus qu'à y ajouter deux For...Next et à les utiliser dans ton code.

    Je te laisse modifier le code suvant pour le rendre fonctionnel.

    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
    Sub Transposer_les_données_collaborateurs()
     
     'calcul du nombre d'item par collaborateur, ici 25
      i = ((WorksheetFunction.CountA(Sheets("Feuil1").Columns(3)) - 1)) / ((WorksheetFunction.CountA(Sheets("Feuil1").Columns(1)) - 1))
     
    'for each cellule non vide de la colonne A à partir de A2, alors copy du range situé offset(0, 3).resize(i, 1)
    'ensuite paste special (transposer) à la ligne suivante sur feuil2 à partir de C2
    'si possible écrire en même temps la date de l'extraction (D1) à la ligne suivante sur Feuil2 à partir de B2
     
    'le code ci-dessous fonctionne mais uniquement pour mon premier collaborateur
     Set f2 = Worksheets("Feuil2")
     f2.Cells.Clear
    NbCollaborateurs = WorksheetFunction.CountA(Sheets("Feuil1").Columns(1)) - 1
     
     
    lignedest = 2
    For Coldate = 3 To 4
     
    debut = 2
    For collab = 1 To NbCollaborateurs
     
    Sheets("Feuil1").Select
    Range("A" & debut).Offset(0, 3).Select
    Range("A" & debut).Offset(0, 3).Resize(i, 1).copy
     
    Sheets("Feuil2").Select
        Range("C" & lignedest).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    Application.CutCopyMode = False
    debut = debut + i
    lignedest = lignedest + 1
     
    Next
    Stop
    Next
     
    End Sub

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Tout d'abord, merci pour ton message encourageant. J'arrête pas de tester depuis tout à l'heure, je sens que je touche au but mais il manque le petit plus de l'expérience.

    Je prend un peu de temps pour regarder ta proposition et la comprendre et reviens poster pour échanger si possible. Faudra que je réussisse à tout assembler par la suite (boucle générale si plusieurs date extraites?), encore quelques heures de mal de crâne en perspective

    Merci encore. A très bientôt !

  13. #13
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour Maaestro

    Solution :

    Remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A" & debut).Offset(0, 3).Resize(i, 1).copy
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A" & debut).Offset(0, Coldate).Resize(i, 1).copy

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'ai pas eu le temps de regarder en détail détail mais c'est bien ce que je pensais faire pour les dates, c'est cool çà veut dire que j'ai à peu près compris. Merci encore !

    J'aurai plus de temps ce soir pour me plonger sérieusement dedans et mettrai l'intégralité du code dans le fil de la discussion.

    A très bientôt !

    Cordialement,

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous !

    Je touche au but ! Je mets ci-dessous le code qui fonctionne parfaitement selon toutes les conditions de départ (extraction en fonction du nombre de collaborateurs, du nombre de dates et d'Items choisis) Bref, c'est génial ! J'ai testé un fichier comprenant 1526 lignes, 61 collaborateurs, 25 items par collaborateurs et 5 dates différentes : la macro s'exécute en 4s C'est ma première macro et je tiens à remercier les contributeurs pour leur aide précieuse !!

    Un bémol, ma manière d'extraire les items n'est pas optimale et me fais supprimer "B1" en Feuil2, correspondant à mon entête nommée "Date". Je rajoute une étape car c'est un code que j'ai récupéré et adapté, mais pour lequel ce n'est pas aussi clair que le reste de la macro .

    Comment puis-je simplifier cela?

    Deuxième chose
    Je vais déclencher cette macro via un bouton situé dans un Userform. Comment puis-je demander à l'utilisateur de taper le nombre de dates extraites afin de modifier le For Coldate = 3 to "choix de l'utilisateur" ? Est ce vraiment le meilleur moyen ou faut il faire faire un scan du nombre de colonnes dans la première feuille et adapter la macro en fonction? (Pour le coup si c'est çà, je suis complètement largué!)

    Voici le code avec les commentaires:

    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
    Sub copy()
    Application.ScreenUpdating = False
    'nettoyage de la feuille 2
     Set f2 = Worksheets("Feuil2")
     f2.Cells.Clear
     
    'entête Objet feuile 2
    Sheets("Feuil2").Activate
        Range("A1").Activate
        ActiveCell.FormulaR1C1 = "Objet"
     
    'entête Date feuille 2
    Sheets("Feuil2").Activate
        Range("B1").Activate
        ActiveCell.FormulaR1C1 = "Date"
     
    'Calcul du nombre d'items (suppressions des doublons) et copie en entête tableau feuille 2
    Dim cellule As Range, Plage As Range, Ctr As Long
        Sheets("Feuil1").Activate
        Set Plage = Range("C2", Range("C65536").End(xlUp))
        Ctr = 1
        For Each cellule In Plage
            If Not IsNumeric(Application.Match(cellule.Value, Sheets("Feuil2").Range("B:B"), 0)) Or Ctr = 1 Then
                Sheets("Feuil2").Range("B" & Ctr).Value = cellule.Value
                Ctr = Ctr + 1
            End If
        Next cellule
     
    'comment puis je faire pour inclure le bout de code ci-dessous au bout de code ci-dessus? (pour l'instant, çà me squeeze l'entête de colonne "Date"
    Sheets("Feuil2").Activate
        Range("B1", Range("B65536").End(xlUp)).copy
        Range("C1").Activate
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, transpose:=True
     
        Range("B1", Range("B65536").End(xlUp)).Select
        Selection.ClearContents
        Application.CutCopyMode = xlCut
     
    'calcul du nombre de collaborateurs 
     
    i = ((WorksheetFunction.CountA(Sheets("Feuil1").Columns(3)) - 1)) / ((WorksheetFunction.CountA(Sheets("Feuil1").Columns(1)) - 1))
     
    NbCollaborateurs = WorksheetFunction.CountA(Sheets("Feuil1").Columns(1)) - 1
     
    lignedest = 2
     
    'c'est la que çà se passe tonton
    For Coldate = 3 To 7
     
    debut = 2
     
    For collab = 1 To NbCollaborateurs
     
    'copie des données
    Sheets("Feuil1").Select
    Range("A" & debut).Offset(0, Coldate).Select
    Range("A" & debut).Offset(0, Coldate).Resize(i, 1).copy
     
    Sheets("Feuil2").Select
        Range("C" & lignedest).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=True
    Application.CutCopyMode = False
     
    'copie du nom du collaborateur
    Sheets("Feuil1").Select
        Range("A" & debut).Select
        Range("A" & debut).copy
     
    Sheets("Feuil2").Select
        Range("A" & lignedest).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=False
     
    'copie de la date extraite
    Sheets("Feuil1").Select
        Cells(1, Coldate + 1).Select
        Cells(1, Coldate + 1).copy
     
    Sheets("Feuil2").Select
        Range("B" & lignedest).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=False
     
     
    debut = debut + i
    lignedest = lignedest + 1
     
    Next
    Next
    End Sub
    Merci de votre retour !

    Cordialement,

  16. #16
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Puis-je proposer une autre variante?
    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
    Option Explicit
     
    Sub Former()
    Dim LastLig As Long, NewLig As Long, i As Long, N As Long, Nb As Long
    Dim LastCol As Integer, j As Integer, Nc As Integer
    Dim Tb, Res, Tbl, Tmp, Cpl, MesDates
    Dim MonDico As Object
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")                             'A adapter
        LastLig = .Cells(.Rows.Count, 3).End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        Tb = .Range("A1").Resize(LastLig, LastCol)
    End With
     
    Set MonDico = CreateObject("Scripting.Dictionary")
     
    For i = 2 To LastLig
        If Tb(i, 1) = "" Then Tb(i, 1) = Tb(i - 1, 1)
        If Not MonDico.exists(Tb(i, 3)) Then
            MonDico.Add Tb(i, 3), Tb(i, 1) & "|" & F(Tb, i)
        Else
            MonDico(Tb(i, 3)) = MonDico(Tb(i, 3)) & "µ" & Tb(i, 1) & "|" & F(Tb, i)
        End If
    Next i
    MesDates = LesDates(Tb)
    N = MonDico.Count
    Nb = (LastLig - 1) / N
    Nc = LastCol - 3
    Tbl = MonDico.Items
     
    With Worksheets("Feuil2")                             'A adapter
        .UsedRange.Clear
        .Range("A1:B1") = Array("Objet", "Date")
        .Range("C1").Resize(1, N) = MonDico.Keys
        Set MonDico = Nothing
     
        For i = 0 To N - 1
            Res = Split(Tbl(i), "µ")
            NewLig = 2
            For j = 0 To Nb - 1
                Cpl = Split(Res(j), "|")
                If i = 0 Then
                    .Cells(NewLig, 1).Resize(Nc, 1) = Application.Transpose(Cpl(0))
                    .Cells(NewLig, 2).Resize(Nc, 1) = MesDates
                End If
                Tmp = Split(Cpl(1), ";")
                .Cells(NewLig, i + 3).Resize(Nc, 1) = Application.Transpose(Tmp)
                NewLig = NewLig + Nc
            Next j
        Next i
    End With
    End Sub
     
    Private Function F(ByVal Tb, ByVal i As Long) As String
    Dim S As String
    Dim j As Integer
     
    For j = 4 To UBound(Tb, 2)
        S = S & ";" & Tb(i, j)
    Next j
     
    F = Mid(S, 2)
    End Function
     
    Private Function LesDates(ByVal Tb)
    Dim j As Integer
    Dim Tmp()
     
    ReDim Tmp(1 To UBound(Tb, 2) - 3, 1 To 1)
     
    For j = 4 To UBound(Tb, 2)
        Tmp(j - 3, 1) = Tb(1, j)
    Next j
    LesDates = Tmp
    End Function

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci pour ta réponse et ta proposition qui m'a l'air d'être bien bien complète également. Je suis vraiment débutant en VBA donc je vais mettre un peu de temps à comprendre ce qui se passe dedans . A première vue j'ai l'impression que tu créer carrément un tableau. Je regarde çà de plus près et reviens vers toi dès que possible.

    En tout cas merci énormément à vous tous, c'est vraiment super appréciable surtout quand on voit la qualité des propositions !

    PS: juste pour info, vous avez mis combien de temps à réaliser ce code? (Curieux de voir à quel point la route va être longue lol)

    Merci et bonne nuit !

    Cordialement,

  18. #18
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour mercatog

    Ton code rencontre un problème avec certains nombres:
    Exemple: il produit 834446759259259 au lieu de 8,34446759259259

  19. #19
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Oui effectivement, c'est un problème rencontré avec la virgule comme séparateur décimal. Les aléas des variants hélas.
    Personnellement j'utilise le point.

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous !

    J'ai testé ton code et ai effectivement rencontré ce petit problème. Ces nombres sont en réalité des hh:mm:ss (en mode numérique) pour la plupart. En tout cas il va me falloir un moment pour décrypter tout cela je pense.

    Afin de poursuivre sur ma manière de transposer les items, y a-t-il une possibilité de ne le faire qu'en une seule étape? Mon code va cherche le nombre d'item et leurs noms (cool), les copie à la verticale, puis je transpose.

    Voici la partie du code correspondante :

    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
    Dim cellule As Range, Plage As Range, Ctr As Long
        Sheets("Feuil1").Activate
        Set Plage = Range("C2", Range("C65536").End(xlUp))
        Ctr = 1
        For Each cellule In Plage
            If Not IsNumeric(Application.Match(cellule.Value, Sheets("Feuil2").Range("B:B"), 0)) Or Ctr = 1 Then
                Sheets("Feuil2").Range("B" & Ctr).Value = cellule.Value
                Ctr = Ctr + 1
            End If
        Next cellule
     
    Sheets("Feuil2").Activate
        Range("B1", Range("B65536").End(xlUp)).copy
        Range("C1").Activate
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, transpose:=True
     
        Range("B1", Range("B65536").End(xlUp)).Select
        Selection.ClearContents
        Application.CutCopyMode = xlCut
    Une petite idée?

    Merci à vous.

    (PS: j'essaye de trouver la solution tout seul pour demander à l'utilisateur de choisir le nombre de dates extraites (via box?) et venir mettre à jour dans la macro. Je mettrai à jour le code en suivant)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Transférer une ligne d'une feuille vers une autre feuille
    Par ElPibeOro dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/04/2012, 10h20
  2. Déplacer une image d'une feuille vers une autre dans un fichier Excel
    Par helenaide dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2011, 14h27
  3. [XL-2007] copier une ligne d'une feuille vers une autre feuille
    Par scarfunk dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/05/2010, 22h18
  4. Macro Copier données d'une feuille vers une feuille cible
    Par La Zélie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/09/2008, 10h01
  5. Réponses: 8
    Dernier message: 12/10/2007, 12h54

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