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 :

Probleme avec Find et FindNext


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Par défaut Probleme avec Find et FindNext
    Bonjour,

    J'ai un probleme avec les fonctions Find et FindNext
    J'essaye de récupérer les données dans une plage

    Colonne B reprend l'identification des devises soit CHF-NOK-USD etc..
    Colonne C Date du cours
    Colonne D Taux de change

    Voici mon code pour récupérer les données USD
    Dans la colonne B il y a 3 enregistrements < USD >
    Or cette procédure ne récupère que le 1er enregistrement
    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
     
    Sub Test()
     
        Dim Ws As Worksheet
        Dim Dev As Range, MaPlage As Range, Code As String
        Dim FirstAddress As String
     
     
        Set Ws = Worksheets(Feuil1.Name)
     
        Set MaPlage = Ws.Range("B2:B" & [B2].End(xlDown).Row)
        Code = "USD"
     
        Set Dev = MaPlage.Find(Code, LookIn:=xlValues)
     
        If Not Dev Is Nothing Then
            FirstAddress = Dev.Address
     
            Cells(Dev.Row, 7) = Dev.Value
            Cells(Dev.Row, 8) = Dev.Offset(0, 1)
            Cells(Dev.Row, 9) = Dev.Offset(0, 2)
     
            Do
     
                 Set Dev = MaPlage.FindNext(Dev)
     
            Loop While Not Dev Is Nothing And Dev.Address <> FirstAddress
     
        End If
     
     
    End Sub
    Merci de votre aide

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Je n'ai pas testé, mais il me semblerait plus judicieux de mettre la mise a jour des cellules dans la boucle
    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 Test()
     
        Dim Ws As Worksheet
        Dim Dev As Range, MaPlage As Range, Code As String
        Dim FirstAddress As String
     
     
        Set Ws = Worksheets(Feuil1.Name)
     
        Set MaPlage = Ws.Range("B2:B" & [B2].End(xlDown).Row)
        Code = "USD"
     
        Set Dev = MaPlage.Find(Code, LookIn:=xlValues)
     
        If Not Dev Is Nothing Then
            FirstAddress = Dev.Address
     
            Do
     
                 Cells(Dev.Row, 7) = Dev.Value
                 Cells(Dev.Row, 8) = Dev.Offset(0, 1)
                 Cells(Dev.Row, 9) = Dev.Offset(0, 2)
     
                 Set Dev = MaPlage.FindNext(Dev)
     
            Loop While Not Dev Is Nothing And Dev.Address <> FirstAddress
     
        End If
     
     
    End Sub

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    J'ai essayé, ça marche de mon coté.

    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
    Sub Test()
     
        Dim Ws As Worksheet
        Dim Dev As Range, MaPlage As Range, Code As String
        Dim FirstAddress As String
        Dim k As Long
     
        Set Ws = Worksheets("Feuil1")
        Set MaPlage = Ws.Range("B1:B" & [B2].End(xlDown).Row)
        Code = "USD"
        Set Dev = MaPlage.Find(Code, LookIn:=xlValues)
     
        If Not Dev Is Nothing Then
            FirstAddress = Dev.Address
            Do
                k = Dev.Row
                Cells(k, 7) = Dev.Value
                Cells(k, 8) = Dev.Offset(0, 1)
                Cells(k, 9) = Dev.Offset(0, 2)
                Set Dev = MaPlage.Offset(k - 1).Resize(MaPlage.Rows.Count - k + 1).Find(Code, LookIn:=xlValues)
            Loop While Not Dev Is Nothing And Dev.Row <> k
        End If
    End Sub

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Par défaut
    Bonjour AlphaScorpi,

    Merci pour ce code qui me donne bien le résultat souhaité

    Si cela était possible, je souhaiterais avoir un peu d'explication
    sur ce code que j'ai des difficultés a comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Dev = MaPlage.Offset(k - 1).Resize(MaPlage.Rows.Count - k + 1).Find(Code, LookIn:=xlValues)
    Merci encore et bonne journée

    Albert

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    Prenons pour l’exemple une plage de valeur qui va de B1 à B50.
    Si tu affectes cette plage à une variable, ici MaPlage.

    L’opération, Vte renvoyer $B$1:$B$50



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaPlage = MaPlage.offset(1)
    va décaler l’ensemble de la plage d’une ligne vers le bas.
    L’adresse sera donc maintenant, $B$2:$B$51




    Pour décaler d’une ligne vers le haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaPlage = MaPlage.offset(-1)
    Pour décaler d’une ligne vers la droite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaPlage = MaPlage.offset(,1)

    Tu peux également décaler une plage verticalement et horizontalement en meme temps :
    Par exemple, 5 vers le bas, 4 vers la gauche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaPlage = MaPlage.offset(5,-4)
    Toutes ces opérations modifient l’emplacement de la plage, mais n’en modifient pas la taille.




    Pour modifier la taille de la plage, il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resize(Nbr De Ligne, Nbr de Colonne)


    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaPlage = MaPlage.resize(10)
    réduira la taille de la plage à 10 lignes.
    L’adresse de MaPlage sera donc : $B$1:$B$10




    La même opération peut être effectuée horizontalement.
    donnera : $B$1:$C$50


    De meme que donnera : $B$1:$K$11






    Prenons maintenant comme plage de départ $B$1:$B$50, plage dans laquelle je dois effectuer ma recherche sur « USD »
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaPlage = Worksheets("Feuil1").Range("B1:B50")
    Dans un premier temps, j’effectue ma recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Dev = MaPlage.Find("USD", LookIn:=xlValues)
    Disons que la premiere valeur trouvée se situe en B6
    J’effectue quelques opérations sur cette cellule, puis je veux relancer ma recherche pour trouver la valeur suivante.
    Si je repends ma plage de départ la réponse sera de nouveau en B6, ce n’est pas ce que je souhaite.
    Je vais donc extraire le numéro de ligne ma précedente recherche.
    Je souhaite que ma recherche prenne comme point de départ les cellules situées apres cette ligne, je vais donc déplacer le début de ma plage sur cette ligne. (ici la ligne 6)
    La nouvelle plage sera donc $B$6:$B$55
    Hors je voulais uniquement faire des recherches juqu’a la ligne 50, donc je dois retirer 5 lignes de ma nouvelle plage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MaPlage.Offset(k - 1).Resize(MaPlage.Rows.Count - k + 1)
    Le résultat Obtenu sera donc : $B$6:$B$50
    Plage sur laquelle je pourrais lancer une nouvelle fois ma recherche etc…

  6. #6
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Par défaut
    Bonjour AlphaScorpi,

    Merci pour ces explications que je vais conserver pour y revenir si besoin

    Bonne journée

    Cordialement

  7. #7
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Par défaut
    Bonjour Jérôme

    Toutes mes excuses mais a la première lecture de votre code
    je n'ai pas remarqué la différence par rapport a mon code

    Votre code me donne le résultat souhaité

    Merci de votre aide et bonne journée

    Cordialement

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

Discussions similaires

  1. Problème avec .find et findnext
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/12/2009, 04h23
  2. [XL-2002] Probleme avec FIND
    Par sergio_gr66 dans le forum Excel
    Réponses: 3
    Dernier message: 03/12/2009, 14h32
  3. Probleme avec "find" pour une map
    Par Charlock dans le forum Visual C++
    Réponses: 8
    Dernier message: 22/05/2008, 12h38
  4. [ADO] Probleme avec Find
    Par Galaad dans le forum Access
    Réponses: 3
    Dernier message: 06/01/2006, 11h24

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