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 partie de chaîne


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Points : 24
    Points
    24
    Par défaut Rechercher une partie de chaîne
    Bonjour à tous,

    Voila mon ptit souci.
    J'ai un userform qui me permet de rechercher un dossier via le N° de compte renseigné par l'utilisateur dans un textbox.
    Cependant, je souhaite ajouté un 2nd critère de recherche dans un 2nd textbox, mais ce second critère est une petite partie de chaine de caractère déjà enregistrée...je m'explique

    j'ai un userform1 où je saisi mes critères de recherche,
    j'ai un textbox1 où je saisi un n° de compte qui est dans une feuille1 à la colonne B,
    j'ai un textbox2 où je saisi un 1 nombre à 4 caractères (2019, 2041...). Ce nombre fait partie d'une chaine de caractère en colonne A de la feuille1.
    ex;
    col A, 2019 - St Lazare, 2020 - Orléans République, ... (lieu avec N°)
    col B, 151245, 152666, ... (N° de compte)

    Ma fonction recherche doit donc chercher en premier lieu dans la colonne B le N° de compte puis s'il correspond, il doit vérifier, dans la colonne A de la meme ligne, si le nombre correspond (2nd critère) dans la chaine de caractère.
    Enfin, une fois trouvé, il doit m'envoyer à cette ligne...

    Pour le moment j'ai ca et il me manque à vrai dire que la recherche dans la colonne A...:

    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
     
    Dim a As String
    Dim sh As Variant
     
    If TextBox1.Value = "" Then
    a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
    Else
    '''''''''''''''''''''''''''''''''''''''ca commence ici donc
    a = TextBox1.Value
    For Each sh In Workbooks("Suivi Dénonciations.xls").Worksheets
    Set rng = sh.Range("B1:B65536").Find(a, sh.[B1], xlValues, xlWhole, xlByRows, xlPrevious)
    If Not rng Is Nothing Then
    sh.Select
    Columns(2).Find(a).Select
    UserForm1.Hide
    MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
     
    Exit Sub
    End If
    Next
    Feuil1.Activate
    MsgBox "Le dossier n'existe pas", vbExclamation
    End If
    End Sub
    Merci par avance pour votre aide.

    Jonathan

  2. #2
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Août 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 117
    Points : 133
    Points
    133
    Par défaut
    bonjour,

    pour faire ce que tu veux ajoute une condition de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    dim b as integer
     
    b=textbox2
     
    'le debut de ton code jusqu'a la recherche
     
    if not rng is nothing then
     
       if Cint(left(Cells(rng.Row,1),4))=b then
    'ce que tu veux
    end if
    Cint pour convertir en Integer
    left ( "chaine de caractere" , "Nbr de caractere") retourne le nbr de caractere choisi à partir de ta chaine carataire en commençant pas la gauche

  3. #3
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Comme ta recherche concerne la colonne B, utilise Offset(0, -1) pour savoir ce qu'il y a dans la colonne A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set rng = sh.Range("B1:B65536").Find(a, sh.[B1], xlValues, xlWhole, xlByRows, xlPrevious)
    If Not rng Is Nothing Then
        if instr(sh.Offset(0, -1), Critere2) <> 0 then 
            MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
            UserForm1.Hide
          else
            MsgBox "le dossier n'existe pas
        endif
    Attention, si un second a existe, ce code ne permet pas de le trouver, il te faut une boucle de recherche
    Par contre, je ne comprends pas le paramètre xlPrevious dans "find(...)"

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    aie aie aie,

    J'ai beau retourner ton aide dans tous les sens, je n'arrive pas à l'insérer dans mon code. J'ai donc bien tenter cela mais sans succès;

    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
    Dim a As String
    Dim sh As Variant
    Dim b As Integer
    
    
    If TextBox2.Value = "" Or TextBox3.Value = "" Then
    a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
    Else
    a = TextBox2.Value
    b = TextBox3.Value
    
    For Each sh In Workbooks("Suivi Dénonciations.xls").Worksheets
    Set rng = sh.Range("B1:B65536").Find(a, sh.[B1], xlValues, xlWhole, xlByRows, xlPrevious)
    If Not rng Is Nothing Then
        If CInt(Left(Cells(rng.Row, 1), 4)) = b Then
        
            Feuil1.Visible = True
            Feuil2.Visible = False
            Feuil3.Visible = False
            Feuil4.Visible = False
            Feuil5.Visible = False
            Feuil6.Visible = False
            Feuil7.Visible = False
            sh.Visible = True
            sh.Select
            Columns(2).Find(a).Select
            UserForm26.Hide
            MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
        End If
        Exit Sub
    End If
    Next
    Feuil1.Activate
    MsgBox "Le dossier n'existe pas", vbExclamation
    End If
    il m'affiche une erreur sur la ligne ajoutée (erreur d'execution 13)
    Please, pouvez-vous me reexpliquer ?


  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Août 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 117
    Points : 133
    Points
    133
    Par défaut
    erreur d'execution 13 c'est incompatibilité de type je crois ?
    je l'ai essayer cela marche tres bien, j'ai pas ce genre d'erreur , donc je pense que c'est au niveau du type de donnée
    sinon je ne vois pas

    as tu essayé la solution d'ouskel'n'or ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Bon bah j'ai essayé vos solutions et j'en ai fait un mix...et ca marche ... pour le moment
    Je vais tester plusieurs cas pour voir comment ca "réagis" lol !
    mon code est le suivant :

    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
    
    Dim a As String
    Dim sh As Variant
    Dim b As String
    
    
    If TextBox2.Value = "" Or ComboBox1.Value = "" Then
    a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
    Else
    a = TextBox2.Value
    b = ComboBox1.Value
    
    For Each sh In Workbooks("Suivi Dénonciations.xls").Worksheets
    Set rng = sh.Range("B1:B65536").Find(a, sh.[B1], xlValues, xlWhole, xlByRows, xlPrevious)
        If Not rng Is Nothing Then
            If rng.Offset(0, -1) = b Then
            Feuil1.Visible = True
            Feuil2.Visible = False
            Feuil3.Visible = False
            Feuil4.Visible = False
            Feuil5.Visible = False
            Feuil6.Visible = False
            Feuil7.Visible = False
            sh.Visible = True
            sh.Select
            Columns(2).Find(a).Select
            UserForm26.Hide
            MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
        End If
        Exit Sub
    End If
    Next
    Feuil1.Activate
    MsgBox "Le dossier n'existe pas", vbExclamation
    End If
    au passage j'ai abandonné l'idée pour le moment de chercher que les 4 premiers caractères de la chaine contenu dans la colonne A...
    si cependant vous avez une idée de la manière de l'intégrer sans TOUT casser ?!

    Merci encore une fois pour votre aide

  7. #7
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Comme je ne sais pas quels 4 caractères doivent être contenus dans quelle cellule, tu peux tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If instr(rng.Offset(0, -1) ,b) = 1 Then
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If instr(Ucase(rng.Offset(0, -1)) ,Ucase(left(b, 4))) = 1 Then
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If instr(Ucase(left(rng.Offset(0, -1),4)) , Ucase(b)) = 1 Then
    ou bien... regarde à left et à instr dans l'aide en ligne
    Bonne soirée

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Bon bah en fait, ca marche pas exactement comme je veux...

    J'ai fait un test avec 2 dossiers ayant 2 n° de compte identique, mais 2 codes guichet différents.
    col A col B
    - 2021 et 142 222
    - 2022 et 142 222

    Le programme ne se lance pas quand j'inscrit le code guichet du premier, et quand je cherche avec le second code guichet, il me selectionne la ligne du premier code...

    Pour répondre à votre question précédente, ma fonction recherche doit:
    1/ chercher sur la colonne B si le N° de compte est le meme que celui inscrit sur la textbox1 et si oui,
    2/ regarder si sur la colonne A, le code guichet est le meme que celui inscrit dans la textbox2 (sachant que dans la col A, le code guichet figure dans les 4 premiers caractères).


    Je crois que j'ai un souci de boucle car il doit y avoir un problème au moment où il trouve le meme n° de compte et au moment où il lance le 2nd IF pour vérifier le code guichet... je crois

    Pleaseeeeee

  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
    Points : 15 543
    Points
    15 543
    Par défaut
    Si b ne correspond pas tu dois poursuivres ta recherche, ce que ne fait pas ton code.
    Teste ça sans rien changer qu'il te plairait de changer
    Comme tu utilises xlWhole dans ta recherche, si ça ne fonctionne pas c'est que ta colonne B contient autre chose que le seul N° de compte.

    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
    Sub TaSub()
    Dim a As String
    Dim sh As Worksheet
    Dim b As String
    Dim Adres As String
    Dim rng As Range
     
    If TextBox2 = "" Or ComboBox1 = "" Then
        a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
      Else
        a = TextBox2
        b = ComboBox1
     
        For Each sh In Workbooks("Suivi Dénonciations.xls").Worksheets
            With sh.Range("B1:B65536")
                Set rng = .Find(a, sh.[B1], lookin:=xlValues, LookAt:=xlWhole)
                If Not rng Is Nothing Then
                    Adres = rng.Address
                    Do
                        If InStr(rng.Offset(0, -1), b) = 1 Then
                            Feuil1.Visible = True
                            Feuil2.Visible = False
                            Feuil3.Visible = False
                            Feuil4.Visible = False
                            Feuil5.Visible = False
                            Feuil6.Visible = False
                            Feuil7.Visible = False
                            sh.Visible = True
                            sh.Select
                            Columns(2).Find(a).Select
                            UserForm26.Hide
                            MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
                            Exit Do
                        End If
                        Set rng = .FindNext(rng)
                    Loop While Not rng Is Nothing And rng.Address <> Adres
                  else
                    Feuil1.Activate
                    MsgBox "Le dossier n'existe pas", vbExclamation
                End If
            End With
        Next
    End If
    End sub
    Si tu as une erreur, tu indiques laquelle et tu dis sur quelle ligne.
    A+

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Bon ben j'ai effectué 2 tests;

    1er test
    2 dossiers ayant le meme n° de compte (colonne B, a) mais pas le meme code guichet (colonne A, b) ET SUR LA MEME PAGE
    --> A la recherche du dossier se trouvant en seconde position, le code m'affiche le 1er dossier (=1er pb, peut-etre que "Columns(2).Find(a).Select" n'est pas bon..)

    2nd test
    2 dossiers ayant le meme n° de compte mais pas le meme code guichet (colonne A, b) ET SUR DES PAGES DIFFERENTES
    --> A la recherche du premier (en 1ere page, il le trouve, me l'affiche mais il reflechie indeffiniment (boucle sans fin?)
    --> A la recherche du second qui est en page 3, j'ai le ptit sablier indéfiniment...et ne trouve rien donc...


    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
    Private Sub CommandButton2_Click()
    
    Dim a As String
    Dim sh As Worksheet
    Dim b As String
    Dim Adres As String
    Dim rng As Range
    
    If TextBox2.Value = "" Or ComboBox1.Value = "" Then
    a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
    Else
    a = TextBox2.Value
    b = ComboBox1.Value
    
    
     
    If TextBox2.Value = "" Or ComboBox1.Value = "" Then
        a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
      Else
        a = TextBox2.Value
        b = ComboBox1.Value
        
        For Each sh In Workbooks("Suivi Dénonciations.xls").Worksheets
            With sh.Range("B1:B65536")
                Set rng = .Find(a, sh.[B1], LookIn:=xlValues, LookAt:=xlWhole)
                If Not rng Is Nothing Then
                    Adres = rng.Address
                    Do
                        If InStr(rng.Offset(0, -1), b) = 1 Then
                            Feuil1.Visible = True
                            Feuil2.Visible = False
                            Feuil3.Visible = False
                            Feuil4.Visible = False
                            Feuil5.Visible = False
                            Feuil6.Visible = False
                            Feuil7.Visible = False
                            sh.Visible = True
                            sh.Select
                          
                            Columns(2).Find(a).Select
                            
                            UserForm26.Hide
                            MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
                            Exit Do
                        End If
                        Set rng = .FindNext(rng)
                    Loop While Not rng Is Nothing And rng.Address <> firstAddress
                  Else
                    'Feuil1.Activate
                    'MsgBox "Le dossier n'existe pas", vbExclamation
                End If
            End With
        Next
    'Feuil1.Activate
    'MsgBox "Le dossier n'existe pas", vbExclamation
    End If
    End If
    End Sub
    En rouge c'est la partie qui me semble etre incorrecte et qu'il me met la plupart du temps en jaune lui-meme...


    Je me dit en gros, en voyant comment évolue le topic, que ce que je cherche à faire est une focntion recherche à 2 critères
    J'ai créé un topic ayant ce nom, donc, si vous avez la patience de continuer à m'aider je vous laisse le choix de répondre sur n'importe lequel des topic... toute aide sera la bienvenue

    Merci par avance

  11. #11
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Autant pour moi.
    Remplace déjà par ça aux bons endroits...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = TextBox2
    b = ComboBox1
    et ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    Loop While Not rng Is Nothing And rng.Address <> Adres
    et refais le text sans rien changer d'autre dans mon code (que je corrige dans le post précédent.
    A+

    ( je n'ai pas la possibilité de tester, sinon ces erreurs sont vraiment idiotes )

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    On (tu) y est arrivé !!

    J'ai pris en compte les éléments que vous m'aviez donné au début de ce topic (prendre seulement les 4 caractères de la chaine...donc changement de la combobox par textbox3) et voila ce que ca donne:

    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
     
    Private Sub CommandButton2_Click()
     
    Dim a As String
    Dim sh As Worksheet
    Dim b As String
    Dim Adres As String
    Dim rng As Range
     
    If TextBox2.Value = "" Or TextBox3.Value = "" Then
        a = MsgBox("Veuillez renseigner le champs avant de lancer la recherche", vbInformation)
      Else
        a = TextBox2
     
        b = TextBox3
     
        For Each sh In Workbooks("Suivi Dénonciations.xls").Worksheets
            With sh.Range("B1:B65536")
                Set rng = .Find(a, sh.[B1], LookIn:=xlValues, LookAt:=xlWhole)
                If Not rng Is Nothing Then
                    Adres = rng.Address
                    Do
                        If InStr(UCase(rng.Offset(0, -1)), UCase(Left(b, 4))) = 1 Then
                            Feuil1.Visible = True
                            Feuil2.Visible = False
                            Feuil3.Visible = False
                            Feuil4.Visible = False
                            Feuil5.Visible = False
                            Feuil6.Visible = False
                            Feuil7.Visible = False
                            sh.Visible = True
                            sh.Select
                            Columns(2).Find(a).Select
                            UserForm26.Hide
                            MsgBox "le dossier existe dans la liste " & sh.Name, vbInformation
                            Exit Do
                        End If
                        Set rng = .FindNext(rng)
                    Loop While Not rng Is Nothing And rng.Address <> Adres
                  Else
                    End If
                 'Feuil1.Activate
                'MsgBox "Le dossier n'existe pas", vbExclamation
            End With
        Next
    End If
    End Sub
    Je vous remerci beaucoup de votre aide et de votre patience.

    Jonathan

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

Discussions similaires

  1. [AC-2010] Liste déroulante modifiable, recherche une partie d'un mot
    Par e2r34 dans le forum IHM
    Réponses: 16
    Dernier message: 03/12/2023, 23h12
  2. Rechercher une partie de cellule dans une autre feuille
    Par gallus dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/10/2013, 19h56
  3. Rechercher une partie du contenu d'une Cellule
    Par kuma_buzz dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/06/2008, 11h36
  4. Remplacement d'une partie de chaîne
    Par perdeak dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/02/2008, 11h39
  5. [Tableaux] Rechercher une partie de chaine
    Par kirbs dans le forum Langage
    Réponses: 2
    Dernier message: 08/12/2005, 21h44

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