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 :

recherche d'une valeur texte dans une plage de cellules [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut recherche d'une valeur texte dans une plage de cellules
    Bonjour le forum!

    Avec une fonction Find, je cherche dans me colonne J la valeur texte "A FACTURER", si celle-ci apparait dans la plage, je souhaite relever les valeurs des cellules se trouvant 9 lignes au dessus de celle où est apparu "A FACTURER". POur commencer j'ai écris un code pour trouver ces éventuelles valeurs. mais rien ne se passe.. quelqu'un pourrait m'aider ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim PlageRecherche As Range
    With ActiveSheet
    Set PlageRecherche = .Range("J:J").Find(what:="A FACTURER", LookIn:=xlValues, lookat:=xlWhole)
            If Not PlageRecherche Is Nothing Then
            MsgBox "Valeur Trouvée!!"
            End If
    End With

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 910
    Points : 28 886
    Points
    28 886
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il faut utiliser la propriété OFFSET
    Exemple souligné et en gras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Dim PlageRecherche As Range
     With ActiveSheet
     Set PlageRecherche = .Range("J:J").Find(what:="A FACTURER", LookIn:=xlValues, lookat:=xlWhole)
     If Not PlageRecherche Is Nothing Then
        MsgBox "Valeur Trouvée!! " & PlageRecherche.Offset(-9, 0)
      End If
     End With
    Attention que le mot A FACTURER doit se trouver au minimum à la ligne 10 sinon il y aura un message d'erreur
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    Merci corona pour ta réponse rapide!

    le problème c'est qu'avec ce code il ne se passe rien.. aucune msgbox ne s'affiche alors qu'en J24 il y a bien "A FACTURER" .. ce "A FACTURER" s'insère par code vba à l'aide d'un double clic dans la cellule I24, cela peut il poser problème ??

    Edit : il y avait un espace en trop.; sl cela fonctionne parfaitement..

    je me pose une autre question..

    si "A FACTURER" revient plusieurs fois, comment stocker la valeur en offset (qui est le nom du client) ? car le but est que pour chaque"A FACTURER" détecté, le nom du client soit copié dans un autre classeur..

    et j'avoue ne pas trop savoir par quel bout commencer..

  4. #4
    Membre habitué
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Points : 152
    Points
    152
    Par défaut
    Bonjour,

    Alors je ne suis pas totalement sur de ce que j'ai fait par rapport à ta demande Mais si j'ai bien compris, on prend la valeur d'une cellule se trouvant 9 lignes plus haut que celle où a été trouvée la chaîne "A FACTURER", pour ensuite copier la valeur de la cellule plus haut dans un autre classeur. J'ai presque réussit, au détail près que la copie se fait dans une autre feuille du fichier Excel, et non un autre classeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim Cellule As Range
     
    For Each Cellule In ActiveSheet.Range("J:J")
        If Cellule.Value = "A FACTURER" Then
            'MsgBox "Valeur trouvée dans la cellule " & Cellule.Address
            Cellule.Offset(-9, 0).Select
            ActiveCell.Copy
            'MsgBox ActiveCell.Value
            Sheets("Sheet2").Select
            Range("A100").End(xlUp).Offset(1, 0).Select
            ActiveSheet.Paste
            Sheets("Sheet1").Select
        End If
    Next Cellule
    Les MsgBox c'était pour m'y retrouver pendant l'écriture

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 910
    Points : 28 886
    Points
    28 886
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Citation Envoyé par blackstrange Voir le message
    je me pose une autre question..
    si "A FACTURER" revient plusieurs fois, comment stocker la valeur en offset (qui est le nom du client) ? car le but est que pour chaque"A FACTURER" détecté, le nom du client soit copié dans un autre classeur..
    et j'avoue ne pas trop savoir par quel bout commencer..
    Je crois qu'il ne serait pas inutile que tu revoies l'organisation de tes tables.
    Pour rendre pérenne un projet informatique il est indispensable de bien organiser ses tables ou fichiers.
    Faire une facture en allant chercher les valeurs qui se trouve 9 lignes plus haut et sur la même colonne d'un mot A FACTURER me semble très acrobatique.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    Merci Ysae je vais tester tout de suite!

    Corona : ce n'est pas une facture.. c'est juste pour faire un tableau récapitulatif (dans un autre classeur) des clients à facturer.. car les personnes qui font les facturation n'ont pas besoin d'ouvrir mon fichier de base, juste d'avoir les noms des clients..

  7. #7
    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
    si "A FACTURER" revient plusieurs fois, comment stocker la valeur en offset (qui est le nom du client) ?
    Regarde l'aide sur Find, tu as un exemple à adapter pour ton cas.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    l'aide dans excel ? je n'ai pas trouvé beaucoup d'exemples..

  9. #9
    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
    Exemple de vba
    Exemple

    Cet exemple montre comment rechercher toutes les cellules de la plage A1:A500 dans la première feuille de calcul contenant la valeur 2 et comment la remplacer par la valeur 5.
    Visual Basic pour Applications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With Worksheets(1).Range("a1:a500")
         Set c = .Find(2, lookin:=xlValues)     
       If Not c Is Nothing Then 
                  firstAddress = c.Address 
                  Do             
               c.Value = 5             
               Set c = .FindNext(c) 
                  Loop While Not c Is Nothing And c.Address <> firstAddress 
           End If 
    End With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    mercatog : j'ain testé le code (en l'adaptant) mais j'ai un souci avec le ligne 'firstAddress', il faut définir la variable mais je ne sais pas quoi mettre...

  11. #11
    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
    Voila un exemple parlant! on met les résultats trouvé dans une variable tableau qu'on peut exploiter

    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
    Sub Test()
    Dim FirstAddress As String, Tb() As String
    Dim i As Integer, j As Integer
    Dim LastLig As Long
    Dim c As Range
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        With .Range("A1:A" & LastLig)
            Set c = .Find("A FACTURER", LookIn:=xlValues)
            If Not c Is Nothing Then
                FirstAddress = c.Address
                Do
                    i = i + 1
                    ReDim Preserve Tb(1 To 1, 1 To i)
                    Tb(1, i) = c.Offset(-9, 0)
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> FirstAddress
            End If
        End With
    End With
     
    '==================
    'à la fin on récuppère dans la variable tableau Tb, toutes les données souhaités
    If i > 0 Then
        For j = 1 To i
            Debug.Print Tb(1, j)
        Next j
        ' OU DIRECTEMENT
        Worksheets("Feuil2").Range("A1").Resize(i, 1) = Application.Transpose(Tb)
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  12. #12
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    Merci! je comprends tout le début du code mais pas la fin...
    tu me pourrais m'expliquer ce que fait le code ?? merci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'à la fin on récuppère dans la variable tableau Tb, toutes les données souhaités
    If i > 0 Then
        For j = 1 To i
            Debug.Print Tb(1, j)
        Next j
        ' OU DIRECTEMENT
        Worksheets("Feuil2").Range("A1").Resize(i, 1) = Application.Transpose(Tb)
    End If
    End Sub

  13. #13
    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
    A la fin de la première partie tu auras toutes les données trouvées dans la variable tableau Tb.
    Qu'est ce que tu veux faire des résultats trouvés?

    Pour la 2ème partie, c'était en exemple: affichage par une boucle des résultats ou écriture des résultat dans Feuil2
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  14. #14
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    mon but est de copier le nom des clients (contenu dans le tableau Tb si j'ai bien compris) dans le classeur facturation (feuille 1 par exemple, je compliquerai par la suite) en cellule A2!

  15. #15
    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
    Par exemple, ici je crée un nouveau classeur où j'inscris les résultats

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '==================
    'à la fin on récupère dans la variable tableau Tb, toutes les données souhaités
    If i > 0 Then
        'Je crée un nouveau classeur
        Set Wbk = Workbooks.Add(1)
        Wbk.Worksheets(1).Range("A2").Resize(i, 1) = Application.Transpose(Tb)
     
        Wbk.SaveAs "C:\Documents and Settings\Administrateur\Bureau\Clients.xls", xlNormal 'adapter le chemin
        Wbk.Close False
        Set Wbk = Nothing
    End If

    Et ici j'ouvre le classeur nommé Clients.xls et j'y insère les données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'à la fin on récuppère dans la variable tableau Tb, toutes les données souhaités
    If i > 0 Then
        'J'ouvre mon classeur clients
        Set Wbk = Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\Clients.xls") 'adapte le chemin complet du classeur où insérer les données
        Wbk.Worksheets(1).Range("A2").Resize(i, 1) = Application.Transpose(Tb)
        Wbk.Close True
        Set Wbk = Nothing
    End If
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  16. #16
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    ça fonctionne parfaitement!
    est-ce que je peux abuser de ton aide ? comment lui dire à excel de copier les valeurs à la première ligne vide de la colonne A ?

  17. #17
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With Wbk.Worksheets(1)
            .Cells(.Rows.Count, "A").End(xlUp)(2).Resize(i, 1) = Application.Transpose(Tb)
        End With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  18. #18
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    j'ai une erreur : "référence incorrect ou non qualifiée" concernant désolé..

  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
    Pas à la hâte, revois ton code car j'ai testé avant de poster la réponse.

    sinon, montre le code en entier que tu utilises.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  20. #20
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 129
    Points : 163
    Points
    163
    Par défaut
    Voici mon code, en effet une erreu c'était glissé... par contre après correction, rien ne se passe.. le classeur s'ouvre te se ferme mais rien n'est copié..
    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
    Private Sub Test1()
    Dim FirstAddress As String, Tb() As String
    Dim i As Integer, j As Integer
    Dim LastLig As Long
    Dim c As Range
    Dim Wbk As Workbook
     
    Application.ScreenUpdating = False
    With ActiveSheet
        LastLig = .Cells(.Rows.Count, "J").End(xlUp).Row
        With .Range("J1:J" & LastLig)
            Set c = .Find("A FACTURER", LookIn:=xlValues)
            If Not c Is Nothing Then
                FirstAddress = c.Address
                Do
                    i = i + 1
                    ReDim Preserve Tb(1 To 1, 1 To i)
                    Tb(1, i) = c.Offset(-9, 0)
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> FirstAddress
            End If
        End With
    End With
     
    If i > 0 Then
        Set Wbk = Workbooks.Open("D:.........Facturation.xlsm")
        With Wbk.Worksheets("Feuil1")
            .Cells(.Rows.Count, "A").End(xlUp)(2).Resize(i, 1) = Application.Transpose(Tb)
        End With
        Wbk.Close True
        Set Wbk = Nothing
    End If
    End Sub
    Edit : en mettant Wbk.Close False, le classeur devrait rester à l'écran mais rien ne se passe, j'ai l'impression que rien ne se passe du tout

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Réponses: 1
    Dernier message: 11/06/2008, 13h33
  5. Réponses: 10
    Dernier message: 30/11/2006, 23h06

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