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
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