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 !

exercice0

é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 Sub

Malheureusement, 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 Edit

Cordialement


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 LstBdD

par 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 ListObject

Je 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 Then

Mais 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 frmSaisie

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

Bonjour M. DAN.

regardez sur cette image vous verrez les nominations au niveau des champs

exercice0

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 Sub

en 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

27exercice.xlsm (32.86 Ko)

Dans votre module2, le code à changer

Sub LancerFormulaireDeSaisie()
Load frmSaisie
frmSaisie.Show
End Sub

Pour 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 Sub

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

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

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

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

Rechercher des sujets similaires à "gestion formulaire vba"