Gestion d'un Formulaire en VBA
salut salut à tous
y' a peu, j'avais émis une demande d'aide dans ma création d'un Userform (le mien dénommé frmSaisie) dont l'aperçu est joint (les noms des textbox et comboBox) sont joints !
étant donné que ce dernier permet d'alimenter une BD (tableau dénommé "TSanction"), mon pb c'est sur le bouton "Ajouter un cas" que j'ai dénommé "btnAjout"
voici le code que l'on m'avait proposé (adapté à mon besoin)
Private Sub btnAjout_Click()
Dim CelF As Range, Ind As Integer, Lig As Long
If Me.txtDate.Value = "" Then
Me.txtDate.SetFocus
MsgBox "Veuillez renseigner le champ 'Date' "
Exit Sub
End If
' Demande
If MsgBox("confirmez-vous l'ajout des données?", vbYesNo, "confirmation") = vbNo Then Exit Sub
' Si ok on ajoute
With LstBdD
' Trouver la prochaine ligne vide du tableau
Set CelF = .ListColumns(1).Range.Find("")
' Si aucune on ajoute une nouvelle ligne
If CelF Is Nothing Or .ListRows.Count = 0 Then
.ListRows.Add: Lig = .ListRows.Count
Else
Lig = CelF.Row - .HeaderRowRange.Row
End If
' Inscrire les Droits CP en premier, avant recalcul
.DataBodyRange(Lig, 1) = Me.txtDate.Value
' Pour chaque Checkbox de la 1 à la 6
For Ind = 1 To 6
If Me.Controls("CheckBox" & Ind).Value = True Then
' On peut inscrire un X ou autre chose
.DataBodyRange(Lig, 1 + Ind) = "X"
End If
Next Ind
End With
' Réinitialiser le formulaire
Call frmSaisie_Initialize
End Sub
*****************************************************************************************
Private Sub frmSaisie_Initialize()
Dim Ind As Integer
' Assignation de la base
Set LstBdD = ThisWorkbook.Sheets("BD").ListObjects("TSanction")
' Initialiser le formulaire
Me.txtDate.ListIndex = -1
For Ind = 1 To 4
Me.Controls("CheckBox" & Ind).Value = False
Next Ind
End SubMalheureusement, quand je veux l'executer, il y'a une erreur signalée au niveau de la ligne
Set CelF = .ListColumns(1).Range.Find("")je suis perdu svpl...
NB : JE SUIS NOVICE DU VBA, Je suis en mode apprentissage et apprends encore à utiliser les boucles sur des listes structurées.
Bonjour
Sans le fichier ....
Ce n'est pas trop comme cela que j'ajoute une ligne mais essayez déjà comme ceci
Voir EditCordialement
Edit : vous auriez du rester sur votre fil d'origine --> https://forum.excel-pratique.com/excel/code-vba-activation-conditionnelle-173908
remplacez cette ligne
With LstBdDpar ceci
with ThisWorkbook.Sheets("BD").ListObjects("TSanction")Edit 2 :
en fait votre erreur via du fait que selon le code que vous avez posté, il vous manque cette instruction à placer avant le premier code dans votre USF
Dim LstBdD As ListObjectJe rajoute une couche.
voici le code que l'on m'avait proposé (adapté à mon besoin)
Et bien non justement. Allez revoir ce que BrunoM45 vous a donné dans sa réponse ici --> https://forum.excel-pratique.com/s/goto/1079532 notamment sur le code Initialize
Cordialement
J'avais bien évidemment essayé d'adapter le code de M. Bruno malheureusement, les erreurs aparaissent.
Conformément à ce que vous m'avez suggéré, j'ai modifié.
Cependant, l'erreur est maintenant au niveau de la ligne de code
If Me.Controls("TextBox" & Ind).Value = True ThenMais mon attention vient du fait que je n'ai pas de checkbox dans ma Userform.
plutot des combobox et des TextBox.
ça galère un peu..
1. J'avais bien évidemment essayé d'adapter le code de M. Bruno malheureusement, les erreurs aparaissent.
C'est une erreur que beaucoup font. Pour vous éviter cette erreur si vous lancez votre userform avec une instruction show, veillez à mettre une ligne Load avant
Donc de ce que je vois dans votre demande mettez ceci juste avant la ligne SHOW: -->
Load frmSaisie2. Mais mon attention vient du fait que je n'ai pas de checkbox dans ma Userform. plutot des combobox et des TextBox
Elles sont nommées comment vos textbox ?
Je vous présente intégralement mon code
Option Explicit
Dim LstBdD As ListObject
*******************************************************************************
Private Sub btnAjout_Click()
Dim CelF As Range, Ind As Integer, Lig As Long
If Me.txtDate.Value = "" Then
Me.txtDate.SetFocus
MsgBox "Veuillez renseigner le champ 'Date' "
Exit Sub
End If
' Demande
If MsgBox("confirmez-vous l'ajout des données?", vbYesNo, "confirmation") = vbNo Then Exit Sub
' Si ok on ajoute
With ThisWorkbook.Sheets("BD").ListObjects("TSanction")
' Trouver la prochaine ligne vide du tableau
Set CelF = .ListColumns(1).Range.Find("*")
' Si aucune on ajoute une nouvelle ligne
If CelF Is Nothing Or .ListRows.Count = 0 Then
.ListRows.Add: Lig = .ListRows.Count
Else
Lig = CelF.Row - .HeaderRowRange.Row
End If
' Inscrire les Droits CP en premier, avant recalcul
.DataBodyRange(Lig, 1) = Me.txtDate.Value
' Pour chaque Checkbox de la 1 à la 6
For Ind = 1 To 6
If Me.Controls("TextBox" & Ind).Value = True Then
' On peut inscrire un X ou autre chose
.DataBodyRange(Lig, 1 + Ind) = "X"
End If
Next Ind
End With
' Réinitialiser le formulaire
Call frmSaisie_Initialize
End Sub
*****************************************************************************
Private Sub frmSaisie_Initialize()
Dim Ind As Integer
' Assignation de la base
Set LstBdD = ThisWorkbook.Sheets("BD").ListObjects("TSanction")
' Initialiser le formulaire
Me.txtDate.ListIndex = -1
For Ind = 1 To 6
Me.Controls(TextBox & Ind).Value = False
Next Ind
End Sub
******************************************************************************
'quitter le formulaire
Private Sub btnQuitter_Click()
Unload Me
End Sub
'vider le formulaire
Private Sub btnReinitialiser_Click()
txtDate.Value = ""
txtNomEtudiant.Value = ""
cboClasse.Value = ""
cboMotif.Value = ""
txtSanction.Value = ""
txtDuree.Value = ""
End Sub
*******************************************************************************
'imposer le remplissage de tous les champs pour rendre actif le bouton Ajouter
' et de pouvoir valider l'enregistrement d'un cas
Private Sub txtDuree_AfterUpdate()
Dim Ctl As Control, FlgOk As Boolean
' Initialiser le flag
FlgOk = True
' Parcourir chaque contrôles
For Each Ctl In Me.Controls
' Si c'est un TextBox ou un ComboBox
If TypeOf Ctl Is MSForms.TextBox Or _
TypeOf Ctl Is MSForms.ComboBox Then
' vérifier si vide, si oui = NOK
If Ctl.Value = "" Then FlgOk = False: Exit For
End If
Next Ctl
' Sortie de la boucle on vérifie le flag
If FlgOk = True Then Me.btnAjout.Enabled = True
End Suben respectant vos instructions
1. C'est faux ! Mais est-ce que vous lisez ce que je vous écrit ??? --> https://forum.excel-pratique.com/s/goto/1082052
2. Pour vos textbox : vous voulez quoi dedans à l'ouverture ?
Chef
mon projet c'est de création d'un formulaire capable d'alimenter une base de données (en l'occurence, mon tableau structuré "TSanction") dans une feuille excel.
Mes textbox et mes Combobox sont tels que je vous ai montré ma figure d'aperçu.
mon problème c'est au niveau de la programmation du bouton d'ajout (le bouton en vert)
Il me faut affecter un code pour ce faire.
Je vous donne le fichier exemplaire pour ce faire
Dans votre module2, le code à changer
Sub LancerFormulaireDeSaisie()
Load frmSaisie
frmSaisie.Show
End SubPour le reste l'userform ne correspond pas à votre vue postée.
Votre fichier est le même que dans le fil https://forum.excel-pratique.com/excel/code-vba-activation-conditionnelle-173908#p1079532 où BrunoM45 vous a donné les codes.
Bonjour Mr DAN.
ne vous fiez pas trop à l'apperçu du Userform. je le modifie coonstamment
mon seul pb c'est de faire exécuter le code que l'on m'avait suggére, au niveau de mon bouton (commandButton) d'Ajout.
j'ai bel et bien recopié le code de Mr Brunno mais en essayant de l'adapter sur mon formulaire alors je n'ai pas pu.
J'ai même essayé de corriger le code de Mr Brunno via vos instructions, mais rien n'a donné.
c'est pourquoi j'ai dû vous montrer l'intégralité de mes travaux à travers ce que j'ai posté.
Je vous en prie, ne me blâmez pas, j'essaye juste d'apprendre.
Soyez indulgent
je vous prie de m'aider
Bonjour,
1. Avez-vous avez corrigé le code dans le module 2 ?.
2. Votre demande
j'ai bel et bien recopié le code de Mr Brunno mais en essayant de l'adapter sur mon formulaire alors je n'ai pas pu.
Sans votre fichier, on joue un peu à la devinette là ...
2.1 Sinon en plus vous devez oubliez ce que je vous ai suggéré dans ce fil et les modifications que vous avez effectuées (désolé mais je n'avais pas vu au départ que vous aviez ouvert une autre fil sur le sujet).
Ensuite reprenez intégralement TOUS les codes de BrunoM45 et modifiez le code Private sub userform_initialize() comme ci-dessous
Private Sub UserForm_Initialize()
' Assignation de la base
Set lstBdD = ThisWorkbook.Sheets("BD").ListObjects("TSanction")
' Initialiser le formulaire
txtDate = Date 'date du jour
End Sub2.2 Dans le code "ajout" cela va planter à ce niveau puisque vous n'avez que 4 textbox au lieu de 6.
Vous devez donc supprimer toute cette boucle
For Ind = 1 To 6
....
Next indet la remplacer par ceci :
.DataBodyRange(Lig, 2) = txtNomEtudiant.Value
.DataBodyRange(Lig, 3) = cboClasse.value
.DataBodyRange(Lig, 4) = cboMotif.value
.DataBodyRange(Lig, 5) = txtSanction.value
.DataBodyRange(Lig, 6) = txtduree.valueJ'ai même essayé de corriger le code de Mr Brunno via vos instructions, mais rien n'a donné.
c'est pourquoi j'ai dû vous montrer l'intégralité de mes travaux à travers ce que j'ai posté.
Cela je l'avais compris. Normal que vous ayez des soucis quand vous postez un fichier X et que vous travaillez sur un fichier Y
Je vous en prie, ne me blâmez pas, j'essaye juste d'apprendre.
Je ne vous blâme pas mais si vous voulez apprendre le mieux est que l'on aille droit au but et de vous expliquer chaque ligne que l'on code. Sans quoi vous tournez en rond.
BONJOUR M. DAN
Je vous remercie infiniment
le code a finalement fonctionné.
je vous suis infiniment reconnaissant et vous m'avez vraiment davantage motivé à poursuivre
