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 :

Extraction de données d'une feuille excel [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut Extraction de données d'une feuille excel
    Bonjour,
    J'espère que je vais arriver à être claire....
    Voilà j'ai un fichier avec 3 colones qui compte 1 million de lignes (environs):
    -identifiant
    -date + heure
    -une consomation

    chaque identifiant reprend les consommations heure par heure (normalement) chaque jour. Cependant il existe des trous (au lieu de 24 donnée je peux en avoir que 12 ou parfois 48). Du coup j'ai dans un premier temps fait une macro qui à chaque identifiant associe sur la même ligne la lite des jours où j'ai bien mes 24 valeurs.
    Maintenant je souhaite traiter un échantillon d'identifiant (exemple le A le AF et le V), et pour ceux-ci je ne veux conserver qu'un jour de semaine et un jour de weekend.
    J'aimerai donc créer une macro qui me copie colle directement dans une "nouvelle" feuille (si c'est possible) le premier jour "semaine" complet (donc de 24 points) qu'on a déjà repéré avec la macro précédente)de chaque identifiant et dans une autre feuille le premier jour "weekend" complet (24 points) de chaque identifiant
    Cependant je ne sais absolument pas comment m'y prendre. Je m'y connais très très peu en VBA...
    J'espère que vous pourrez m'aiguiller me dire qu'elle fonction utiliser, et si c'est réalisable.

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    j'ai lu ton explication mais j'ai des questions
    Citation Envoyé par Mikahdo Voir le message
    ... Maintenant je souhaite traiter un échantillon d'identifiant (exemple le A le AF et le V), et pour ceux-ci je ne veux conserver qu'un jour de semaine et un jour de weekend. ...
    quel jour par semaine ou weekend veux-tu ?



    Citation Envoyé par Mikahdo Voir le message
    ...J'aimerai donc créer une macro qui me copie colle directement dans une "nouvelle" feuille (si c'est possible) le premier jour "semaine" complet (donc de 24 points) qu'on a déjà repéré avec la macro précédente)de chaque identifiant et dans une autre feuille le premier jour "weekend" complet (24 points) de chaque identifiant...
    Peux-tu montrer ton code déjà fait car a mon avis il suffit de le modifier

    Citation Envoyé par Mikahdo Voir le message
    ...Cependant je ne sais absolument pas comment m'y prendre. Je m'y connais très très peu en VBA...
    J'espère que vous pourrez m'aiguiller me dire qu'elle fonction utiliser, et si c'est réalisable.

    Merci d'avance.
    Pas de soucis on va t'aider à priori cela semble pas un problème insurmontable

    cependant juste histoire d'une un peu de grain à mondre ce cerait bien d'avoir une peu d'exemple quelques lignes significatives pas ton million de lignes
    Abientôt

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Salut à toi,

    Ton problème est classique sur ce forum et "simple" à résoudre... Cependant nous n'avons aucune information précise. Peux-tu nous montrer ton code déjà réalisé ? Peux-tu nous donner des informations plus détaillées sur tes fichiers ?

    Tu auras très vite des réponses si ton problème est mieux énoncé

    Quentin

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Igloobel
    1) Je veux le jour de la semaine (peu importe lequel) qu'il ma renvoyé lors de ma première macro et donc que je sais "complet" (24 points)
    exemple :
    résultat de la macro1
    id nb point jour
    3845040816 84 mardi 17 mercredi 18 jeudi 19

    Ici par exemple il serait simpa qu'il me copie colle dans une nouvelle feuille le mercredi 17. Par contre comme tu le vois, il n'y a pas de jour weekend "complet" pour cet identifiant.

    2) Ma première macro (très basique ce n'est que des if) est la suivante
    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
    Sub boucle24()
     
    Dim i As Double, nbBranch As Double, nbHoraire As Double, jour As Double, jour2 As Double, compteur As Double
    Dim sNom As String, sNom2 As String, sSemaine As String
     
    i = 2
    nbBranch = 1
    nbHoraire = 1
    jour = Cells(2, 5)
    sNom = Cells(2, 1)
    nbJour = 1
    compteur = 1
     
    While Cells(i, 1) <> ""
     
        sNom2 = Cells(i, 1)
        jour2 = Cells(i, 5)
        If jour = jour2 Then
            nbJour = nbJour + 1
        End If
     
        If jour <> jour2 Then
     
     
        If nbJour = 24 Then
     
        sSemaine = Cells(i, 8) & " " & CStr(jour)
     
        Cells(nbBranch, 13 + compteur) = sSemaine
        compteur = compteur + 1
        End If
     
        nbJour = 1
        jour = jour2
     
        End If
        If sNom = sNom2 Then
            nbHoraire = nbHoraire + 1
        End If
     
        If sNom <> sNom2 Then
            Cells(nbBranch, 12) = sNom
            Cells(nbBranch, 13) = nbHoraire - 1
            sNom = sNom2
            nbBranch = nbBranch + 1
            nbHoraire = 1
            compteur = 1
        End If
     
     
     
        i = i + 1
    Wend
     
    MsgBox i
    MsgBox nbBranch
     
    End Sub
    voici une image de mon tableau (j'ai pas su comment l'intégrer autrement ici) la colone 1 est mon identifiant, idem pour la colone 2 (la base de données que j'ai extraite été comme ça ne me demandais pas pourquoi j'ai deux fois l'information), la colone 3 la date et l'heure, la 4 c'est l'index indicant ma consomation, la 5 c'est le jour du moi (chiffre), la 6 c'est juste pour savoir combien on a de valeur sur le jour (mais ça ne rentre pas en compte dans mon code précédent), la 7 est inutile j'avais tenté quelque chose qui n'a pas fonctionné et enfin la 7 c'est le jour de la semaine qui est après indiqué dans le résultat que j'ai noté en haut
    Nom : aide forum.png
Affichages : 152
Taille : 50,1 Ko

    Quentin77170
    Le code est au dessus, pour les information complémentaire je veux bien vous donner tout ce dont vous avez besoin mais 1) je suis tellement dans mon boulot que ce qui me parait clair ne l'ai peut être pas donc il faut me le dire, 2) je connais pas grand chose en vba ect, je ne sais donc pas ce qui peut vous être utile

    Merci à tous pour vos réponses

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    N'ayant pas de réponse j'ai tenté un code qui bug sur la fonction .Find
    Si quelqu'un pouvait m'aider s'il vous plait.
    De plus je pense que ma macro a un problème dans le sens où si il ne trouve pas de jour semaine ET weekend il va planter non? mais si je met un OU il s'arrêtera trop tôt sans me copier mon jour weekend complet....
    Merci d'avance, j'espère que vous pourrez m'aider (et désolé si le code est mal écrit, je fais comme je peux....)
    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
    Sub selection()
     
    Dim i As Integer, c As Integer, j As Integer, lig As Integer, nbsemaine As Integer, nbweekend As Integer
    Dim sNom As String, criter1 As String
     
    i = 1
    j = 2
    lig = 1
    Application.ScreenUpdating = False
    While Cells(i, 10) <> ""
        criter1 = Cells(i, 10)
        lig = Range(Cells(2, 1), Cells(1048576, 1)).Find(criter1).Row
            While nbsemaine <> 1 And nbweekend <> 1
                If Cells(lig, 7) = 1 Then
                    If Cells(lig, 8) = "lundi" Or "mardi" Or "mercredi" Or "jeudi" Or "vendredi" And nbsemaine = 0 Then
                        Range(Cells(lig, 8), Cells(lig - 23, 1)).Copy
                        Windows("modèle.xlsm").Activate
                        Sheets("mars2015 semaine").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbsemaine = nbsemaine + 1
                    End If
                    If Cells(lig, 8) = "samedi" Or "dimanche" And nbweekend = 0 Then
                        Range(Cells(lig, 8), Cells(lig - 23, 1)).Copy
                        Windows("modèle.xlsm").Activate
                        Sheets("mars2015 weekend").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbweekend = nbweekend + 1
                    End If
                End If
                lig = lig + 1
            Wend
            i = i + 1
    Application.ScreenUpdating = True
    Wend
     
    End Sub
    dans la colone10 qui me sert de critère, j'y ai mis la liste de l'échantillon sur lequel je souhaite travailler (celui-ci doit pouvoir varier parfois j'en ai 2 parfois j'en ai 27 ou 20....)
    Si vous avez besoin d'autre renseignement je suis a votre disposition.

    Edit 15h24 : Je me suis dit que je pouvais régler mon problème d'avoir un jour semaine et/ ou un jour weekend en remplaçant mon while par un for avec un compteur qui aurait le nombre de ligne contenant mon id (je pense savoir comment faire ça)
    Mais cela ne règle pas mon problème pour trouver la première ligne contenant mon id (mon fameux. find à la 12ème ligne qui ne marche pas)

    Merci d'avance pour vos réponse (j'ai vraiment besoin de votre aide mais j'y met toute ma volonté pour réussir à trouver quelque chose et vous le proposer, mon but n'est pas que vous me donniez un code mais d'apprendre. J'en ai vraiment besoin merci)

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Voilà encore des nouvelle.
    j'ai presque trouvé, il me manque un dernier coup de pouce svp.
    Tout s'exécute très bien sauf qu'il me fait un seul copier collé pour un seul jour (weekend ou semaine) et pour il s'arrète sans passer à l'identifiant numéro 2 à extraire de ma liste. Je pense qu'il doit s'agir d'une bête erreur de mon codage mais je trouve pas. Merci par avance.
    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
    Sub selection()
     
    Dim i As Integer, j As Integer, Lig As Long, nbsemaine As Integer, nbweekend As Integer
    Dim sNom As String, criter1 As String
    Dim nbre As Integer, Cptr As Long
     
    i = 1
    j = 2
     
    Application.ScreenUpdating = False
     
    While Cells(i, 10) <> ""
        criter1 = Cells(i, 10)
        nbre = Application.CountIf(Columns("A"), criter1)
        If nbre = 0 Then
        i = i + 1
        Else
        Lig = ActiveSheet.Columns(1).Find(what:=criter1).Row
            For Cptr = 1 To nbre
                If Cells(Lig, 7) = 1 Then
                    If Cells(Lig, 8) = "lundi" And nbsemaine = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil1").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbsemaine = nbsemaine + 1
                    End If
                    If Cells(Lig, 8) = "mardi" And nbsemaine = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil1").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbsemaine = nbsemaine + 1
                    End If
                    If Cells(Lig, 8) = "mercredi" And nbsemaine = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil1").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbsemaine = nbsemaine + 1
                    End If
                    If Cells(Lig, 8) = "jeudi" And nbsemaine = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil1").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbsemaine = nbsemaine + 1
                    End If
                    If Cells(Lig, 8) = "vendredi" And nbsemaine = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil1").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbsemaine = nbsemaine + 1
                    End If
                    If Cells(Lig, 8) = "samedi" And nbweekend = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil2").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbweekend = nbweekend + 1
                    End If
                    If Cells(Lig, 8) = "dimanche" And nbweekend = 0 Then
                        Range(Cells(Lig, 8), Cells(Lig - 23, 1)).Copy
                        Sheets("Feuil2").Select
                        Cells(j, 1).Select
                        ActiveSheet.Paste
                        j = j + 24
                        nbweekend = nbweekend + 1
                    End If
                End If
                Lig = Lig + 1
            Next
            i = i + 1
            nbsemaine = 0
            nbweekend = 0
        End If
    Application.ScreenUpdating = True
    Wend
    End Sub

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si ta colonne qui numérote le nombre de mesure réalisée sur la journée (voir copie écran de ton message #4) existe dans le fichier ET que tes données sont triées comme dans la copie écran, on peut :

    (1) utiliser un filtre automatique sur le chiffre 24
    (2) tester chaque ligne filtrée : on regarde si c'est semaine ou weekend pour définir si on en a besoin ou pas (fonction du nombre d'échantillon que tu veux et du nombre d'échantillon que tu as déjà extrait)
    (3) récupérer le numéro de la ligne
    (4) copier les 24 lignes au moyen de l'identification faite à l'étape suivante
    (5) s'il faut encore des échantillons, répéter le processus à partir de la ligne 2 .. sinon on s'arrête


    si tu as des difficultés pour réaliser cela, merci de joindre le début du code que tu auras essayé ainsi qu'un fichier exemple présentant quand même un nombre significatif d'échantillons (des échantillons complets et incomplets, des jours semaines et des jours weekend)

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

Discussions similaires

  1. Extraction de données d'une feuille Excel
    Par sat478 dans le forum Excel
    Réponses: 3
    Dernier message: 21/07/2009, 20h19
  2. Réponses: 2
    Dernier message: 16/10/2006, 11h24
  3. Importer les données d'une feuille EXCEL
    Par codial dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/02/2006, 09h07
  4. Réponses: 3
    Dernier message: 16/02/2005, 15h39
  5. [CR]Importer des données d'une feuille excel
    Par rolan dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 17/12/2004, 22h32

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