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 :

Rechercher une chaine de caractères


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Rechercher une chaine de caractères
    Bonjour,

    J'ai un problème sur une macro que j'ai réalisé afin de faire un test simple dans un premier temps.

    Voila j'ai ma première colonne dans laquelle j'ai écrit pablo_1 ..... pablo_1000
    Entre ces deux extrêmes se trouvent pablo_100 que je souhaite trouver afin par la suite copier la ligne qui lui est associé. Mais mon problème se situe au niveau du Selection.Find, j'ai un retour d'erreur : Erreur d'execution '91': Variable objet ou variable de bloc With non définie.

    Voilà mon code :

    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
     
    Private Sub CommandButton1_Click()
     
    Dim MaVarible As String
    Dim NbrLigne As Integer
    Dim n As Integer
     
    MaVariable = "pablo_100"
    NbrLigne = ActiveSheet.UsedRange.Rows.Count
    Range("A1:A1000").Select
     
    Selection.Find(What:=MaVaribale, LookIn:=xlValues, LookAt:=xlPart, _
    SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate
     
        For n = 1 To NbrLigne
            Cells.FindNext(After:=ActiveCell).Activate
        Next n
    End Sub
    Je débute depuis peu sur VBA, si quelqu'un peu m'aider, merci d'avance.

  2. #2
    Membre expérimenté
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Par défaut
    Ca devrait le faire

    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 cherche_pablo()
     
    dim Nbligne as long
    dim maplage as range
    dim trouve as range
     
        Nbligne=range("A65536").end(xlup).row 'dernière ligne de la colonne A
        set maplage=range("A1","A"&Nbligne) 'Défini la plage de recherche
        with mapalge
              set trouve=.find("Pablo_100",maplage.cells(1),LookIn:=xlValues, SearchOrder:=xlByColumns) 'cherche Pablo_100 dans la plage de recherche
        end with
        If trouve not is nothing 'la recherche renvoi nothing si elle ne trouve pas
              msgbox("Votre recherche se trouve en ligne " &  trouve.row)
              'trouve est une cellule pour récupérer un n° de ligne ou de colonne on fait: trouve.row ou trouve.column
            else
              msgbox("Ce que vous cherchez n'existe pas")
        end if
     
    end sub

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Merci, mais le code est totalement différent de ce que j'ai écris. Mon code est il faut ?

    De plus, il y a une erreur à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If trouve not is nothing 'la recherche renvoi nothing si elle ne trouve pas
    Elle apparait en rouge sur ma macro, et le message d'erreur est : erreur de compilation erreur de synthaxe

    Cordialement

  4. #4
    Expert éminent 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
    Par défaut
    Je me mêle encore
    erreur de frappe de diude57
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not trouve is nothing

  5. #5
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    personnellement j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not trouve is nothing
    Pour ton code visiblement il ne fonctionne pas donc oui il est faux
    En plus il y a un select rien que pour ca il mérite d'être effacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("A1:A1000").Select
     
    Selection.Find(
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:A1000").Find(
    Ca prend moins de place simplifie la lecture évite certain bug et augmente les performances.
    Pareille pour les activate bien entendu.


    Le find next n'a, à mon avis, rien a faire ici. Tu effectues la recherche autant de fois que tu as de ligne (en cherchant la même chose et ce coup si tu recherche dans tous les cellules)

    Bon tout ca pour dire que ce n'est pas au point essaye de garder le code de diude il semble bien plus cohérent

    Edit : bonjour mercatog, je prend note du fait que je doit finir mon post avant de regarder les résultat de mon calcul

  6. #6
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Je me mêle encore
    erreur de frappe de diude57
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not trouve is nothing
    D'ailleur manque Then aprés nothing :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not trouve is nothing Then
    En tout cas merci pour votre aide je teste et je met RESOLU

  7. #7
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Désolé mais il y a encore une erreur à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set trouve = .Find("Pablo_100", maplage.Cells(1), LookIn:=xlValues, SearchOrder:=xlByColumns)
    Le message d'erreur est : objet requis.

  8. #8
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Ok à force de chercher, on trouve...........

    Voilà l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set trouve = maplage.Find("pablo_100", maplage.Cells(1), LookIn:=xlValues, SearchOrder:=xlByColumns)
    Fallait mettre maplage avant Find.

    Mais bon, il y a encore un problème puisque la macro s'arrête aprés avoir trouvé le premier pablo_100, alors qu'il y en a encore plusieurs à la suite, je pense que je me suis mal exprimé tout à l'heure.

    Que dois je faire pour qu'il continue à chercher aprés qu'il est trouvé le premier pablo_100.

    Moi je pensais justement à faire une boucle, mais là il y a un problème car il va retomber toujours sur le premier pablo_100 de la liste.

    Il faudrait boucler en partant de la dernière ligne où il a trouvé pablo_100.

    Si quelqu'un à une idée merci, car la je rameeeeee

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour une boucle de recherche, sélectionne Find et appuie sur la touche F1 !
    L'aide en ligne donne la meilleure méthode pour faire ça et tu n'auras plus d'erreur.
    Déclare ta plage as range et instancie-la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim LaPlage as range, c as range
         Set LaPlage = Range("A10:X100")
         'et ensuite le code de l'aide
         With LaPlage
              Set c = .find(etc.
              if not c is nothing THEN '!!!
    Tu sauras continuer tout seul ?
    Bon courage et bonne soirée

  10. #10
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Voilà, j'ai réussi à me débrouiller avec ce code :

    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
    Private Sub CommandButton2_Click()
     
    Dim Nbligne As Long
     
    Nbligne = Range("A65536").End(xlUp).Row
     
    With Worksheets(1).Range("A1, "A" & Nbligne)
        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
     
     
    End Sub
    Cependant je récupère une erreur à la fin. Tout les 2 on bien été remplacé par des 5, mais lorsqu'il arrive à le dernière ligne vide, j'ai ce retour d'erreur :
    Erreur d'exécution '91' :
    Variable objet ou variable de bloc With non définie. Un peu d'aide s'il vous plait j'y suis presque.

  11. #11
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour le fil exemple recherche sur feuil1 colonne a puis copy ligne si trouve dans feuil2 a la suite autrement message pas trouve a adapter a tes besoins

    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
    Option Explicit
    Sub cher()
     Dim c As Range, premier As String, nom As String
         nom = "pablo_100"
         With Sheets("feuil1").[a:a]
               Set c = .Find(nom, LookIn:=xlValues, lookat:=xlWhole)
               If Not c Is Nothing Then
                    premier = c.Address
                    Do
                         c.EntireRow.Copy Destination:=Sheets("feuil2").Range("A65536").End(xlUp)(2)
                         Set c = .FindNext(c)
                    Loop While Not c Is Nothing And c.Address <> premier
               End If
               If c Is Nothing Then MsgBox "pas trouve  " & nom
         End With
    End Sub

  12. #12
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Ok merci, ça marche très bien avec ce que je souhaite faire. Par contre pour bien comprendre et me perfectionner je souhaite poser quelques questions :

    Je ne comprend pas bien à quoi cela correspond, pourquoi initialiser cette variable ?
    Ensuite, qu'est ce que cette ligne traduit, et surtout le End(xlUp)(2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.EntireRow.Copy Destination:=Sheets("feuil2").Range("A65536").End(xlUp)(2)
    Merci d'avance.

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    premier = c.Address
    Sert à vérifier que ta recherche ne repart pas du début de ta plage. Evite une boucle de recherche sans fin et vérifiant en fin de boucle
    Loop While Not c Is Nothing And c.Address <> premier
    Sheets("feuil2").Range("A65536").End(xlUp)(2)
    Sheets("feuil2").Range("A65536").End(xlUp) donne la dernière ligne renseignée de la colonne A
    Sheets("feuil2").Range("A65536").End(xlUp)(2) donne la ligne suivant la dernière ligne renseignée
    Pour tester, tu écris ça sur la ligne du dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msgbox Sheets("feuil2").Range("A65536").End(xlUp)(2).address
    ou
    'tu affiches la fenêtre Exécution dans l'éditeur VB et tu ajoutes cette ligne
    Debug.print Sheets("feuil2").Range("A65536").End(xlUp)(2).address
    Bonne journée

Discussions similaires

  1. Rechercher une chaine de caractères dans le nom d'un fichier
    Par meuah dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/06/2008, 17h54
  2. Rechercher une chaine de caractère
    Par Thixomag dans le forum Flash
    Réponses: 3
    Dernier message: 13/05/2008, 21h10
  3. [Selenium] Rechercher une chaine de caractères dans un textarea
    Par hocinema dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 20/07/2007, 14h56
  4. rechercher une chaine de caractère dans un fichier
    Par 3FHFEB dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2006, 11h13
  5. Réponses: 9
    Dernier message: 07/09/2006, 13h47

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