Créer un userform réutilisable

Résolu
Bonjour,

J'ai créer un userform afin qu,il soit plus simple pour les utilisateurs d'entrer des données.
Quand ils entrent les données elles vont se placer dans divers celles de ma feuille de calcul.
à chaque jour il faut entrer les mêmes types de données mais on de doit pas midifier celles de la veille...puis-je toujours utiliser le même?

merci à l'avance
Mélanie

7 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Un userform Excel est conçu pour saisir des données récurrentes et les répartir dans des cellules de feuilles distinctes sans modifier les saisies précédentes. Une solution préconisée consiste à supprimer les TextBox_Change et à n'utiliser que le bouton CmdOK_Click, en assignant TextBox1 à D10, TextBox2 à E10, TextBox3 à D11 sur les feuilles pesées et Tournée. En parallèle, il faut coordonner l'épissage des dates et le calcul des lignes entre les feuilles 'pesées' et 'Tournée' afin que chaque saisie écrive sur la ligne correspondante sans modifier les précédentes.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut mélanie,
    Merci Chris pour la remontée.
    Oui il est possible d'utiliser le même. C'est même fortement recommandé.

    Supposons que sur ton userform, tu disposes de 5 textbox (TextBox1, TextBox2, TextBox3, TextBox4, TextBox5) et d'un bouton de commande (CommandButton1) qui te sert à valider.
    Tu ouvres ton classeur, saisie tes données dans les textbox et clic sur valider.
    Tes données sont transférées, grâce à ton code, en feuille : Feuil2 cellules : de A1 à E1.
    Le lendemain, tu ouvres ton classeur, saisie tes textbox, et, en cliquant sur valider, tu souhaites que tes données soient enregistrées de A2 à E2. Tu ne travailles donc plus sur des adresses de cellules fixes, mais sur les cellules se situant sur la première ligne vide de A à E.
    OK avec ceci?
    Bon alors le code de ce que je viens de décrire serait :
    Private Sub CommandButton1_Click()
    Dim Lign As Long
    
    With Sheets("Feuil2")
        Lign = .Range("A" & Rows.Count).End(xlUp).Row + 1
        .Cells(Lign, 1) = TextBox1
        .Cells(Lign, 2) = TextBox2
        .Cells(Lign, 3) = TextBox3
        .Cells(Lign, 4) = TextBox4
        .Cells(Lign, 5) = TextBox5
    End With
    End Sub

    Code dans lequel on peux intégrer une boucle, pour le cas ou on aurait 26 textbox qui renverraient, dans le bon ordre, leurs donénes dans les 26 1eres colonnes de la feuil2 :
    Private Sub CommandButton1_Click()
    Dim Lign As Long
    Dim Col As Byte
    
    With Sheets("Feuil2")
        Lign = .Range("A" & Rows.Count).End(xlUp).Row + 1
        For Col = 1 To 26 'dans le cas de 26 colonnes!!!!!
            .Cells(Lign, Col) = Me.Controls("TextBox" & Col)
        Next Col
    End With
    End Sub
    1. Bonjour Frank,
      Désolé du délai, dans mon suivi de sujet je ne voyais que j'avais une réponse. alors premièrement un énorme merci! Je commence en VbA et je dois dire qu'à date je semble pas comprendre grand chose et ça m'énerve un peu!!! Alors présentement J'ai ceci

      Private Sub CmdOK_Click()
      Sheets("tournée").Range("D10").Value = TextBox1.Value
      Sheets("Tournée").Range("E10").Value = TextBox2.Value
      Sheets("Tournée").Range("D11").Value = TextBox3.Value
      Sheets("Tournée").Range("E11").Value = TextBox4.Value
      Sheets("pesées").Range("c5").Value = TextBox5.Value
      Sheets("pesées").Range("D5").Value = TextBox6.Value
      Sheets("pesées").Range("e5").Value = TextBox7.Value
      Sheets("pesées").Range("f5").Value = TextBox8.Value
      Sheets("pesées").Range("g5").Value = TextBox9.Value
      Sheets("pesées").Range("h5").Value = TextBox10.Value
      Sheets("pesées").Range("i5").Value = TextBox11.Value
      Sheets("pesées").Range("j5").Value = TextBox12.Value
      Unload Me

      End Sub

      Private Sub TextBox1_Change()
      Sheets("Tournée").Range("D10").Value = TextBox1.Value
      End Sub

      Private Sub TextBox2_Change()
      Sheets("Tournée").Range("E10").Value = TextBox2.Value
      End Sub

      Private Sub TextBox3_Change()
      Sheets("Tournée").Range("D11").Value = TextBox3.Value
      End Sub

      Private Sub TextBox4_Change()
      Sheets("Tournée").Range("E11").Value = TextBox4.Value
      End Sub

      Private Sub TextBox5_Change()
      Sheets("pesées").Range("c5").Value = TextBox5.Value
      End Sub

      Private Sub TextBox6_Change()
      Sheets("pesées").Range("D5").Value = TextBox6.Value
      End Sub

      Private Sub TextBox7_Change()
      Sheets("pesées").Range("e5").Value = TextBox7.Value
      End Sub

      Private Sub TextBox8_Change()
      Sheets("pesées").Range("f5").Value = TextBox8.Value
      End Sub

      Private Sub TextBox9_Change()
      Sheets("pesées").Range("g5").Value = TextBox9.Value
      End Sub
      Private Sub TextBox10_Change()
      Sheets("pesées").Range("h5").Value = TextBox10.Value
      End Sub

      Private Sub TextBox11_Change()
      Sheets("pesées").Range("i5").Value = TextBox11.Value
      End Sub

      Private Sub TextBox12_Change()
      Sheets("pesées").Range("j5").Value = TextBox12.Value
      End Sub
      Private Sub CmdAnnuler_Click()
      Unload Me
      End Sub;

      Si je comprends bien j'enlève tout ça?!
      1. Modérateur
        Bonjour,
        Que veux tu exactement?
        Dans ton code, je vois deux procédures différentes :
        1- les "textbox_change" => envoient pendant la saisie, en direct live, les infos saisies dans les textbox, dans les cellules, au fur et à mesure de la saisie.
        2- le "CmdOK_Click" => envoie les données saisies dans les textbox au clic sur le bouton.
        Je pense donc :
        - que tu dois supprimer tous les TextBox_Change
        - que tu dois adapter le code de ton bouton de commande.
        Pour l'instant ne conserve que :
        Private Sub CmdOK_Click() 
        Sheets("tournée").Range("D10").Value = TextBox1.Value 
        Sheets("Tournée").Range("E10").Value = TextBox2.Value 
        Sheets("Tournée").Range("D11").Value = TextBox3.Value 
        Sheets("Tournée").Range("E11").Value = TextBox4.Value 
        Sheets("pesées").Range("c5").Value = TextBox5.Value 
        Sheets("pesées").Range("D5").Value = TextBox6.Value 
        Sheets("pesées").Range("e5").Value = TextBox7.Value 
        Sheets("pesées").Range("f5").Value = TextBox8.Value 
        Sheets("pesées").Range("g5").Value = TextBox9.Value 
        Sheets("pesées").Range("h5").Value = TextBox10.Value 
        Sheets("pesées").Range("i5").Value = TextBox11.Value 
        Sheets("pesées").Range("j5").Value = TextBox12.Value 
        Unload Me 
        End Sub 
        
        Private Sub CmdAnnuler_Click() 
        Unload Me 
        End Sub


        Ensuite, explique toi...
        1ère utilisation : TextBox1 dans D10, TextBox2 dans E10, TextBox3 dans D11 etc...
        2ème utilisation : ???
        3ème utilisation : ???
      2. Bonjour,
        ça c'est super ça fonctionne. maintenant je veux prendre le même user form et la fois suivante que les données se mettent comme suit :

        Sheets("tournée").Range("F10").Value = TextBox1.Value
        Sheets("Tournée").Range("G10").Value = TextBox2.Value
        Sheets("Tournée").Range("F11").Value = TextBox3.Value
        Sheets("Tournée").Range("G11").Value = TextBox4.Value
        Sheets("pesées").Range("c8").Value = TextBox5.Value
        Sheets("pesées").Range("D8").Value = TextBox6.Value
        Sheets("pesées").Range("e8").Value = TextBox7.Value
        Sheets("pesées").Range("f8").Value = TextBox8.Value
        Sheets("pesées").Range("g8").Value = TextBox9.Value
        Sheets("pesées").Range("h8").Value = TextBox10.Value
        Sheets("pesées").Range("i8").Value = TextBox11.Value
        Sheets("pesées").Range("j8").Value = TextBox12.Value
        et ainsi de suite...
        un énorme merci d'avance! j'étais en train de désepérer!
        Mélanie
      3. Modérateur
        1- Sheets("pesées") tu passes de la ligne 5 à la ligne 8? Est ce normal? Qui aura t'il entre la 1ere utilisation et la 2nde dans les lignes 6 et 7?
        2- Sheets("Tournée") tu ajoutes des données en colonne, toujours lignes 10 & 11?
      4. Salut,

        1- oui je saute 2 ligne car entre deux il y a des calculs.
        2- oui
      5. Modérateur
        pour le 1- tu me confirmes que les lignes 6 et 7 seront remplies AVANT la 2nde utilisation de l'userform?
    2. Modérateur
      Re-
      Alors ton code complet devient :
      Private Sub CmdOK_Click() 
      Dim Col As Byte, Lign As Long
      
      With Sheets("tournée")
          Col = .Cells(10, .Cells.Columns.Count).End(xlToLeft).Column
          .Cells(10, Col + 1) = TextBox1
          .Cells(10, Col + 2) = TextBox2
          .Cells(11, Col + 1) = TextBox3
          .Cells(11, Col + 2) = TextBox4
      End With
      With Sheets("pesées")
          Lign = .Range("C" & Rows.Count).End(xlUp).Row
          .Cells(Lign + 1, 3) = TextBox5.Value 
          .Cells(Lign + 1, 4) = TextBox6.Value 
          .Cells(Lign + 1, 5) = TextBox7.Value 
          .Cells(Lign + 1, 6) = TextBox8.Value 
          .Cells(Lign + 1, 7) = TextBox9.Value 
          .Cells(Lign + 1, 8) = TextBox10.Value 
          .Cells(Lign + 1, 9) = TextBox11.Value 
          .Cells(Lign + 1, 10) = TextBox12.Value
      End With
      Unload Me 
      End Sub 
      Private Sub CmdAnnuler_Click() 
      Unload Me 
      End Sub

      Testes et reviens nous dire...
      1. Bonjour

        ça ne fonctionne pas... Cela peut-il être parce que dans la feuille tournée je ne commence à mettrre des infos pour la première fois à la ligne 10 et que dans la feuille pesées je ne commence qu'à la ligne 5?

        merci
        Mélanie
        1. il ne se passe rien, les données ne s'inscrivent ni à mesure ni à la fermeture de mon usf
        2. Modérateur
          ET POURTANT CE CODE FONCTIONNE!!!!! Faut :
          - saisir les données
          - cliquer sur le bouton "OK"!!!!!

          il ne se passe rien, les données ne s'inscrivent ni à mesure ni à la fermeture de mon usf Non pas au fur et à mesure, rappelle toi on a supprimé cette option... Ni à la fermeture, tu as des boutons OK et annuler! Les actions ne se font qu'au clic sur ces boutons!!!
          feuille pesées je ne commence qu'à la ligne 5 j'ai donc ajouté cette ligne pour le test :
          If Lign < 5 Then Lign = 4
        3. Bonjour.
          Toujours rien ne se passe... et pourtant je clique sur le bouton ok.
          je dois bien mettre ce code dans le usf?
          merci encore
          Mélanie
        4. Modérateur
          As tu cliqué sur le lien que je t'ai mis dans ma dernière réponse et essayé avec le classeur que je t'ai transmis par ce biais???????????
        5. Bonjour

          oui j'ai essayé et rien ne se passe.... voici le lien de mon fichier...

          http://www.cijoint.fr/cjlink.php?file=cj201110/cijXd3Xw9n.xls

          merci beaucoup de m'aider
          Mélanie
      2. Modérateur
        Bonjour,
        Dernière tentative...
        Donne moi une copie du classeur définitif, sur lequel je pourrais travailler...
        1. Bonjour,

          http://www.cijoint.fr/cjlink.php?file=cj201110/cijVufCCzb.xls

          merci beaucoup de ta patience
          Mélanie
          1. Modérateur
            T'inquiète, c'est un peu aussi de ma faute...

            Essaye ce fichier : http://www.cijoint.fr/cjlink.php?file=cj201110/cijcTZmCya.xls
          2. Tu es Génial!!!! :)C'est merveilleux!!!!!! un ÉNORME merci
            Tu fais ma journée !!!!!!
            Mélanie
          3. Modérateur
            Non suis pas génial...
            C'est merveilleux, je n'irais pas jusque là...
            De rien..
            A+
          4. chacun son opinion! T'as été tellement patient! :)