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 :

Macro VBA de recherche et d'extraction de valeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut Macro VBA de recherche et d'extraction de valeur
    Bonjour,

    je ne parviens pas à mes fins et mes recherches ne m’apporte pas la solution. Je demande votre aide !

    J'ai un fichier, comportant 3 colonnes de valeur à partir de la ligne 50 sur environ 200 lignes.

    Une des colonnes présente des valeur allant grosso modo de 0.0001 à 10.

    Je souhaite faire une extraction de ce tableau pour les lignes comportant des valeurs supérieur à 0.1 dans la deuxième colonne.

    Je souhaite que ça me crée un second tableau à coté, qui viennent me copié à la suite toutes les lignes du précédent tableau vérifiant cette condition.

    Et là je sèche.. !

    merci d'avance.

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonjour,

    pas besoin de macro pour cela, un filtre avancé suffit..

    menu Données avancée

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    En supposant que les 3 colonnes soient contiguës (A, B et C) !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test2()
    Dim C As Range, ligne As Long
    ligne = 49
    For Each C In Range([B50], Cells(Rows.Count, 2).End(xlUp))
        If C.Value > 0.1 Then
            ligne = ligne + 1
            Cells(ligne, 4).Resize(, 3).Value = C.Offset(, -1).Resize(, 3).Value
        End If
    Next C
    End Sub

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    @bbil
    bonjour ,j'ai besoin d'une macro pour après l'intégrer dans un processus plus général qui traite des données.

    @Daniel.C
    génial, . Merci beaucoup ça marche !

    je l'ai remodifié ainsi, pour la mettre au formalisme de mon fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Bouton1_Cliquer()
     
    Dim C As Range, ligne As Long
    ligne = 50
    For Each C In Range([B51], Cells(Rows.Count, 2).End(xlUp))
        If C.Value > 0.1 Then
            ligne = ligne + 1
            Cells(ligne, 11).Resize(, 4).Value = C.Offset(, -1).Resize(, 4).Value
        End If
    Next C
    End Sub
    dans mon fichier il s'agit en fait de paquet de ligne qui vont remplir la condition entrecoupé de lignes qui ne satisferont pas la condition.

    est il possible de séparer ces paquet par une ligne vide ou une ligne rempli de zéro ou autre,

    puis d'extraire à nouveau, par paquet une ligne correspondant au max ( par paquet ) trouvé sur la deuxième colonne?

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Oui, un filtre automatique ou avancé... à condition d'avoir des entêtes.

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    comment puis-je traduire ça en VBA ?

    merci d'avance

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Franchement, pour deux centes lignes, le gain de temps sera infinitésimal En supposant que tu n'aies pas d'entêtes et que la cellule B49 soit vide (sinon, il faut insérer une ligne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test4()
        Dim Plage As Range
        [B49] = "entête"
        Set Plage = Range("A49:C" & Cells(Rows.Count, 1).End(xlUp).Row)
        ActiveSheet.AutoFilterMode = False
        Plage.AutoFilter 2, ">.1"
        Set Plage = Plage.Offset(1).Resize(Plage.Rows.Count - 1)
        If Application.Subtotal(103, Plage) > 0 Then
            Plage.Copy [D50]
        End If
        [B49] = ""
        ActiveSheet.AutoFilterMode = False
    End Sub

  8. #8
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    un fichier a 200 lignes de valeur, mais la macro final va devoir traiter 200 fichiers de conception identique en même temps. Et sur plusieurs projets au fur et à mesure.

    Je vais essayer ça de suite ! merci

    Bon, j'ai du mal poser ma question.. la deuxième macro fait la même chose que la première mais d'une manière différente.

    Ma question portait juste sur l'évolution de la première: recherche du max pour chaque groupe de valeurs trouvé précédemment.

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Non, mais quand j'ai lu :

    génial, . Merci beaucoup ça marche !
    je n'ai pas été voir plus loin. La ligne correspondant au maximum est copiée en G50:I50 :

    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
    Sub test4()
        Dim Plage As Range, Ligne As Integer
        [B49] = "entête"
        Set Plage = Range("A49:C" & Cells(Rows.Count, 1).End(xlUp).Row)
        ActiveSheet.AutoFilterMode = False
        Plage.AutoFilter 2, ">.1"
        Set Plage = Plage.Offset(1).Resize(Plage.Rows.Count - 1)
        If Application.Subtotal(103, Plage) > 0 Then
            Plage.Copy [D50]
        End If
        [B49] = ""
        ActiveSheet.AutoFilterMode = False
        Set Plage = Range("E50:E" & Cells(Rows.Count, 5).End(xlUp).Row)
        Ligne = Application.Match(Application.Max(Plage), Plage, 0) + 49
        Cells(50, 7).Resize(, 3).Value = Cells(Ligne, 4).Resize(, 3).Value
    End Sub

  10. #10
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    Haa! j'avais peur de ne pas avoir été clair. Défois on est dans sa tete...

    Le code sort bien le max oui ! Mais en fait dans ma demande initiale il me faudrait le max de chaque paquet.

    Quand la macro tourne, elle va tomber sur une série de lignes qui ne rempliront pas la condition, puis une série de lignes ( de 1 à 40 par exemple) qui remplis la condition puis une série non, puis à nouveau une série qui remplissent la condition; et ainsi de suite.

    On pourrait le représenter comme ci dessous :

    0
    0
    0
    0
    0
    a1
    a2
    a3
    0
    0
    0
    0
    0
    b1
    b2
    b3
    b4
    b5
    b6
    b7
    b8
    0
    0
    0
    0
    c1
    0
    0
    0
    d1
    d2
    0
    0
    0
    0

    J'aimerais récupérer le max de la plage [a1 a2 a3] , ET le max de la plage [b2 b3 b4 b5 b6 b7 b8] , et le max de la plage [c]1 etc..

    est ce possible?

  11. #11
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    essai suivant , en reprenant le code de départ j'ajoute 2 conditions pour séparer mes groupes de valeurs d'une ligne vierge ou d'une ligne remplie de "0".

    problème, mes conditions de boucle doivent être mal définies ou mes next peut etre.. quelqu'un voit le soucis?



    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
    Sub Bouton1_Cliquer()
     
     
     
    Dim C As Range, ligne As Long
     
    ligne = 50
    For Each C In Range([B51], Cells(Rows.Count, 2).End(xlUp))
    For Each D In Range([B50], Cells(Rows.Count, 2).End(xlUp))
     
        If C.Value > 0.1 Then
            ligne = ligne + 1
            Cells(ligne, 6).Resize(, 4).Value = C.Offset(, -1).Resize(, 4).Value
            Else
     
             If C.Value < 0.1 Then
             If D.Value > 0.1 Then
             ligne = ligne + 1
             Cells(ligne, 6).Resize(, 4).Value = C.Offset(14, 14).Resize(, 4).Value
     
     
        End If
        End If
        End If
     
     
    Next D
    Next C
     
     
    End Sub

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Le redémarrage est difficile... Je n'arrive pas à comprendre comment tes données sont disposées. Peux-tu mettre un classeur exemple en PJ ?

  13. #13
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    Bien sur.
    Ci joint un doc excel, le premier onglet correspond au format d'origine , et le deuxième onglet au résultat attendu en fin de macro.

    Pour résumer :

    Etape 1 : ne garder que les lignes dont la deuxième colonne satisfait à la condition > 0.1

    Etape 2 : ne garder que le max ( toujours dans la deuxième colonne) dans chacun des groupes de données consécutives récupérées précédemment
    Fichiers attachés Fichiers attachés

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    le deuxième onglet au résultat attendu en fin de macro
    Il n'y a qu'un onglet, ou c'est mes yeux ?

  15. #15
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    allons bon, qu'est ce que c'est que ce maléfice !

    je me suis contenter de passer de csv à xls, c'est quand même pas ça qui a fait fusionner les onglets?

    bon sinon, de la colonne A à D c'est l'original, et de la colonne G à O les résultats de l'extraction..

    en attendant je replonge dans mon fichier pour comprendre..

  16. #16
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonjour,
    les fichiers csv sont aux format texte, il n'est pas question d'onglets...

  17. #17
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    je crois que tu as mis le doigt sur quelquechose...

  18. #18
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Dur dur, je n'y comprends rien... Peux-tu expliquer pourquoi il n'y a pas de résultat vis à vis de la ligne 49 et expliquer comment tu calcules les résultats de la ligne 51 ?

  19. #19
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 104
    Par défaut
    oui.

    la macro doit balayer la deuxième colonne ligne par ligne. Lorsque la valeur présente sur une ligne est supérieur à 0.1 , la macro doit recopier la ligne correspondante.

    si la condition >0.1 n'est pas respectée, la macro passe à la ligne suivante sans rien faire.

    Les lignes ainsi sélectionnée apparaitront toujours par lot, c'est à dire que à chaque fois il y aura (par exemple) 6 lignes se suivant qui satisferont la condition puis (par exemple) 50 ligne plus loin, à nouveau 8 lignes qui satisferont la condition.

    La première partie de la macro va donc faire apparaitre des groupes de lignes satisfaisant la condition.

    la ligne 54 est là pour montrer le passage d'un groupe à l'autre. Je ne sais pas si elle a un intérêt dans la réalisation de la macro en elle même.

    pour le résultat final présent sur la ligne 51, il s'agit de la ligne appartenant au premier groupe [G51;J53] présentant le maximum sur la colonne H.

    et il ya trois lignes de résultats finales, parceque dans l'étape précédente , la macro a trouvé trois groupes de lignes qui se suivent , satisfaisant la condition >0.1.

  20. #20
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    La ligne 49 satisfait la condition... Je ne vois pas ce que la ligne 54 a de particulier. Je ne vois aucune cellule supérieure à 0,1. Explique comment je trouve les valeurs G:O.

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

Discussions similaires

  1. Recherche mot dans .PDF avec macro VBA
    Par klemsy20 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 25/09/2019, 15h15
  2. Réponses: 2
    Dernier message: 22/04/2014, 14h40
  3. [XL-2003] Plage de recherche variable dans macro VBA
    Par CampaSC dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/07/2011, 19h27
  4. [Débutant] Recherche conditionelle et extraction de valeurs dans un tableau
    Par juliematlab dans le forum MATLAB
    Réponses: 10
    Dernier message: 10/05/2011, 17h36
  5. macro vba pour rechercher/remplacer
    Par amadou78 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/02/2010, 18h38

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