Aide formulaire de saisie VBA

Hello la team Excel-Pratique :)

J'essaie d'apprendre Excel petit à petit car il s'agit d'un véritable outil magique.

Par ailleurs, j'ai besoin de votre aide concernant un petit projet que j'ai qui me permettrait par la suite de me faciliter la vie.

Contexte : j'ai créé un bouton avec lequel j'ai affecté une macro me permettant d'ouvrir un formulaire et ainsi grâce aux éléments indiqués remplirait différentes feuilles Excel en fonction du mois.

J'ai réussi sur toute la première étape mais je suis bloqué au niveau de la saisie des informations afin que celles-ci puissent apparaitre dans la bonne feuille.

Egalement je suis bloqué sur mon bouton de recherche en fonction du N° de facture.

PS: j'espère ne pas avoir fait n'importe quoi sur ma première étape et j'accepte toute modification sur celle-ci :)

Je vous joins mon fichier Excel.

Pour finir, je remercie tous les membres qui se pencheront sur ma demande, vous serez incroyables.

Belle journée à toutes et à tous,

Bonjour et bienvenue,

Merci d'ajouter votre version excel dans le profil de votre compte (2019, 2016, MAC 2016...). C'est plus facile pour celui qui vous répond


Pour votre userform, un premier point est de supprimer les rowssource que vous avez définies pour les combobox et qui provoquent parfois des soucis avec VBA. Il faut toujours préférer les méthodes ADDITEM ou LIST.

Modifiez déjà ceci :

1. Supprimez les 2 rowssources définies pour les combo
2. Collez ce code dans l'USF

Private Sub UserForm_Initialize()
ComboBox1.List = Worksheets("Index").ListObjects("TCAffaires").ListColumns(2).DataBodyRange.Value
ComboBox2.List = Worksheets("Index").ListObjects("TCAnalytiques").ListColumns(2).DataBodyRange.Value
End Sub

3. Le code pour Effacer

Private Sub CommandButton1_Click()
Dim i As Byte

For i = 1 To 5
    Controls("Textbox" & i) = vbNullString
Next i
ComboBox1 = vbNullString
ComboBox2 = vbNullString
End Sub

Pour la suite, vos tableaux mentionnent un numéro en colonne A et B. Vous pouvez expliquer la règle à ce sujet ?
Je suppose 23 pour l'année puis le mois et le chiffre en colonne B c'est séquentielle ?

Pourquoi ne pas faire une seul feuille plutot que de splitter tout par mois ?

Cordialement

Edit : tant qu'à faire, pourquoi ne pas passer en tableaux au format structuré comme vous l'avez fait avec la feuille Index ?

Hello Dan,

Merci beaucoup pour les corrections apportées ça me touche énormément :)

Pour les colonnes A et B ils varient en fonction des mois effectivement.

Cela indique l'année/mois/numéro de suivi séquentielle qui sont ensuite retranscrits sur chaque factures.

Cela a été fait sur plusieurs onglets car celles-ci sont exportées au cabinet comptable qui exploite feuille par feuille afin de réaliser des analyses.

Le fait que cela soit sur plusieurs feuilles complique la tâche ou peut-être peut créer des soucis avec VBA ?

Le plus dur pour moi est l'ajout des éléments du formulaire dans mes différentes feuilles Excel.

Encore merci à vous pour votre aide,

Cordialement,

jemimplique75

re

Pour les colonnes A et B ils varient en fonction des mois effectivement.

Ok mais à quoi sert le B devant ?

Cela a été fait sur plusieurs onglets car celles-ci sont exportées au cabinet comptable qui exploite feuille par feuille afin de réaliser des analyses.

Le fait que cela soit sur plusieurs feuilles complique la tâche ou peut-être peut créer des soucis avec VBA ?

Cela ne gêne pas mais c'est juste que faire une base de données unique est plus simple. Ensuite pour trouver les données par mois il suffit d'utiliser les filtres disponibles.
Mais on peut toujours laisser comme cela si vous préférez.

Par contre vous ne me dites rien sur le fait de faire un tableau au format structuré de chaque mois. D'ailleurs l'idéal serait aussi de nommer la colonne B plutôt que de fusionner A1 et B1. Les fusions c'est une mauvaise habitude et avec VBA c'est à éviter si veut ne pas avoir des problèmes.

Rem : merci de ne pas remettre pas chaque fois votre fichier, j'ai celui de travail et vous donnerai ce qui est à modifier. De plus, on évite d'alourdir le forum inutilement

Re Dan,

B correspond à l'initial de l'entreprise car ce fichier existe en plusieurs fois avec d'autres entités.

Effectivement j'ai enlevé la fusion entre A1 et B1avec l'indication "numéro séquentiel" merci pour ce détail.

Pas de problème j'éviterai par la suite d'ajouter le fichier en PJ.

Bien cordialement,

jemimplique75

Bonsoir à tous

Je me permet d'ajouter une proposition :

image

- Ajouter un combobox avec le nom des différentes entreprises

- Ajouter un combobox pour les noms des fournisseurs

- Ajouter une listbox pour visualiser les données

Mr Dan a raison, au lieu de créer une page pour chaque mois, il faut tout mettre dans une seule page, et filtrer par mois, par année, par fournisseur, par entreprises....

Concernant les exigences du cabinet comptable, on pourra exporter sous Excel le résultat des tris.

Dans l'attente de votre retour.

Cordialement

Re

Effectivement j'ai enlevé la fusion entre A1 et B1avec l'indication "numéro séquentiel"

Qu'avez vous en A1 et en B1 ?

B correspond à l'initial de l'entreprise car ce fichier existe en plusieurs fois avec d'autres entités.

Comment au travers de votre USF on va savoir quelle initiale prendre ?

J'ai préparé votre fichier ce matin en considérant notamment les tableaux au format structuré mais reste à savoir ce que vous voulez au sujet les feuilles mois.

@Isri : je ne pense pas qu'il faille compliquer la demande en remettant une listbox. A moins que cela intéresse le demandeur.

Crdlt

Bonjour Dan, bonjour Isri,

Merci pour vos retours concernant ma demande

Isri, ton formulaire à l'air très bien mais j'ai malheureusement pas les compétences pour tout ça, je vais commencer sur une bonne petite base et par la suite améliorer tout ça tout en apprenant.

Dan, j'ai défusionné les cellules et j'ai donc en A1 "N° Enregistr." et B1 "Numéro séquentiel"

Effectivement pour une question de lecture il serait plus simple de tout répertorier sur une seule feuille et par la suite faire un tri avec des segments par exemple.

C'est vous les experts :)

Encore merci pour votre aide et bon début de semaine,

Cordialement

Dan, j'ai défusionné les cellules et j'ai donc en A1 "N° Enregistr." et B1 "Numéro séquentiel"

Ok je modifie comme cela
De votre coté vous devez mettre votre tableau au format structuré comme vous avez fait pour la feuille INDEX.

Reste la question du choix de votre fournisseur mentionné B.
- ne vous faut-il pas une liste ?
- comment fonctionne le numéro séquentiel ? par rapport au fournisseur, à l'année ou au mois ?
Afin de comprendre, donnez un exemple si vous avez un fournisseur A et B

Crdlt

Quand tu parles d'une liste c'est-à-dire une liste de fournisseurs répertoriée sur Index ?

Le numéro séquentiel correspond à un nombre attribué pour chaque facture au mois de façon croissant.

Exemple sur une facture il sera indiqué : B23.08.04 = 4ème facture enregistrée sur le mois d'août 2023 sous l'entité B.

Je suis un peu perdu sur comment organiser les informations mensuellement sur une seule feuille

re

Ok vous n'avez pas compris toute la question

- Comment on connait l'entité concernée ? C'est toujours B ou pas ? Si ce n'est pas le cas comment le code doit-il le savoir ?
- Pour la progression vous me donnez avec cet exemple pour aout --> B23-08-04 (évitez les points dans le noms) :

Mettons que l'on est en septembre et première facture --> cela donnera B23-09-05 ou B23-09-01 ? L'idéal étant de continuer toujours la numérotation car le cas échéant cela risque de vos poser souci.
Si vous recommencez chaque mois à 1, je vous suggère de plutôt consacrer une seule colonne à la numérotation avec le numéro B23-08-04, ....., B23-09-01, B23-09-02

Re Dan,

Concernant l'entité oui il s'agit toujours de B et pour chaque mois oui la numérotation redémarre à 1.

D'accord donc je vais faire une seule colonne comprenant la numérotation A1

Comme cela ?

image

Merci à toi,

Cordialement

Bonjour

Dans votre fichier il faut créer une nouvelle feuille et mettre le tableau au format structuré (comme vous avez fait pour TCAffaires)

- Nom de la feuille que j'ai créée : "Facturation"
- Tableau structuré nommé --> "TCFacture"
Cela donne ceci actuellement

presse papier02

Questions :
1. coté Userform ; dans votre dernier fichier vous avez rajouté une textbon N°facture. Que voulez-vous avoir dans cette textbox ?
Je suppose qu'elle ne va servir que pour la recherche ?

2. je suppose que la textbox nomfournisseur n'a rien avoir avec le numéro du fournisseur placé dans la colonne N° enregistrement (je parle du B que vous utilisez depuis le début)

Parfait ! j'ai bien créé la feuille "Facturation" avec le tableau structuré.

1. Oui, c'est bien ça uniquement pour la recherche.

2. Oui, cela n'a rien avoir avec le numéro d'enregistrement.

Dans l'attente de ton retour,

1. La colonne I contient le numéro de facture. Comment complétez vous à ce t endroit ?

2. Est-ce que la date mentionnée en colonne 2 (date de facture) est toujours celle qui correspond à la date mentionnée sur la facture ou à celle du jour où vous complétez le tableau. Exemple : vous complétez le tableau au mois de septembre pour une facture réalisée au mois d'août ?
du coup, quel doit être le numéro séquentiel ? B-23-08-x ou B23-09-x ?
En gros soit on se fie à la date du jour où vous complétez le tableau ou à la date mentionnée en textbox1

1. Très bonne question il me faut un textbox pour ça. Pensez-vous que je peux utiliser le même textbox5 (N° de facture pour ça) ?

2. La date mentionnée en colonne 2 correspond toujours à la date de la facture.

C'est-à-dire que si je complète une facture du mois de novembre celle-ci devrait apparaitre dans la suite du chrono B23-09-x peu importe la date de saisie

Cordialement

1. Très bonne question il me faut un textbox pour ça. Pensez-vous que je peux utiliser le même textbox5 (N° de facture pour ça) ?

Oui bien sûr.

2. ... C'est-à-dire que si je complète une facture du mois de novembre celle-ci devrait apparaitre dans la suite du chrono B23-09-x peu importe la date de saisie

heu 09 ou 11 ?
si 09, pourquoi ?


Edit : entre-temps vous pouvez déjà rajouter ceci dans votre Userform. Ce code permettra de vérifier que vous avez bien rempli la date dans la textbox1 au format jj/mm/aaaa

Private Sub TextBox1_AfterUpdate()
If Len(TextBox1.Value) <> 10 Then MsgBox "Mettre date au format jj/mm/aaaa", vbCritical, "Format de date incorrect": Exit Sub
    If Not IsDate(TextBox1.Value) Then
        MsgBox "La date est incorrecte", vbCritical, "Probleme date": Exit Sub
    End If
End Sub

Super ! ce textbox me permettra de faire la recherche et de saisir le numéro de facture.

2. Désolé c'est bien 11 et pas 09

Ok je vais entrer ça dans mon Userform.

Merci et au plaisir de te lire

Re,
1. Tout en haut de votre USF (donc à la première ligne !!), mettez ceci

Option Explicit
Dim i As Byte

2. Dans votre USF, ajoutez ce code pour incrémenter le numéro d'enregistrement en fonction de la date de la textbox1 (donc date de facture)

Private Sub incrementer()
Dim c As Range
Dim prem As String

i = 1
With Worksheets("FACTURATION").ListObjects(1).ListColumns(2).DataBodyRange
    Set c = .Find(Month(CDate(TextBox1.Value)), LookIn:=xlValues)
        If Not c Is Nothing Then
            prem = c.Address
            Do
                If Month(TextBox1.Value) = Month(c) And Year(TextBox1.Value) = Year(c) Then i = i + 1
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And prem <> c.Address
        End If
    End With
End Sub

3. Dans votre USF, mettez ce code pour ajouter vos données dans la feuille que j'ai nommé Facturation

Private Sub CommandButton2_Click()
Dim lig As Integer

If ComboBox1.ListIndex = -1 Then MsgBox "Tyep d'affaire manquant": Exit Sub
If ComboBox2.ListIndex = -1 Then MsgBox "Code analytique manquant": Exit Sub

With Worksheets("FACTURATION").ListObjects(1)
    If .ListRows.Count = 0 Then
        .ListRows.Add: lig = 1
    Else: .ListRows.Add: lig = .ListRows.Count 'insérer à la dernière ligne

    End If
    Call demasquer
    Call incrementer

    With .DataBodyRange
        .Item(lig, 1) = "B-" & Right(Year(TextBox1.Value), 2) & "-" & Format(Month(TextBox1.Value), "00") & "-" & i
        .Item(lig, 2) = TextBox1.Value 'Date
        .Item(lig, 3) = TextBox2.Value 'nom fournisseur
        .Item(lig, 4) = ComboBox1.Value 'affaire
        .Item(lig, 5) = CDbl(TextBox3.Value) ' Montant HT
        .Item(lig, 6) = CDbl(TextBox4.Value) 'Montant TTC
        .Item(lig, 7) = ComboBox2.Value 'code analytique
        .Item(lig, 8) = TextBox5.Value 'num facture
    End With
End With
End Sub

4. Dans le module 2 (ou le 1 si vous voulez), ajoutez ce code

Sub demasquer()
With Sheets("FACTURATION")
    If Not .ListObjects(1).AutoFilter Is Nothing Then
        On Error Resume Next
        .ShowAllData
        On Error GoTo 0
    Else: .ListObjects(1).Range.AutoFilter
    End If
    .Cells.EntireRow.Hidden = False
End With
End Sub

Faites un test

NB :
- si vous voulez changer le nom de la feuille Facturation que j'ai choisi, vous pouvez le faire mais veuillez à le changer dans les 3 codes.
- Les feuilles nommées chaque mois, ne servent plus.

J'ai entré les codes et ça fonctionne.

Je vais faire des tests plus en détail et essayer de comprendre petit à petit.

Un grand merci à toi pour ton temps, rapidité de réponse et tes réponses bien précises !

Rechercher des sujets similaires à "aide formulaire saisie vba"