Microsoft 365 Formulaire de saisie VBA

samissou

XLDnaute Nouveau
Bonjour
Quelqu'un pourrait il m'aider afin de mettre les procédures sur chaque bouton de mon user form afin d'alimenter ma base de données ?
Merci 😀
 

Pièces jointes

  • formulaire saisie VBA TEST 2 MAJ.xlsm
    32 KB · Affichages: 6
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonsoir
tu travaille avec un tableau structuré
oublie!! les méthodes range classique
VB:
Private Sub btnajout_Click()
    With Range("Tableau1").ListObject.ListRows.Add.Range
        .Value = Array(textcommercial.Value, textdepartement, DateValue(TextDate), cbodepartement, cboventes, textcommentaires)
    End With
End Sub
@+;)
 

patricktoulon

XLDnaute Barbatruc
re
Comme ça vite fait :exemple
VB:
Private Sub btnajout_Click()
    Dim critereplein
    If Not IsDate(TextDate) Then MsgBox "date invalideou non renseignée": Exit Sub    'on arrête si y a pas de date ou si elle est pas valide

    'ou on teste tout
    critereplein = textcommercial.Value <> "" And textdepartement.Value <> "" And TextDate <> "" And _
                   cbodepartement <> "" And cboventes <> "" And textcommentaires <> ""

    'on sort si une des données n'est pas remplie
    If Not critereplein Then MsgBox "vous avez oublié de renseigner  des input!!!tete à claque!!": Exit Sub

    With Range("Tableau1").ListObject.ListRows.Add.Range

        .Value = Array(textcommercial.Value, textdepartement, DateValue(TextDate), cbodepartement, cboventes, textcommentaires)

    End With

End Sub
 

GALOUGALOU

XLDnaute Accro
bonsoir le forum, salutations à toi patrick
re samissou
un petit commentaire sur ce que j'ai constaté.
j'ai constaté dans le classeur de samissou une incohérence entre le nom des textboxs dans les codes et les noms dans le formulaire
exemple
textcommercial dans le code mais txtcommercial dans le formulaire
idem pou vente
cboventes (avec s ) dans le code mais cbovente (sans s)dans le formulaire.

le code que patricktoulon vous a fourni est basé sur ce qui était visible dans votre code. il est très performant en l'état et correspond bien à votre problématique (présence d'un tableau structuré), mais pour celà il va falloir harmoniser le formulaire et les codes, donc corriger les noms de vos textbox et combobox dans le formulaire pour inclure le code de patricktoulon tel quel. (car en l'état cela ne fonctionnera pas)
cdt
galougalou
 

samissou

XLDnaute Nouveau
merci de votre retour effectivement il y avait des erreurs ...
Du coup, j'en ai profité pour mettre à jour certains boutons, je n'ai pas réussi à utiliser le code de @patricktoulon , trop complexe pour moi je pense

Mais j'ai réussi à créer des procédures qui ont l'air de fonctionner pour certains de mes boutons .
Sauf pour les boutons "envoyer et "modifier"

pour le bouton "modifier " : je souhaiterais pouvoir revenir sur les formulaires déjà saisies le cas ou si besoin d'apporter des modifs

pour le bouton "envoyer" ; je souhaiterais, lorsque le formulaire a été saisi, que l'on puisse le transmettre par mail , sous la forme formulaire
encore merci pour tout
 

Pièces jointes

  • formulaire saisie VBA TEST 2 MAJ.xlsm
    32.2 KB · Affichages: 10

GALOUGALOU

XLDnaute Accro
bonjour le fil
re samissou
je vous ai implémenté le code de patricktoulon, c'est quand même la meilleure solution de code avec un tableau structuré
Pour la modification, le code proposé est à ma sauce. La difficulté rencontrée vient du fait qu'il faut choisir une référence pour la modification. la normalité aurait voulu que la colonne B de la feuille SOURCE BDD contienne des références uniques, ce qui aurait permis le choix d'une combobox pour sélectionner l'item, mais dans le doute j'ai fait référence à la ligne sélectionnée par un clic gauche dans le tableau. (le clic en colonne B ouvre directement le formulaire)

Mon choix,(mais il n'est pas exhaustif).
pour modifier des données
il faut choisir une ligne de modifications dans la feuille source bdd, ensuite clic dans le bouton dans la feuille. le formulaire sera renseigné
VB:
Private Sub UserForm_Initialize()
Dim ligne As Integer
ligne = ActiveCell.Row
txtcommercial.Value = Cells(ligne, 2)
 txtdepartement = Cells(ligne, 3)
 txtdate = Cells(ligne, 4)
cbodeplacement = Cells(ligne, 5)
cbovente = Cells(ligne, 6)
 txtcommentaires = Cells(ligne, 7)
End Sub
le code identifie la ligne sélectionnée, et après modification dans le formulaire, la modification sera effective dans le formulaire après avoir appuyé sur le bouton modification.
le code
VB:
Private Sub btnmodifier_Click()
   Dim rg As Range, ligne&
    With ActiveSheet.ListObjects("Tableau1")
        If .Active Then ligne = ActiveCell.Row - .Range.Row
    End With
    Set rg = ActiveSheet.ListObjects("Tableau1").DataBodyRange
    If ligne > 0 Then
        rg(ligne, 1).Value = txtcommercial.Value
        rg(ligne, 2).Value = txtdepartement
        rg(ligne, 3) = DateValue(txtdate)
        rg(ligne, 4) = cbodeplacement
        rg(ligne, 5) = cbovente
        rg(ligne, 6) = txtcommentaires
    End If
    Unload Me
  
End Sub

Pour ajouter des données
sur la feuille tableau de bord, le bouton ouvre le formulaire après avoir sélectionnée la cellule A1 de la feuille active, pour éviter d'interférer avec le choix modification

C'est un début de solution qui ne prend pas en compte les erreurs éventuelles d'interférence entre modification et ajout.

à lire vos codes, j'ai l'impression que le vba ne vous est pas trop familier aussi, pour envoyer le classeur par mail je vous conseille cette lecture
cdt
galougalou
 

Pièces jointes

  • Copie de Copie de formulaire saisie VBA TEST 3MAJ v2.xlsm
    37.5 KB · Affichages: 15
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour @GALOUGALOU
beep!!!!!!!!!
là je non ne suis pas d'accords ;) c'est pas pour moi la bonne méthode

part du principe que quand tu travaille sur une BDD(tableau structuré), la BDD à 95% des cas n'est pas la feuille active (sinon ca servirait a quoi d'avoir un interface(form))


With ActiveSheet.ListObjects("Tableau1")
If .Active Then ligne = ActiveCell.Row - .Range.Row
End With
Set rg = ActiveSheet.ListObjects("Tableau1").DataBodyRange




avec (with range("Tableau1").listobject)
' le tableau sera toujours bien ciblé ou que tu sois dans le classeur
'parce que des names("Tableau1") il ne peut y en avoir qu'un!!


et pas toute les configs incluent la ligne quand on écrit en dessous le TS !!!!

tiens pour un aide memo
VB:
Sub ajouteuneligne()
    With Range("tableau1").ListObject
        Set ligne = .ListRows.Add.Range'on ajoute une ligne au TS

        txt = " Index de ligne dans le tableau :  " & .ListRows.Count & vbCrLf

        txt = txt & "index de la new ligne correspondant dans la feuille :  " & ligne.Row & vbCrLf

        txt = txt & "address(range) de la new ligne correspondant dans la feuille :  " & ligne.Address & vbCrLf

        txt = txt & " le range du tableau  avec son entete :  " & .Range.Address & vbCrLf
     
        txt = txt & " le datablody du tableau : " & .DataBodyRange.Address

    End With
    MsgBox txt

End Sub

1645871824778.png


là tu es sur de ce que fait ;) et tu peux être n'importe ou dans le classeur

pour l'index de ligne eventuellement en modification avec listbox ou combobox dans l'interface(form)
et bien c'est simple

Code:
With Range("Tableau1").ListObject.DataBodyRange

    Set ligne = .Rows(listbox1.ListIndex + 1)

    MsgBox ligne.Address
'parti de là  tu remplie tes donnée comme tu veux dans cette range

End With
;)
 
Dernière édition:

samissou

XLDnaute Nouveau
re
Bonjour @GALOUGALOU
beep!!!!!!!!!
là je non ne suis pas d'accords ;) c'est pas pour moi la bonne méthode

part du principe que quand tu travaille sur une BDD(tableau structuré), la BDD à 95% des cas n'est pas la feuille active (sinon ca servirait a quoi d'avoir un interface(form))


With ActiveSheet.ListObjects("Tableau1")
If .Active Then ligne = ActiveCell.Row - .Range.Row
End With
Set rg = ActiveSheet.ListObjects("Tableau1").DataBodyRange




avec (with range("Tableau1").listobject)
' le tableau sera toujours bien ciblé ou que tu sois dans le classeur
'parce que des names("Tableau1") il ne peut y en avoir qu'un!!


et pas toute les configs incluent la ligne quand on écrit en dessous le TS !!!!

tiens pour un aide memo
VB:
Sub ajouteuneligne()
    With Range("tableau1").ListObject
        Set ligne = .ListRows.Add.Range'on ajoute une ligne au TS

        txt = " Index de ligne dans le tableau :  " & .ListRows.Count & vbCrLf

        txt = txt & "index de la new ligne correspondant dans la feuille :  " & ligne.Row & vbCrLf

        txt = txt & "address(range) de la new ligne correspondant dans la feuille :  " & ligne.Address & vbCrLf

        txt = txt & " le range du tableau  avec son entete :  " & .Range.Address & vbCrLf
    
        txt = txt & " le datablody du tableau : " & .DataBodyRange.Address

    End With
    MsgBox txt

End Sub

Regarde la pièce jointe 1132021

là tu es sur de ce que fait ;) et tu peux être n'importe ou dans le classeur

pour l'index de ligne eventuellement en modification avec listbox ou combobox dans l'interface(form)
et bien c'est simple

Code:
With Range("Tableau1").ListObject.DataBodyRange

    Set ligne = .Rows(listbox1.ListIndex + 1)

    MsgBox ligne.Address
'parti de là  tu remplie tes donnée comme tu veux dans cette range

End With
;)
Vous m'avez perdu la... déjà que j'ai du mal avec les codes 😔
 

patricktoulon

XLDnaute Barbatruc
Bonjour @samissou

peut être devrais tu commencer par les bases alors
car je soupçonne que cette interface va évoluer
et là nous en somme qu'au balbutiement

mes précédent message s'adressaient a @GALOUGALOU qui sait de quoi je parle
bien que tu peux en prendre note toi aussi

pour ton bouton ajouter c'est simple tu ajoute cela et ca fonctionne
VB:
Private Sub btnajout_Click()
    Dim critereplein

    'ou on teste tout
    critereplein = txtcommercial.Value <> "" And txtdepartement.Value <> "" And txtdate <> "" And _
                   cbodeplacement <> "" And cbovente <> "" And txtcommentaires <> ""

  
    'on sort si une des données n'est pas remplie
    If Not critereplein Then MsgBox "vous avez oublié de renseigner  des input!!!  tete à claque!!": Exit Sub

    If Not IsDate(txtdate) Then MsgBox "date invalide ou non renseignée": Exit Sub    'on arrête si y a pas de date ou si elle est pas valide
 
 With Range("Tableau1").ListObject.ListRows.Add.Range

        .Value = Array(txtcommercial.Value, txtdepartement, DateValue(txtdate), cbodeplacement, cbovente, txtcommentaires)

    End With

End Sub

et avant que je t'aide pour la recherche (qui soit dit en passant n'est pas très claire dans l'intention et le contexte)puisque tu nous en a rien dit
il faudra que tu soit capable de m'expliquer tant bien que mal ce que le code du bouton ajout fait
sinon ca voudrait dire faire le travail a ta place et il y a rien de plus qui me Grrrrrr!!!;)

ca tombe bien c'est le weekend
un peu de lecture
 

samissou

XLDnaute Nouveau
Bonjour @samissou

peut être devrais tu commencer par les bases alors
car je soupçonne que cette interface va évoluer
et là nous en somme qu'au balbutiement

mes précédent message s'adressaient a @GALOUGALOU qui sait de quoi je parle
bien que tu peux en prendre note toi aussi

pour ton bouton ajouter c'est simple tu ajoute cela et ca fonctionne
VB:
Private Sub btnajout_Click()
    Dim critereplein

    'ou on teste tout
    critereplein = txtcommercial.Value <> "" And txtdepartement.Value <> "" And txtdate <> "" And _
                   cbodeplacement <> "" And cbovente <> "" And txtcommentaires <> ""

 
    'on sort si une des données n'est pas remplie
    If Not critereplein Then MsgBox "vous avez oublié de renseigner  des input!!!  tete à claque!!": Exit Sub

    If Not IsDate(txtdate) Then MsgBox "date invalide ou non renseignée": Exit Sub    'on arrête si y a pas de date ou si elle est pas valide
 
 With Range("Tableau1").ListObject.ListRows.Add.Range

        .Value = Array(txtcommercial.Value, txtdepartement, DateValue(txtdate), cbodeplacement, cbovente, txtcommentaires)

    End With

End Sub

et avant que je t'aide pour la recherche (qui soit dit en passant n'est pas très claire dans l'intention et le contexte)puisque tu nous en a rien dit
il faudra que tu soit capable de m'expliquer tant bien que mal ce que le code du bouton ajout fait
sinon ca voudrait dire faire le travail a ta place et il y a rien de plus qui me Grrrrrr!!!;)

ca tombe bien c'est le weekend
un peu de lecture
Bonjour
Je ne demandais pas de faire le travail à ma place mais bien que l'on m'explique les différents processus...
je suis novice sur les VBA. Je demandais juste de l'aide pour créer tous ces process.
Je vais continuer avec les tutoriels pas grave . Merci
 

Statistiques des forums

Discussions
311 721
Messages
2 081 927
Membres
101 842
dernier inscrit
seb0390