Problème fonction FindNext VBA Word vers Excel
Bonjour,
J'ai une macro Word dont le but est d'ouvrir un classeur Excel qui est une liste de Noms, Prénoms et E-mails et de récupérer les adresses mail en filtrant par rapport au Nom de la personne. Or certaines personnes ont le même Nom de famille donc dans ce cas j'aimerais faire une boucle jusqu'à trouver le bon prénom.
J'utilise pour cela la fonction FindNext mais elle ne va jamais au-delà de la première occurrence trouvée. Après recherche sur ce forum j'ai également essayé la fonction Find avec le paramètre "After" mais ça ne change rien... donc peut-être que j'ai fait une erreur dans mon code ?
Merci pour votre aide !
Sub ATCO_Find(FindName As String)
'Dim Target As Range
Dim Ligne_Target As Integer
Dim Find_F_Name As String
Dim AppXL As Object, Target As Object
' on créé le nouvel Objet Excel
Set AppXL = CreateObject("Excel.Application")
'On cherche la longueur du tableau qui se trouve sur la feuille N°1
DernLigneXL = AppXL.Sheets(1).Cells.Find("F_I_N").Row
'On cherche la colonne du tableau où se trouvent les adresses mails
ColMailXL = AppXL.Sheets(1).Cells.Find("Diffusion mail").Column
'On cherche la colonne du tableau où se trouvent les noms
ColNom = AppXL.Sheets(1).Cells.Find("Nom").Column
Find_F_Name = ""
'Il faut gérer les cas des mêmes noms
If Trim(FindName) <> "" Then
If Trim(FindName) = "TOTO F." Then
FindName = "TOTO"
Find_F_Name = "Fréderic"
End If
If Trim(FindName) = "TOTO A." Then
FindName = "TOTO"
Find_F_Name = "Armelle"
End If
'On active le classeur qui contient tous les noms et les adresses mails
AppXL.Workbooks(fic_controleur).Activate
'On sélectionne les colonnes qui contiennent les Noms et prénoms
Set PlageCell = AppXL.Sheets(1).Range(AppXL.Cells(5, ColNom), AppXL.Cells(DernLigneXL - 2, ColNom + 1))
With PlageCell
Set Target = .Find(FindName)
Ligne_Target = Target.Row
Do
'Si ce n'est pas un cas de doublon ou si on est tombé sur la bonne case on prend l'adresse mail
If Find_F_Name = "" Or AppXL.Cells(Ligne_Target, ColNom + 1).Value = Find_F_Name Then
Atco_Mail = AppXL.Cells(Ligne_Target, ColMailXL).Value
'Sinon on essaye les autres recherches jusqu'à ce qu'on trouve le bon prénom
Else
Target = .FindNext(Target) ' ou bien Target = .Find(Target, After:=Target)
Ligne_Target = Target.Row
End If
Loop While AppXL.Cells(Ligne_Target, ColNom + 1).Value <> Find_F_Name And Find_F_Name <> ""
End With
End If
End Sub
Bonjour
Teste cette modification sur la fin de la macro
With PlageCell
Set Target = .Find(FindName)
Ligne_Target = Target.Row
Do
'Si ce n'est pas un cas de doublon ou si on est tombé sur la bonne case on prend l'adresse mail
If Find_F_Name = "" Or AppXL.Cells(Target.Row, ColNom + 1).Value = Find_F_Name Then
Atco_Mail = AppXL.Cells(Target.Row, ColMailXL).Value
Exit Do ' ou Exit Sub
End If
Target = .FindNext(Target) ' ou bien Target = .Find(Target, After:=Target)
Loop While Ligne_Target <> Target.Row
End With
End If
End Sub
Merci pour ta réponse.
Malheureusement ça ne change rien.
J'ai essayé de mettre la procédure directement dans le classeur Excel mais ça ne fonctionne pas non plus. J'ai créé un extract de mon tableau avec la procédure en PJ si ça peut aider à trouver l'erreur.
Bonjour,
Ah il fallait re-déclarer la variable Target avec un Set, c'est bon à savoir ! (même si je ne comprends pas vraiment pourquoi vu qu'on l'a déclarée au début ?)
Merci bien en tout cas ça marche !
Bonjour
On ne re-déclare pas la variable
Target une variable objet (Range) et pour lui donner une valeur on utilise Set
Comme dans ce code
Set Target = .Find(FindName)