MAJ de base de données à partir de la modif Listbox Item
Bonjour à tous,
Merci pour vos divers concours qui m'aident à avancer dans l'élaboration de mon outil.
Ma difficulté actuelle :
J'ai une base de données dans la feuille BD dont les enregistrements peuvent être consultés et/ou modifiés à partir du USF CONSULTATION_OU_MODIFICATION. Les modifications apportées à un enregistrement dans ce cas doivent mettre à jour l'enregistrement originel dans la BD à la suite de la validation.
Si la consultation des enregistrements dans le USF marche, leur modification ne met pas à jour la base de données BD.
Mes recherches sur les forums pour lever ces difficultés sont restées vaines.
Merci à vous pour votre aide.
Voila mon fichier joint à cet effet.
bonjour
je pense que les userforms ne sont pas nommés comme il faut a la base pour que cela soit plus simple a programmer....
et dans ces conditions, ton code actuel pourrais etre simplifier.....
que cela soit des listbox ou combobox ou textbox ils devraient être tous renommés du genre box1, box2, box3, .... ou autre nom peut importe mais dans un ordre croissant le même que tes colonnes de ton fichier....
voir un post existant traitant de la même chose et dont un nouveau formulaire/recherche/et modification_enregistrement a déjà été traiter... le tout dans un meme userform....
je te suggère d'aller voir et de faire des essais et il y a possibilité de t'aider si ton fichier de base est correct
fred
Bonjour TONGA
Je n'ai pas tout compris le fonctionnement de ton fichier
Mais le code du bouton de validation des modifs devrait être pus celui-là
Private Sub CommandButton7_Click()
Dim L As Long, i As Byte
For i = 1 To 39
If Me.Controls("TextBox" & i) = "" Then Exit Sub
Next
' Récupérer la ligne ici
L = ActiveCell.Row
' Boucle et modification après
For i = 1 To 8
Cells(L, i) = Me.Controls("Textbox" & i + 17)
Next
Cells(L, 9) = ComboBox14
Cells(L, 10) = TextBox26
Cells(L, 11) = ComboBox16
Cells(L, 12) = ComboBox15
Cells(L, 13) = TextBox27
Cells(L, 14) = TextBox28
Cells(L, 15) = TextBox29
Cells(L, 16) = TextBox30
Cells(L, 17) = TextBox31
Cells(L, 18) = TextBox32
Cells(L, 19) = TextBox33
Cells(L, 34) = TextBox34
Cells(L, 38) = TextBox35
Cells(L, 35) = TextBox36
Cells(L, 23) = TextBox37
Cells(L, 24) = TextBox38
Cells(L, 21) = TextBox39
Cells(L, 22) = TextBox40
Cells(L, 20) = ComboBox5
Cells(L, 36) = ComboBox6
Cells(L, 26) = TextBox41
Cells(L, 27) = TextBox42
Cells(L, 25) = ComboBox7
Cells(L, 37) = ComboBox8
Cells(L, 28) = ComboBox1
Cells(L, 29) = ComboBox2
Cells(L, 30) = ComboBox3
Cells(L, 31) = ComboBox9
Cells(L, 32) = ComboBox10
Cells(L, 33) = ComboBox11
End SubA+
Bonsoir à Fred, à Bruno et à tous.
Mes codes sont peu lisibles et donc ne peuvent pas marcher.
Sur tes conseils Fred, j'ai mis un peu d'ordre dans mes textbox et combobox tel que souhaité. Si j'ai bien compris.
Alors le revoilà mon fichier aménagé.
Merci encore pour votre soutien
Bonjour Tonga
je suis au regret de te dire que tu as fais que la moitié du travail.....
tu as bien renommé les box sur le userform FORULAIRE DE SAISIE mais uniquement sur tout ce qui se trouve a gauche de N° dossier a APPORTEUR => tous les noms des box sont TextBoxX avec X un chiffre et ce qui correspond a la colonne de ta base de donnée ou se trouve l'information....
mais tout le reste n'a pas été fait puis que l'on retrouve encore des noms de box en combobox et autre...... par contre rien fait sur le userform consultation/ modification...
fred
re bonjour
j'ai quand même renommer une partir de tes box de ton userform consultation/modification et regarder ton code de plus près.....
tu avais une "erreur" dans ton userform consultation ou modification dans la sub : Private Sub TextBox43_Change()
au niveau de la mise en mémoire de ton tableau dans ta variable aa tu avais marqué
With feuil2 ce qui devrait marché je pense, mais visiblement cela coince... j'ai modifié en
With Sheets(1)et cela met correctement ton tableau de la page en mémoire dans ta variable tableau aa....
j'ai complèter la ligne de dujardin pour faire un essai....
tu regarderas le code de la fonction : Private Sub ListBox2_Click() et tu verras comment c'est bcp plus simple pour remplir ton formulaire... avec cette méthode si le userform est correctement construit.... à la base
au passage tes colonnes M et P ne sont pas au format Date... cela va peut etre poser problème plus tard....
pour faire une sauvegarde des modifications dans ta feuille il faudra retrouver la ligne de la personne dans la base de données et il suffira de faire :
For i = 1 To 38
sheets(1).Cells(lig, i) = Controls("box" & i)
next ifred
EDIT : après vérification cela marche très bien avec feuil2 mais comme j'avais deux fichiers venant de toi ouvert je ne travaillait pas forcement sur le bon fichier au moment ou j'ai fait cela....
donc la V2 avec a priori rien de changer dans ta fonction Private Sub TextBox43_Change()
Re bonjour maintenant pour repondre au problème initial a savoir l'enregistrement dans la BDD les modifs
tu trouveras cette version 3.. qui le fait
voir
Private Sub valid_modif_Click()pour rechercher la bonne personne dans le BDD je vérifie le nom-prenom et date de naissance
cela implique que tu ne peux pas mettre a jours ces 3 informations.... elle sont a présent grisées...
fred
Bonjour FRED,
Merci pour ton aide. Il y a plus de clarté dans le programme.
Permets moi de continuer à te déranger encore.
J'ai terminé les modifications des textbox et combobox que tu avais commencé.
Et fais les tests en sauvegardant la version 3 téléchargée, renommé V004 après les modifs des box et la MAJ du nombre de colonnes, mais ça ne fonctionne pas. Est ce le résultat de ces modifications dans les codes.
Private Sub ListBox2_Click()
Dim i As Integer
For i = 0 To 37' les 38premieres box ayant été renommées comme il faut, ensuite
Me.Controls("box" & i + 1) = ListBox2.List(ListBox2.ListIndex, i)
Next i
Controls("box2").Enabled = False
Controls("box4").Enabled = False
Controls("box6").Enabled = False
End Sub
Private Sub UserForm_Click()
End Sub
Private Sub valid_modif_Click()
Dim lig, lig_ok As Integer
Dim i, j As Byte, nbre As Byte
For i = 1 To 38'les 38 premieres box ayant été renommées comme il faut, ensuite
If Me.Controls("Box" & i) = "" Then Exit Sub
Next
With Feuil2
'détermine dans la base le nombre de pesonnes ayant le meme nom...
nbre = Application.CountIf(Columns(2), ListBox2.List(ListBox2.ListIndex, 1))
'si personne sorti de la sub (a paiori cela n'arrivera jamais...
If nbre = 0 Then Exit Sub
lig = 1
For i = 1 To nbre
'récupération de la ligne a partir du nom de la pesonne
lig = .Columns(2).Find(What:=ListBox2.List(ListBox2.ListIndex, 1), After:=Cells(lig, "B"), SearchDirection:=xlNext).Row
If .Cells(lig, "D") = ListBox2.List(ListBox2.ListIndex, 3) And .Cells(lig, "F") = ListBox2.List(ListBox2.ListIndex, 5) Then lig_ok = lig
Next i
For i = 1 To 38 ' les 38 premieres box ayant renommées comme il faut, ensuite
.Cells(lig_ok, i) = Controls("box" & i)
Next i
'mise a jour de l'affichage arrière plan
Application.ScreenUpdating = True
Application.ScreenUpdating = False
End With
End Sub
Je te joins le fichier en V4
Merci encore
bonsoir
qu'est ce qui ne marche pas ??? chez moi cela a l'air de fonctionner pourtant.... sans rien changer par rapport a la v4
mais je ne connais pas le résultat attendu ....
je t'ais remis dans le bon ordre les colonnes de ton fichier pour que cela soit dans l'ordre des box....
j'ai fais en sorte aussi que quand tu veux utiliser le clavier pour passer d'un champ a un autre avec la touche de tabulation tu passe par ordre croissant de tes box.
essais avec le dernier de la liste nsimba pour lire ces infos dans cette ordre là...
et dis moi ce qui cloche réellement .... quel est le resultat attendu ???
fred
EDIT : tu regarderas aussi pour plus tard car je pense que la question va tombée...
dans ton userform formulaire de saisie... dans UserForm_Initialize je t'ai mis en exemple deux lignes pour initialiser les listes de choix dans les combobox...
Bonsoir Fred,
Le résultat attendu à cette étape :
Avec le userform :
1/ A partir d'une information partielle quelconque ( du Num d'ordre, du nom, du Num de tél................................), retrouver un enregistrement.
2/ Modifier l'enregistrement (correction, ajout.............)
Avec la base de données :
3/ Mettre à jour la base de données des modifications apportées.
J'ai noté que tu as parfaitement mise à jour la fiche de Nsimba (le dernier enregistrement de la liste), ce qui correspond à ce qui est attendu. Donc une saisie incomplète au départ corrigée par la suite de renseignement complémentaire.
Merci aussi pour l'activation de la tabulation.
Ce que je ne comprend pas et donc ne peux expliquer c'est que :
Avec le fichier V005 que tu viens de m'envoyer tout comme le le V003, j'arrive à faire la modification sur un seul enregistrement. La tentative suivante sur un autre, ne marche pas. Ainsi par exemple, j'ai modifié normalement la Profession de "DUJARDIN MAX" de Maçon en Chauffagiste. Et puis l'essai sur "NSIMBA" n'a pas marché.
Incompréhensible!!!!
Les aménagements, les modifications, les ajouts que tu as apportés aussi bien sur la structure de la USF que dans les codes correspondent exactement à ce que je veux.
Mais je n'obtiens le bon résultat qu'une seule fois et plus rien pour la suite.
Je ne saurai donc te dire ce qui cloche lorsque je récupère le fichier.
Pour te rassurer je te joins le fichier V005 que tu m'as envoyé, modifié de la "Profession" de l'enregistrement de DUJARDIN, tel que précisé plus haut.
Mon système d'expl est : W7
avec Office 2007
Merci encore pour ton support
bonjour
le soucis ne vient pas de ton système....
mais de ceci :
For i = 1 To 38 ' les 38 premieres box ayant été renommées comme il faut, ensuite
If Me.Controls("Box" & i) = "" Then Exit Sub
Nextsi tu as une box qui n'est pas renseignée cela sort de ta sub sans rien te dire....
par exemple pour nsimba pas de nom marital donc pas d'enregistrement.... sans rien dire....
pour les autres lignes il n'y a pas de date de naissance de renseignée dans la BDD et comme tu ne peux pas la saisir car grisée cela va poser problème....
une solution serait déjà de mettre une date de naissance a tout le monde puis de changer le code de la manière suivante :
For i = 1 To 38 ' les 38 premieres box ayant été renommées comme il faut, ensuite
If i <> 3 Then 'pas d'obligation de nom marital
If Me.Controls("Box" & i) = "" Then
MsgBox "Toutes les informations ne sont pas renseignées, Veuilez corriger"
Exit Sub
End If
End If
NextDans ce cas l'enregistrement ne sera fait que si toutes les box sont rempli c'est ce que tu veux ???
fred
Bonjour Fred,
Ton concours a été déterminant. Tout marche impeccablement.
J'ai néanmoins levé la restriction sur l'obligation de renseigner tous les champs avant validation des modifications.
J'ai également maintenu grisé seulement le N° adhésion.
Je vais mettre à jour toutes les dates pour éviter les surprises ultérieures comme conseiller.
Merci infiniment pour ta patience, ta disponibilité et surtout pour ton aide, FRED.
Merci à tous
Je te joins la version VI