Modification du formulaire ne se fait que sur certaines TextBox
Bonjour à toutes et tous,
Ça fait 2 semaines que je bute sur le même problème, malgré avoir cherché autant que je pouvais, et ça me rend fou. Je suis débutant VBA donc si ça se trouve c'est d'une bêtise incroyable. Reste que je bloque et votre aide me serait très utile!
J'ai un fichier excel faisant office de base de données des patients que je suis. Je désire faire un formulaire VBA pour rendre plus user-friendly la manipulation des données. J'ai donc un formulaire habituel avec des textbox, des checkbox et des optionbuttons et 3 Subs principaux:
getData: récupère les infos de la ligne et les affiche dans le formulaire
Public loCurrentRow As Long
Private Sub getData()
Sheets("Feuil1").Activate
Dim cCTRL As Control, rFirstLine As Range, rTitle As Range, varTag As Variant, loColNum As Long
Set rFirstLine = Range("A1:AE1")
For Each cCTRL In Me.Controls
If TypeName(cCTRL) = "TextBox" Or TypeName(cCTRL) = "CheckBox" Or TypeName(cCTRL) = "OptionButton" Then
varTag = cCTRL.Tag
Set rTitle = rFirstLine.Find(varTag, LookIn:=xlValues, lookat:=xlWhole)
loColNum = rTitle.Column
'TextBox'
If TypeName(cCTRL) = "TextBox" Then
cCTRL.Value = Cells(loCurrentRow, loColNum)
End If
' checkbox '
If TypeName(cCTRL) = "CheckBox" Then
If Cells(loCurrentRow, loColNum) = cCTRL.Caption Then
cCTRL.Value = True
Else
cCTRL.Value = False
End If
End If
'optionbutton'
If TypeName(cCTRL) = "OptionButton" Then
If Cells(loCurrentRow, loColNum) = cCTRL.Caption Then
cCTRL.Object.Value = True
End If
End If
End If
Next cCTRL
End SubEdit: modifie la liste à partir des valeurs dans le formulaire
Private Sub Edit()
Sheets("Feuil1").Activate
Dim cCTRL As Control, rFirstLine As Range, rTitle As Range, varTag As Variant, loColNum As Long
Set rFirstLine = Range("A1:AE1")
For Each cCTRL In Me.Controls
If TypeName(cCTRL) = "TextBox" Or TypeName(cCTRL) = "CheckBox" Or TypeName(cCTRL) = "OptionButton" Then
varTag = cCTRL.Tag
Set rTitle = rFirstLine.Find(varTag, LookIn:=xlValues, lookat:=xlWhole)
loColNum = rTitle.Column
'Textbox'
If TypeName(cCTRL) = "TextBox" Then
Cells(loCurrentRow, loColNum) = cCTRL.Value
End If
'checkbox'
If TypeName(cCTRL) = "CheckBox" Then
If cCTRL.Value = True Then
Cells(loCurrentRow, loColNum) = cCTRL.Caption
Else
Cells(loCurrentRow, loColNum) = ""
End If
End If
'optionbutton'
If TypeName(cCTRL) = "OptionButton" Then
If cCTRL.Object.Value = True Then
Cells(loCurrentRow, loColNum) = cCTRL.Caption
End If
End If
End If
Next cCTRL
End SubarchiveClear: ajoute les données du formulaire sur une autre feuille et efface la ligne
Private Sub archiveClear()
Dim cCTRL As Control, loNewRow As Long, rFirstLine As Range, rTitle As Range, varTag As Variant, loColNum As Long
loNewRow = Sheets("Feuil2").Range("b65536").End(xlUp).Row + 1
Set rFirstLine = Range("A1:AD1")
For Each cCTRL In Me.Controls
If TypeName(cCTRL) = "TextBox" Or TypeName(cCTRL) = "CheckBox" Or TypeName(cCTRL) = "OptionButton" Then
varTag = cCTRL.Tag
Set rTitle = rFirstLine.Find(varTag, LookIn:=xlValues, lookat:=xlWhole)
loColNum = rTitle.Column
'Textbox'
If TypeName(cCTRL) = "TextBox" Then
Worksheets("Feuil2").Cells(loNewRow, loColNum) = cCTRL.Object.Value
End If
'checkbox'
If TypeName(cCTRL) = "CheckBox" Then
If cCTRL.Value = True Then
Worksheets("Feuil2").Cells(loNewRow, loColNum) = cCTRL.Caption
Else
Worksheets("Feuil2").Cells(loNewRow, loColNum) = ""
End If
End If
'optionbutton'
If TypeName(cCTRL) = "OptionButton" Then
If cCTRL.Object.Value = True Then
Worksheets("Feuil2").Cells(loNewRow, loColNum) = cCTRL.Caption
End If
End If
End If
Next cCTRL
Sheets("Feuil1").Range("B" & loCurrentRow, "AD" & loCurrentRow).Clear
End SubMon problème est le suivant: lorsque je lance mon formulaire et que je veux l'éditer, les modifications fonctionnent uniquement sur les 2 premières colonnes (Chambre et Nom) mais pas les suivantes, comme si la boucle s'arrêtait de fonctionner.
J'ai fait un 2e fichier test, avec des données bidons et moins de colonnes (et donc de controls) et avec le même code. Et la ça marche! (je désespère..)
Merci d'avance pour votre aide!
Bonjour, j'ai tester et pour moi ça fonctionne
Je suis allé un peu vite en besogne. Le premier test a réussi mais pas le second
Je suis novice mais ce que je ne comprends pas c'est que dans les Ojets il y a une feuille11. Cela me parait curieux
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour à tous,
cCtrl.value = True Then > quand c'est un TextBox, ça donne faux, même quand le TextBox contient du texte. J'ai remplacé pour les TextBox cCtrl <> "" then
J'ai aussi utilisé Dim oEdit As Boolean afin d'empêché le "Combobox" de réinitialiser les champs avec "getData" au bas de Private Sub ComboBox1_Change() >> suivre les "oEdit".
La colonne "ipp" n'a pas de cCtrl dans le formulaire (à revoir). Je n'ai pas testé toutes les colonnes.
@Andre13 >> j'ai tout copié dans un nouveau fichier.
Un essai ...
ric
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Merci Ric
Bonjour à tous,
cCtrl.value = True Then> quand c'est un TextBox, ça donne faux, même quand le TextBox contient du texte. J'ai remplacé pour les TextBoxcCtrl <> "" thenJ'ai aussi utilisé
Dim oEdit As Booleanafin d'empêché le "Combobox" de réinitialiser les champs avec "getData" au bas dePrivate Sub ComboBox1_Change()>> suivre les "oEdit".La colonne "ipp" n'a pas de cCtrl dans le formulaire (à revoir). Je n'ai pas testé toutes les colonnes.
@Andre13 >> j'ai tout copié dans un nouveau fichier.
Un essai ...
ric
Merci ric!!!
Je ne comprends toujours pas pourquoi ça marchait dans un fichier mais pas dans l'autre mais en tout cas ton système fonctionne! Merci encore, je vais enfin pouvoir avancer.
Bonjour à tous,
... Je ne comprends toujours pas pourquoi ça marchait dans un fichier, mais pas dans l'autre, mais en tout cas ton système fonctionne! ...
À l'exécution du code, le Textbox "nom" était réécrit, le combobox (liste des noms) se retrouvait appelé à exécuter de nouveau son code Private Sub ComboBox1_Change() ... tous les deux gérant les données de la colonne B (nom).
Au bas du code de Private Sub ComboBox1_Change(), il y a l'appel de la macro "getData" > "getData" que fait-il ? Il réécrit les données dans les controls (textbox, checkbox, optionbutton) > les changements faits dans le formulaire étaient donc perdus.
D'où l'utilisation de "Dim oEdit as Boolean" pour bloquer temporairement l'exécution de Private Sub ComboBox1_Change(). Fait une recherche (Ctrl+F) sur oEdit pour trouver les endroits où je l'ai utilisé.
Dans ton fichier "Fomulaire test.xlsm", il n'y a pas ce lien "TextBox" <> "Combobox" gérant tous les deux les données de la colonne B (nom). Donc pas de réécriture ... d'où le fonctionnement correct.
ric
