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.

67sources-dt.xlsm (89.29 Ko)

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....

https://forum.excel-pratique.com/excel/en-panne-de-solutions-pour-formulaire-vba-userform-t54253.html

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 Sub

A+

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

54sources-dt-v1.xlsm (77.79 Ko)

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 i

fred

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()

37tonga-v001.xlsm (86.05 Ko)
50tonga-v002.xlsm (90.92 Ko)

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

51tonga-v003.xlsm (88.58 Ko)

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

41tonga-v004.xlsm (74.01 Ko)

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...

50tonga-v005.xlsm (71.21 Ko)

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

87tonga-v005-1.xlsm (71.17 Ko)

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
Next

si 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
Next

Dans 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

94tonga-v006.xlsm (73.39 Ko)
Rechercher des sujets similaires à "maj base donnees partir modif listbox item"