Recherche de valeur dans différentes feuilles
Bonjour,
J'ai écris un code qui doit me permettre de rechercher des valeurs de la feuille "bilan" sur la feuille 2.
Ce code doit repérer :
- si le numéro a déjà été traité, auquel cas la boucle s'arrête et passé au n° suivant
- si le numéro est present sur la feuille 2 : si non, on l'indique dans une msgbox, si oui, on compte combien de fois il est present, afin de faire deux actions différentes si le n° est present une seule fois sur la feuille 2 ou s'il est en doublon.
Cependant, mon code me renvoie des résultats fantaisistes, dans une logique que je peine à comprendre. Je cherche désespérément mon erreur depuis plusieurs jours mais là je sèche....
Merci à celui qui pourra m'aider !!
Zarathoustra
Sub recupinfos()
'déclaration des variables
Dim numdeposte, adresse As String
Dim nbcellsfeuil1, nbcellsfeuil2, ligneprec, lignesuiv, R, nbdoublons, nbdoublons2 As Integer
Dim numrecherche As Object
'on obtient le numéro de la ligne du dernier numéro de licencié pour chaque feuille
nbcellsfeuil1 = Sheets(1).Range("C" & Rows.Count).End(xlUp).Row
nbcellsfeuil2 = Sheets(2).Range("C" & Rows.Count).End(xlDown).Row
'c'est une boucle qui va passer un après l'autre les n° de licenciés de la colonne C
Sheets(1).Activate
For Each R In Sheets(1).Range("C2:C" & nbcellsfeuil1)
'on enregistre le n° de licencié
numdeposte = R.Value
'on enregistre l'adresse du n° de licencié
adresse = R.Address
'on enregistre la ligne précédente celle du n° de licencié étudié
ligneprec = R.Row - 1
'on enregistre la ligne suivante celle du n° de licencié étudié
lignesuiv = R.Row + 1
'on cherche le nombre de fois où apparaît le n° de licencié dans les cellules précédentes
With Worksheets(1)
nbdoublons = Application.WorksheetFunction.CountIf(Range("C1", "C" & ligneprec), numdeposte)
End With
's'il n'apparaît pas avant, alors on recherche les infos directement
If nbdoublons = 0 Then
'With Worksheets("feuil2")
'on définit la plage de la cellule (numrecherche) en fonction du n° de licencié recherché (numdeposte)
Set numrecherche = Sheets(2).Range("C2:C" & nbcellsfeuil2).Cells.Find(what:=numdeposte, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext)
'End With
'si on ne trouve pas le n° de licencié sur la feuille 2, on écrit not found
If numrecherche Is Nothing Then
MsgBox "not found"
Else
's'il y a des résultats, on vérifie le nombre de fois où apparaît le n° de licencié sur la feuille 2
With Worksheets("feuil2")
nbdoublons2 = Application.WorksheetFunction.CountIf(Range("C2:C" & nbcellsfeuil2), numdeposte)
End With
's'il apparaît plusieurs fois, on le note
If nbdoublons2 > 1 Then
MsgBox "il y a des doublons dans la feuil2"
Else
'sinon, on marque que le n° a été trouvé
MsgBox "trouvé " & numdeposte
End If
End If
'sinon on écrit que le num de licencié a déjà été trouvé
Else
MsgBox "on a retrouvé dans les cellules supérieures le " & numdeposte
End If
Next R
End Sub
Bonsoir Zarathoustra, bonsoir le forum,
Comme tu es resté très énigmatique sur les actions à réaliser (tout autant que ton code d'ailleurs) je te propose le code commenté, à finaliser, ci-dessous :
Sub Macro1()
Dim B As Worksheet 'déclare la variable B (onglet Bilan)
Dim F As Worksheet 'déclare la variable F (onglet Feuil2)
Dim TB As Variant 'déclare la variable TB (Tableau Bilan)
Dim I As Integer 'déclare la variable I (Incrément)
Dim NB As Integer 'déclare la variable NB (NomBre)
Set B = Sheets("Bilan") 'définit l'onglet B
Set F = Sheets("feuil2") 'définit l'onglet T
'définit le tableau Bilan TB (données éditées de la colonne C de l'onglet B
TB = B.Range("C1:C" & B.Range("C" & Application.Rows.Count).End(xlUp).Row)
For I = 2 To UBound(TB, 1) 'boucle sur toutes les lignes du tableau TB (en partant de la seconde)
NB = 0 'réinitialise la variable NB
'la il faudrait mettre la condition si le numéro a déjà été traité mais comme pour moi ça ne signifie rien je n'ai pas codé
'si TB(I,1) est égale à "En attente" passe au numéro suivant via l'étiquette "suite"
If TB(I, 1) = "En attente" Then GoTo suite
'définit le nombre NB de fois qu'apparaît le numéro de licencié dans la colonne C de l'onglet F
NB = Application.WorksheetFunction.CountIf(F.Columns(3), TB(I, 1))
Select Case NB 'agit en fonction du nombre NB
Case 0 'cas 0
MsgBox "Le numéro de licencié " & Chr(34) & TB(I, 1) & Chr(34) & " n'est pas présent dans l'onglet " & Chr(34) & "Feuil2" & Chr(34) & " !"
Case 1 'cas 1
'code pour action si présent une unique fois
Case Else 'tous les autres cas
'code pour action si présent plusieurs fois
End Select 'fin de l'action en fonction du nombre NB
suite: 'étiquette
Next I 'prochaine ligne de la boucle
End SubBonsoir TauThème,
Merci pour ta réponse dont je viens prendre connaissance.
Mon problème s'est réglé presque facilement ce matin, après une bonne nuit de sommeil : la déclaration de mes variables était un vrai bazar, je n'avais pas saisi comment bien déclarer les variables (je croyais qu'un "Dim numdeposte, adresse as string" donnait le caractère string à numdeposte et à adresse, ce qui n'était pas le cas.
Merci et bonne soirée !