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 :

Find avec paramètre string variable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut Find avec paramètre string variable
    Bonjour,

    Je débute en VBA et je vous soumets donc mon problème en espérant que vous m'aidiez. Merci.
    J'utilise deux feuilles excel :
    Dans une première feuille excel, je parcours la première colonne qui contient des noms. Pour chaque élément de cette liste, je recherche s'il est contenu dans la première colonne de ma seconde feuille.
    Si la seconde feuille contient dans sa première colonne le nom recherché issu de la première feuille, je met à jour des données sur cette ligne de la seconde feuille
    La fontion find fonctionne correctement avec une string statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim strCodeChaineARechercher As String
            strCodeChaineARechercher = [B]"MaChaine"[/B]        Set rColCode = wbClasseur1.Sheets(strFeuille1).Range("A1").EntireColumn
            Set rCodeChaine = rColCode.Find(strCodeChaineARechercher, lookat:=xlWhole)
    mais dès lors que j'essai d'utiliser une variable string passée en paramètre ça ne fonctionne plus. Or je ne peux pas fixer la valeur de la string passé en paramètre puisque j'itère sur une liste de ma première feuille (susceptible de varier)
    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
     For lChaine = ws1.Range("A65536").End(xlUp).Row To 2 Step -1
            
            'Vérifie Chaine le Chaine existe dans Chaine_Nat et Chaine oui en récupère les dates de création et de Apres
            strCode2 = ""
            dAvant2 = Empty
            dApres2 = Empty
            strAvant2 = ""
            strApres2 = ""
            dApres1 = Empty
            
            Call getChaine(ws2, ws1.Cells(lChaine, 1), _
                        strCode2, strAvant2, dAvant2, strApres2, dApres2)
    
    Private Sub getChaine(wsFeuille As Worksheet, strCodeChaineARechercher As String, _
                        strCodeChaineResultatRecherche As String, strAvant As String, dAvant As Date, strApres As String, dApres As Date)
        
        
        'Test
        Dim rColCode As Excel.Range
        Dim rCodeChaine As Excel.Range
        Set rColCode = wsFeuille.Range("A1").EntireColumn
        Set rCodeChaine =rColCode.Find(strCodeChaineARechercher)
    Je ne vois pas si le problème est un problème de passage de paramètre par valeur ou référence, ou de possilibité de modification de la variable string ou d'utilisation de cellule d'une autre feuille?
    Merci d'avance pour votre aide

    Voici un plus grand extrait du 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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    Sub maj()
        'mise à jour
        Dim wbClasseur1 As Workbook
        Dim ws2 As Worksheet, ws1 As Worksheet
        Dim strFeuille2 As String, strFeuille1 As String
     
        Set wbClasseur1 = Nothing
        Set ws2 = Nothing
        Set ws1 = Nothing
     
        Set wbClasseur1 = Workbooks("MonClasseur.xls")
     
        If (wbClasseur1 Is Nothing) = False Then
     
            strFeuille2 = "Feuil2"
            Set ws2 = wbClasseur1.Sheets(strFeuille2) 
     
            strFeuille1 = "Feuil1"
            Set ws1 = wbClasseur1.Sheets(strFeuille1)
     
            ''Test debut ok fonctionne bien du fait que strCodeChaineARechercher = "MaChaine"
            Dim rColCode As Excel.Range
            Dim rCodeChaine As Excel.Range
            Dim strCodeChaineARechercher As String
            strCodeChaineARechercher = "MaChaine"
            Set rColCode = wbClasseur1.Sheets(strFeuille1).Range("A1").EntireColumn
            Set rCodeChaine = rColCode.Find(strCodeChaineARechercher, lookat:=xlWhole)
            ''Test fin
     
     
            If (Not (ws2Ref Is Nothing Or ws1ref Is Nothing)) Then
                Call majChainedepuisFeuil1(ws2Ref, ws1ref)
     
     
     
     
    Sub majChainedepuisFeuil1(ws2 As Worksheet, ws1 As Worksheet)
     
        Dim lChaine As Long
        Dim dAujourdhui As Date
        Dim strCode2 As String
        Dim dAvant2 As Date
        Dim strAvant2 As String
        Dim dApres2 As Date
        Dim strApres2 As String
        Dim dApres1 As Date
        Dim nNb1trt As Long
        Dim nNb1ouvert As Long
        Dim nNb1ferme As Long
     
    Proc10:
        nNb1trt = 0
        nNb1ouvert = 0
        nNb1ferme = 0
     
     
    Proc20:
     
        dAujourdhui = Date
     
        For lChaine = ws1.Range("A65536").End(xlUp).Row To 2 Step -1
     
            'Vérifie Chaine le Chaine existe dans Chaine_Nat et Chaine oui en récupère les dates de création et de Apres
            strCode2 = ""
            dAvant2 = Empty
            dApres2 = Empty
            strAvant2 = ""
            strApres2 = ""
            dApres1 = Empty
     
            Call getChaine(ws2, ws1.Cells(lChaine, 1), _
                        strCode2, strAvant2, dAvant2, strApres2, dApres2)
     
    Private Sub getChaine(wsFeuille As Worksheet, strCodeChaineARechercher As String, _
                        strCodeChaineResultatRecherche As String, strAvant As String, dAvant As Date, strApres As String, dApres As Date)
     
     
        'Test debut
        Dim rColCode As Excel.Range
        Dim rCodeChaine As Excel.Range
        'Dim strCodeChaineARechercher As String
        'strCodeChaineARechercher = "MaChaine" 'TODO ok
        Set rColCode = wsFeuille.Range("A1").EntireColumn
        Set rCodeChaine =rColCode.Find(strCodeChaineARechercher)
     
        If (rCodeChaine Is Nothing) Then
            strCodeChaineResultatRecherche = ""
            dAvant = Empty
            strAvant = ""
            dApres = Empty
            strApres = ""
        Else
            strCodeChaineResultatRecherche = rCodeChaine.Offset(0, 0).Value
            strAvant = rCodeChaine.Offset(0, 21).Value
            dAvant = rCodeChaine.Offset(0, 21).Value
            strApres = rCodeChaine.Offset(0, 24).Value
            dApres = rCodeChaine.Offset(0, 24).Value
        End If
     
        If rCodeChaine Is Nothing Then

  2. #2
    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,

    mais dès lors que j'essai d'utiliser une variable string passée en paramètre
    getChaine(wsFeuille As Worksheet, strCodeChaineARechercher As String
    Oui ? on suppose que ça ne fonctionne pas ... Poste la totalité de ton code ou, mieux, mets un classeur exemple - sans données confidentielles en pièce jointe.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    Merci

    Pour votre intérêt pour mon problème voici le code
    Fichiers attachés Fichiers attachés

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    La fonction find ne trouve pas la correspondance dans la deuxième feuille. je le vois à la valeur de rCodeInfo qui vaut Nothing quand je recherche la chaine "TOTO-TITI" au moyen d'une variable strCodeInfoARechercher qui est un paramètre de la procédure getInfo qui contient l'appel à la fonction find suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub getInfo(wsFeuille As Worksheet, strCodeInfoARechercher As String, _
                        strCodeInfoResultatRecherche As String, strDebut As String, dDebut As Date, strFin As String, dFin As Date)
    Set rColCode = wsFeuille.Range("A2").EntireColumn
    Set rCodeInfo = rColCode.Find(strCodeInfoARechercher, LookAt:=xlWhole)
    Par contre quand j'utilise une variable string que je fixe statiquement égale à "TOTO-TITI" au moyen des guillemets dans le code de la procédure getInfo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim strCodeInfoARechercher As String
    strCodeInfoARechercher = "TOTO-TITI"
    Alors dans ce cas uniquement rCodeInfo n'est pas égale à Nothing mais vaut bien "TOTO-TITI". Le code a donc dans ce second cas uniquement repéré la valeur correspondante dans la deuxième feuille.
    Mon problème est que je ne peux pas fixer statiquement au moyen de guillemet cette variable, parce que je dois la lire depuis la première feuille/première colonne par l'instruction suivante :
    wsInfoPremiere.Cells(lInfo, 1)
    que je passe en paramètre de la procédure getInfo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call getInfo(wsInfoDeuxieme, wsInfoPremiere.Cells(lInfo, 1), _
                        strCodeInfoDeuxieme, strDebutInfoDeuxieme, dDebutInfoDeuxieme, strFinInfoDeuxieme, dFinInfoDeuxieme)
    Dans les deux cas au moment de l'appel à la fonction find, la variable vaut bien "TOTO-TITI" mais selon le mode d'affectation de la variable strCodeInfoARechercher , la méthode find trouve ou pas le résultat.


    Pour le traitement postérieur à la méthode find je n'ai pas de soucis le seul soucis est que la méthode find trouve la cellule correspondante dans la deuxième feuille/première colonne au moyen d'une lecture de la chaine dans la première feuille/première colonne
    Ce qui oriente les traitements suivants par le test : If rCodeInfo Is Nothing

  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
    J'ai l'impression que ça vient de ton classeur. J'ai copier la feuille "deuxieme_fiche" dans un classeur vierge et j'ai exécuté avec succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        Set rColCode = Range("A1").EntireColumn
        Set rCodeInfo = rColCode.Find(strCodeInfoARechercher, LookAt:=xlWhole, SearchFormat:=False)
        If Not rCodeInfo Is Nothing Then MsgBox rCodeInfo.Address
    End Sub

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    Merci beaucoup pour votre travail le problème vient effectivement des données du classeur !

    On m'a indiqué que les deux chaines de caractères contiennent des traits d'union différents (et aucun n'est un underscore) mais peut-être que l'un est un trait d'union insécable ? (j'en connais pas la provenance, je ne sais pas quel est ce caractère)
    J'ai effectivement vu une différence en les mettant côte à côte et même comme ça je pensais que c'était juste une différence de taille de police.
    Mais le code fonctionne si le trait d'union est identique dans les deux chaînes.
    Il va falloir que j'élimine toutes ces sortes de traits d'unions (Je me demande un peu comment) et les remplacer par un trait d'union standard dans tous les cas pour pouvoir comparer les deux feuilles.
    Splitter une chaine ça c'est ok mais comment désigner tous les caractères spéciaux comme caractère de séparation (de splittage)) et ainsi pouvoir les éliminer ?

    Bonne soirée

Discussions similaires

  1. Utilisation d'un cells.find avec texte et variable
    Par remi2305 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/05/2015, 10h55
  2. Appel d'un Service REST avec paramètre String
    Par sebac dans le forum Services Web
    Réponses: 3
    Dernier message: 01/11/2014, 23h18
  3. [Bash] Problème avec paramètres dans variables
    Par bisol dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 09/03/2013, 17h39
  4. invoque une methode avec paramétre string
    Par Invité dans le forum Services Web
    Réponses: 0
    Dernier message: 21/11/2009, 01h04
  5. Réponses: 7
    Dernier message: 29/10/2007, 14h03

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