Salut.
Avant d’entamer le sujet, je remarque que les propriétés du fichier que tu as mis en ligne contiennent des informations nominatives. Libre à toi de faire ainsi si c’est délibéré, mais je préfère t’en informer au cas où c’est par inadvertance.
Ce que tu décris va nécessiter d’utiliser les macros et ça va te prendre un peu de temps. Je vois que tu dispenses des formations en informatique mais je ne sais pas à quel point tu es familier avec la programmation.
La 1ère chose à faire, c’est de “sauvegarder sous” et de choisir un format “Excel macro-enabled workbook”. Excel te proposera de sauvegarder ton fichier avec une extension xlsm.
Ton besoin contient 2 choses qui se découpent en plusieurs tâches :
- aller chercher les données pour afficher un profil client existant
- enregistrer un nouveau client (ou mettre à jour un client existant?)
On va commencer en s’intéressant exclusivement à l’appel d’un profil client existant (parce que la 2nde partie sera plus longue).
Comptes-tu taper le nom/prénom entier et exact dans ton champs texte ? Si oui, ça simplifie la programmation. Mais dans la pratique, au jour le jour, ça va être chiant à gérer. Ceci dit, ça peut être un point de départ et que tu amélioreras plus tard. Et puis je vois que ça correspond à la macro présente dans ton fichier.
Il faudrait que tu ajoutes un bouton à coté de ton champs texte et comme ça il te suffira de cliquer sur ce bouton pour lancer la macro qui va chercher le client. Je pense que tu es familier avec les boutons donc je ne détaille pas. Tu diras si tu as besoin de précisions.
Pour ce qui est de coder des macros, je vois que ce que tu as créé est un peu maladroit parce que tu as une boucle “For” qui va passer en revue chaque ligne. C’est le genre de solution qui marche mais qui :
- galère quand il y a beaucoup de lignes à traiter
- n’est pas conforme à l’esprit des macros en VBA
L’idée est d’utiliser au mieux les fonctionnalités d’Excel. Donc je te suggère de faire :
- Enregistrer macro (le bouton rouge dans la barre de statut en bas à gauche)
- aller dans la feuille “listing” faire une recherche (sélectionner la colonne, CTRL+F, etc.)
- Arreter l’enregistrement de macro
Le résultat va ressembler à ceci :
Sub Macro1()
'
' Macro1 Macro
'
'
Sheets("listing").Select
Columns("B:B").Select
Selection.Find(What:="John Smith", After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate
Sheets("Accueil").Select
End Sub
L’élément important est bien entendu le “Find”. Et voilà comment on a pu utiliser une fonctionnalité intégrée (donc optimisée) d’Excel plutôt que de faire une boucle For.
Ensuite, il y a le truc important qui change la vie des programmeurs en VBA :
il n’est presque jamais nécessaire de faire “select” ou “activate”.
En l’occurrence, on s’en fout d’activer une cellule. Ce qu’on veut, c’est trouver sa ligne. Du coup, au lieu de faire :
Selection.Find(blabla).Activate
on va faire :
ma_ligne = Selection.Find(blabla).Row
On va encore se débarrasser des sélections de feuilles Excel et on va obtenir un truc épuré du style :
ma_ligne = Sheets("listing").Columns("B:B").Find(blabla).Row
Et voilà comment on s’est épargné le changement de feuille et la boucle For. Il faut néanmoins se prémunir contre un nom pas trouvé. Donc on met une capture d’erreur comme ci-après :
Sub Macro1()
On Error GoTo ErrorHandler
nom_recherche = Sheets("Accueil").Range("F11").Value
ma_ligne = Sheets("listing").Columns("B:B").Find(What:=nom_recherche, After:=[B1], LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Row
ErrorHandler:
If Err Then
MsgBox "Client non trouvé"
End If
End Sub
Note : Tu remarqueras également que j’ai mis
After:=[B1]
C’est une notation valide qui remplace Range(“B1”). C’est juste pour ne pas laisser le “ActiveCell” qui aurait posé problème. Donc puisqu’on cherche une info dans la colonne B, on va chercher “after B1”.
Je te laisse là pour le moment. Ca devrait t’inspirer pour la suite.
Tu peux soit continuer à développer le reste (prendre les infos de la feuille listing et les afficher dans l’accueil) dans la même fonction… ce que je ne recommande pas… soit transformer cette “sub” en “function” qui renvoie la ligne voulue et faire le traitement dans une fonction séparée.
Je reste à ta dispo pour la suite. Mais je préfère t’aider que faire tout le truc à ta place… conformément au dicton sur donner du poisson ou apprendre à pêcher.