Find avec en paramètre chaine variable lue depuis autre feui

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

Dim strCodeChaineARechercher As String

strCodeChaineARechercher = "MaChaine"

Set rColCode = wbClasseur1.Sheets(strFeuille1).Range("A1").EntireColumn

Set rCodeChaine = rColCode.Find(strCodeChaineARechercher, lookat:=xlWhole)

mais dès lors que j'essaie 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)

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 :

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

Bonjour,

peux-tu mettre ton classeur qui ne fonctionne pas ? avec le code et les données .

Merci,

pour votre inérêt pour mon problème

Jejoins le fichier contenant le code

17monfichier.zip (7.00 Ko)

bonsoir,

ta procédure fonctionne bien, mais tes données ne sont pas identiques dans les 2 feuilles (dans l'exemple que tu as donné en tout cas !)


NB. la recherche fonctionne bien, mais il manque les instructions pour exploiter les données après le getinfo pour les mettre dans la feuille.

En fait 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:

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

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

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

rebonsoir,

comme je te l'ai dit, le toto-titi de la feuille1 n'est pas le même que le toto-titi de la feuille2 et donc la fonction find renvoie "nothing"

(en fait le "-" est différent), essaie avec toto seul des 2 côtés tu verras que cela fonctionne (en tout chez moi avec ton fichier).

Merci beaucoup Bravo !!!!

Vous avez fait comment pour le voir ? une conversion dans un autre format ?

Les deux caractères sont des traits d'union (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.

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

Rechercher des sujets similaires à "find parametre chaine variable lue feui"