modifier en vba les données d'une liste

W

Willy

Guest
Bonjour à tous,

J'ai une liste de données du personnel dans la feuille "BDD" en A3:J500.

dans la feuille ACCEUIL, j'ai un userform avec lequel en saisissant le nom et prénom de la personne je récupère et j'affiche dans des textbox les infos.

Je souhaiterai pouvoir modifier à partir de l'USF une ou plusieurs infos et les replacer dans la liste en remplacement donc des anciennes.

Je ne peux pas bien sur me servir du numéro de ligne du tableau, car la liste évolue en entrée personnel alphabétiquement.

J'ai bien essayé ceci :
Sheets("BDD").Range("D1").Offset(Entree_MatriculeM + 1, 0) = TextBox_GradeM
Sheets("BDD").Range("E1").Offset(Entree_MatriculeM + 1, 0) = ComboBox_FonctionM
Etc ...

En prenant pour repère le matricule de la personne mais sans résultat.

Donc je sèche la !!
Si vous avez une suggestion ou mieux un exemple
merci beaucoup
Willy
 
R

Robert

Guest
Salut Willy, Salut Jocelyne, Salut le forum,

C’est dommage que tu n’ais pas mis ton fichier en exemple car j’aurais pu travailler sur tes propres données. Du coup, j’ai tout inventé et il te faudra adapter tant l’UserForm que ces codes.
Attention les codes font références à des plages nommées : Noms, Prénoms et tab il faudra que tu les crées aussi sur ton fichier.
Sinon, l’UserForm permet tant de “chercher/corriger” que de “rajouter” une nouvelle donnée. Mais il faudra quand même utiliser le bouton “Chercher” pour rajouter une nouvelle donnée.
J’espère que ça te conviendra.

À plus,

Robert
 

Pièces jointes

  • Test.zip
    21.9 KB · Affichages: 37
  • Test.zip
    21.9 KB · Affichages: 35
  • Test.zip
    21.9 KB · Affichages: 34
W

Willy

Guest
Re Jocelyne, re le forum,

J'ai trouvé ton fil ( non sans mal ! je l'ai manqué 2 fois ! lol)

En fait mon cas diffère un peu car je n'utilise pas de listBox et je n'arrive pas à partir d'un textBox. Je m'explique :

Le but de mon projet c'est d'ouvrir un gros USF permettant d'afficher de nombreuses infos sur chaque membre du personnel et permettant facilement de modifier certaines infos et donc de replacer dans la liste les nouvelles infos. Ceci se fait dans la page ACCEUIL, interdisant de modifier les infos directement dans la page BDD contenant la liste complète.

Quand j'ouvre mon USF, j'ai 2 textBox pour la recherche du NOM et PRENOM que je saisi puis je clique sur un bouton RECHERCHE.

( J'ai préféré les textBox NOM et PRENOM comme mode de recherche plutôt qu'une listBox qui contiendrai tous les noms et prénoms de ma liste pour 2 raisons :
D'abord c'est plus rapide que de rechercher dans une liste qui contiendra à terme 200 à 250 noms;
-De plus après essai avec la listBox, ça rame un peu car a l'issue de la recherche je dois afficher pas moins de 160 infos dans autant de textBox et comboBox.)

Donc après avoir saisi le NOM et PRENOM à rechercher puis valider, toutes les infos viennent remplir les textBox et comboBox.

Comme je suis débutant en VBA, je ne sais pas comment faire pour réinscrire les nouvelles données dans la liste en me servant du NOM et PRENOM comme repère, par contre dans les infos affichées il y a un textbox qui récupère le matricule de la personne qui est unique pour chaque personne.

J'ai bien essayé la méthode suivante adapté à une listbox :

With Sheets("BDD")
.Range("A2").Offset(Entree_MatriculeM + 1, -3) = Entree_Agent_NomM ' CHAMP NON MODIFIABLE
.Range("B2").Offset(Entree_MatriculeM + 1, -2) = Entree_Agent_PrenomM ' CHAMP NON MODIFIABLE
.Range("C2").Offset(Entree_MatriculeM + 1, -1) = Entree_MatriculeM ' champ de reference pour la modif des données de l'agent !
.Range("D2").Offset(Entree_MatriculeM + 1, 0) = ComboBox_GradeM
End With

Mais offset d'après l'aide ne semble pas convenir pour un textBox,
de plus, j'ai supprimer Entree_MatriculeM.ListIndex pour essayer Entree_MatriculeM.text , Entree_MatriculeM.value, bref plusieurs tentatives sans résultats satisfaisants.

Je suis dans l'impasse !!!

Merci de votre aide, je vais continuer la recherche sur le forum.

Willy
 
W

Willy

Guest
Bonjour Robert,
Je répondais à Jocelyne et je viens d'y lire ton message.
Je vais voir ton exemple et te tiens au courant.

Je n'ai pas mis de fichier joint car le mien est lourd mais au cas ou je vais en préparer un light !
Merci encore, je m'empresse de voir ce que tu m'as concocté !
Willy
 
W

Willy

Guest
Re,

Je viens tout juste de visualiser ton exemple Robert, mais c'est parfait, c'est exactement ce que je cherchai !

Je vais donc analyser et adapter tes procédures.

Juste une infos, je te cite :
Attention les codes font références à des plages nommées : Noms, Prénoms et tab il faudra que tu les crées aussi sur ton fichier

Qu'est une plage nommée ?
J'ai bien nommée ma colonne contenant les NOMS. Est-ce cela ?

a+
 
R

Robert

Guest
Re Willy, Jocelyne et le forum,

En pièce jointe un fichier Word avec un petit complément d'informations.

À plus,

Robert
 

Pièces jointes

  • Explications.zip
    3.7 KB · Affichages: 24
  • Explications.zip
    3.7 KB · Affichages: 25
  • Explications.zip
    3.7 KB · Affichages: 23
W

Willy

Guest
Re Robert, Jocelyne et le forum,

Tout d'abord Robert merci beaucoup, ton aide ma été précieuse.
J'ai repris entièrement la gestion de ma liste à partir de ton exemple et cela fonctionne parfaitement.

Juste un soucis dans mon appli que je ne maîtrise pas pour l'heure et qui concerne la procédure du bouton RECHERCHER, à savoir que par rapport à ton exemple j'ai une erreur dans la variable Cel et j'ai été obligé pour que cela fonctionne de déclarer Dim Cel en début de procédure ( d'ailleur c'est peut être pas vraiment juste mais ça fonctionne !!), alors que dans ton exemple, nul besoin de cela ?

' Procédure du bouton RECHERCHER :
Private Sub Rechercher_Agent_Click()
Dim Cel ' -------> Déclaration rajoutée

Application.ScreenUpdating = False
Sheets("BDD").Select
'Recherche le Nom et vérifie le Prénom de l'agent
For Each Cel In ActiveSheet.Range("A3:A" & Range("A501").End(xlUp).Row)
If Cel.Value = Recherche_Nom.Value Then
If Cel.Offset(0, 1).Value = Recherche_Prenom.Value Then
'Sélectionne la ligne contenant Nom et Prénom de l'agent
Cel.Select
Exit For
End If
End If
Next
...

Qu'est-je manqué ?

Merci pour ton complément d'informations.
Willy
 
@

@+Thierry

Guest
SAlut Willy, Robert, Jocelyne, le Forum

Ah oui ce Fil Lien supprimé hihihi

Bon pour ta dernière question Willy, c'est sûrement parcequ'en Top de Module tu as "Option Explicit" ce qui est très bien car il t'oblige à déclarer les Variables...

Le "Dim Cel" signifie (par défaut) que tu déclares Cel as Variant, assez gourmand quand on on a pas besoin.... Dans ce Cas il Faut déclarer "Dim Cel as Range"

Ensuite pour le Code, il faut éviter tous les Select dans une procédure sauf si vraiment on veut finir sur cette cellule... Même avec le paliatif "Application.ScreenUpdating = False" chaque Select ralentit d'autant le code...

Donc au lieu de :
If Cel.Offset(0, 1).Value = Recherche_Prenom.Value Then
Cel.Select
Exit For
End If

J'écrirai en ayant pris soin de déclarer en début de Sub :

Dim LigneNum As Integer
'etc etc etc la macro

If Cel.Offset(0, 1).Value = Recherche_Prenom.Value Then
LigneNum = cel.Row
Exit For
End If

Puis plus bas :
TextBox4.Value = Cells(LigneNum, 3).Value
TextBox5.Value = Cells(LigneNum, 4).Value
'Etc etc

Mais ce n'est qu'un manière car je fais la guerre à tous les Select dans ce Forum si tu es content comme çà et que çà marche c'est le principal.

Bonne nuit
@+Thierry
 
M

Marc

Guest
bonjour,

J'ai suivi avec intérêt la progression de ce fil.
Je cherche à installer un cotrôle dans une appli perso que je pensais trouver dans l'exemple proposé : le contrôle du format de date à la saisie.
J'ai, à titre de test, saisi dans la zone date : 21/21/1975 , le programle vba s'est planté sur la ligne
ActiveCell.Offset(0, 2).Value = DateValue(TextBox3.Value) 'Date
c'est sûr qu'avec 21 dans le mois, ce n'est pas surpenant.
Peut-on faire un contrôle à la saisie et comment

Merci
 
W

Willy

Guest
Bonjour le forum,

Merci Thierry, merci beaucoup pour tes précisions sur les déclarations ainsi que sur les select !
Certe, cela marche bien mais c'est toujours très interressant de connaître le pourquoi du comment et d'optimiser le code car le projet grossissant, il arrive très souvent que le code qui semble exact à première vue pose quelques problèmes et bizarreries.
C'est d'ailleur mon cas actuellement mais je vais ouvrir un nouveau fil pour traiter du sujet.

En tout cas, merci à vous tous pour votre disponibilité et votre gentillesse qui permettent à un newbie comme moi de ne pas bloquer en VB.
Ce forum est une super école.

Bonne journée
Willy
 
W

Willy

Guest
Bonjour Marc,
Désolé je n'ai pas vu ta question.
Si j'ai bien compris, tu cherches à formater ton textBox pour que lors de la saisie de celui-ci, la date soit formatée automatiquement ?
Si oui, voici un petit exemple joint plus parlant


************

Pour Thierry :
J'ai suivi ton conseil en supprimant et remplaçant les select par ton exemple :

Dim LigneNum As Integer
'etc etc etc la macro

If Cel.Offset(0, 1).Value = Recherche_Prenom.Value Then
LigneNum = cel.Row
Exit For
End If

Puis plus bas :
TextBox4.Value = Cells(LigneNum, 3).Value
TextBox5.Value = Cells(LigneNum, 4).Value
'Etc etc

Et effectivement, la recherche et l'affichage des données est plus rapide.
Merci,
Willy
 

Pièces jointes

  • Marc.zip
    12.5 KB · Affichages: 37
  • Marc.zip
    12.5 KB · Affichages: 40
  • Marc.zip
    12.5 KB · Affichages: 38

Discussions similaires

Statistiques des forums

Discussions
314 166
Messages
2 106 622
Membres
109 644
dernier inscrit
croate46