Saisie automatique de champs userform depuis Inputbox

Évidemment, car l'utilisateur ne peut partir du TextBoxDate que si la date est valide.

Et si c'est vide, ce ne sera pas valide donc. En fait c'est fait justement pour éviter à devoir afficher un message.

Et la validation ne sera pas effective. Notamment si la date n'est pas valide.

Par contre si tu veux juste afficher un message si la date est vide. Tu peux faire

if Textbox8date = "" then MsgBox("Date obligatoire à renseigner",vbCritical,"ATTENTION")

Edit: A placer juste après le Private Sub Valider_click()

Comme toutes entrées à contrôler afin que si tout est bon, le programme peut se poursuivre. Prévoir un Exit sub sinon.

Private Sub Valider_click()
if TextBox8Date = "" then exit sub
'Eventuellement autres vérifications sur d'autres Contrôles
'Sinon la copie du bordereau peut être réalisée
Worksheets("Bordereau").Copy After:=Sheets(Sheets.Count)
etc...

Merci pour cette solution, j'ai voulu appliquer plusisurs champs indispensables pour la saisie mais je ne m'en sors pas. Il m'affiche bien le message d'erreur si la date et le moyen d'expédition ne sont pas renseignés et une fois que je clique sur OK et que je renseigne ces 2 champs, même si j'essaie de valider ça ne quitte plus ma UserForm...

Private Sub Valider_click()
If Me.TextBox_Date.Value = "" Then
MsgBox ("Renseignez une date d'expédition svp.")
End If
If Me.ComboBox_Type_expédition.Value = "" Then
MsgBox ("Renseignez le moyen d'expédition svp.")
End If
Exit Sub
Worksheets("Bordereau").Copy After:=Sheets(Sheets.Count)

With ActiveSheet
.Range("M4") = TextBox_NumBordereau
.Range("D17") = ComboBox1

For k = 17 To 23
If k > 17 Then .Range("D" & k) = Controls("TextBox_" & k - 6)
.Range("L" & k) = Controls("TextBox_" & k - 16)
Next k
.Range("B29") = ComboBox_Type_expédition
.Range("J29") = TextBox_Date
.Range("J35") = TextBox_Remarque
For n = 45 To 53 Step 2
p = p + 1
If Controls("ComboBox_PS" & p) = "" Then Exit For
.Range("B" & n) = Controls("ComboBox_PS" & p)
.Range("D" & n) = Controls("Designation_materiel_" & p)
.Range("L" & n) = Controls("N°serie_" & p)
.Range("O" & n) = Controls("Quantite_" & p)
Next n
.Shapes("FER").OLEFormat.Object.Value = CheckBox_FER.Value
.Shapes("RA").OLEFormat.Object.Value = CheckBox_Rapport.Value
.Shapes("AUTRE").OLEFormat.Object.Value = CheckBox_Autre.Value
.Range("G36") = TextBox_Autre
.Range("B58") = TextBox_Motif
.Range("E66") = ComboBox_Emballage
.Range("E67") = TextBox_DimensionsL
.Range("F67") = TextBox_DimensionsP
.Range("G67") = TextBox_DimensionsH
.Range("E68") = TextBox_Poids
.Name = Range("M4")
End With
Sheets("Index").Select
'Report sur Index plus insertion de lignes
With Sheets("Index")
Range("A4").Select
Rows("4:" & 2 + p).EntireRow.Insert
Rows("4:" & 2 + p).RowHeight = 25
Rows("4:" & 2 + p).Font.Size = 12
Range("A4:H" & 2 + p).Font.Name = "Arial Rounded MT Bold"
Range("G4:H" & 2 + p).Interior.Color = RGB(166, 166, 166)
'InsLig (p - 1)
For m = 45 To 53 Step 2
q = q + 1: Lig = 3 + q
If Controls("ComboBox_PS" & q) = "" Then Exit For
.Range("A" & Lig) = TextBox_NumBordereau
.Range("B" & Lig) = ComboBox1
.Range("C" & Lig) = Controls("ComboBox_PS" & q)
.Range("D" & Lig) = Controls("Designation_materiel_" & q)
.Range("E" & Lig) = Controls("N°serie_" & q)
.Range("F" & Lig) = TextBox_Date
Next m
End With
Sheets("Compteur").Range("A1") = Sheets("Compteur").Range("A1") + 1
Unload Me

Sheets("Index").Select
Call Msg_Impression
End Sub

Je fais donc encore appel à vous svp. Désolé pour ce dérangement mais j'apprends en même temps.

J-Baptiste

Bonjour toutes et tous

coucou XCellus

@JeanBaptiste

à voir

Edit: je supprime (pour ne pas se mélanger les pinceaux)

Bonsoir Andre13, merci pour votre proposition.

Malheureusement si je ne renseigne pas ces 2 champs et que aux 2 messages d'erreur je réponds OK, la UserForm se ferme et je reviens sur ma page "Index" comme si le code continuait d'être exécuté. Je ne vois pas d'où peut provenir le problème.

J-Baptiste

Je reviens,

Dans mon dernier message que tu n'as pas du lire entièrement. Il faut mettre un Exit sub afin de quitter la procédure de validation.

Afin de pouvoir revenir sur le textboxdate afin de le remplir

Edit: Hello André13,

Le but étant de ne pouvoir continuer que si la date est présente.

Re,

Exact XCellus j'ai oublié le Exit Sub t en plus il était grrr

Oui, en effet. Une fois que la date est renseignée. J'espère que l'utilisateur la renseignera comme une date valide.

Sinon il faudra recadrer avec un code supplémentaire.

Donc tant que la date est vide il ne pourra pas valider.

Ainsi

If TextBox_Date = "" Then rep = MsgBox("Date vide ", vbCritical, "Attention"): Exit Sub

Suite,

Par contre pose toi la question. Quels sont les entrées qui ne doivent pas être vides absolument.

Je suppose que ce n'est pas seulement ces deux informations de date et de type.

Avance dans cette question et avec le code proposé.

De toute façon il faudra appliquer un code plus global pour cela.

Edit: je reviendrais en fin de soirée si possible ou demain. Voir avec André13 pour l'instant.

Re,

@XCellus merci, Donc, si je comprend bien en admettant que la textbox et la combobox si non rempli cela doit donner ce code-ci:

Private Sub Valider_click()
If TextBox_Date = "" Then rep = MsgBox("Renseignez une date d'expédition svp.", vbCritical, "Attention"): Exit Sub

If ComboBox_Type_expédition.Value = "" Then rep = MsgBox("Renseignez le moyen d'expédition svp.", vbCritical, "Attention"):Exit Sub

Worksheets("Bordereau").Copy After:=Sheets(Sheets.Count)

With ActiveSheet
.Range("M4") = TextBox_NumBordereau
.Range("D17") = ComboBox1

For k = 17 To 23
If k > 17 Then .Range("D" & k) = Controls("TextBox_" & k - 6)
.Range("L" & k) = Controls("TextBox_" & k - 16)
Next k
.Range("B29") = ComboBox_Type_expédition
.Range("J29") = TextBox_Date
.Range("J35") = TextBox_Remarque
For n = 45 To 53 Step 2
p = p + 1
If Controls("ComboBox_PS" & p) = "" Then Exit For
.Range("B" & n) = Controls("ComboBox_PS" & p)
.Range("D" & n) = Controls("Designation_materiel_" & p)
.Range("L" & n) = Controls("N°serie_" & p)
.Range("O" & n) = Controls("Quantite_" & p)
Next n
.Shapes("FER").OLEFormat.Object.Value = CheckBox_FER.Value
.Shapes("RA").OLEFormat.Object.Value = CheckBox_Rapport.Value
.Shapes("AUTRE").OLEFormat.Object.Value = CheckBox_Autre.Value
.Range("G36") = TextBox_Autre
.Range("B58") = TextBox_Motif
.Range("E66") = ComboBox_Emballage
.Range("E67") = TextBox_DimensionsL
.Range("F67") = TextBox_DimensionsP
.Range("G67") = TextBox_DimensionsH
.Range("E68") = TextBox_Poids
.Name = Range("M4")
End With
Sheets("Index").Select
'Report sur Index plus insertion de lignes
With Sheets("Index")
Range("A4").Select
Rows("4:" & 2 + p).EntireRow.Insert
Rows("4:" & 2 + p).RowHeight = 25
Rows("4:" & 2 + p).Font.Size = 12
Range("A4:H" & 2 + p).Font.Name = "Arial Rounded MT Bold"
Range("G4:H" & 2 + p).Interior.Color = RGB(166, 166, 166)
'InsLig (p - 1)
For m = 45 To 53 Step 2
q = q + 1: Lig = 3 + q
If Controls("ComboBox_PS" & q) = "" Then Exit For
.Range("A" & Lig) = TextBox_NumBordereau
.Range("B" & Lig) = ComboBox1
.Range("C" & Lig) = Controls("ComboBox_PS" & q)
.Range("D" & Lig) = Controls("Designation_materiel_" & q)
.Range("E" & Lig) = Controls("N°serie_" & q)
.Range("F" & Lig) = TextBox_Date
Next m
End With
Sheets("Compteur").Range("A1") = Sheets("Compteur").Range("A1") + 1
Unload Me

Sheets("Index").Select
Call Msg_Impression
End Sub

Exact, même s'il est possible de réduire avec un if... or qui cible les deux contrôles en même temps.

Mais tout dépend du nombre de contrôles qui ne doivent pas rester vides?

Car cela va influencer le code à proposer.

Mais en testant ceci pour le moment c'est ok. Si le premier ou le deuxième est vide, voire les deux, la sortie de validation est OK.

Bonsoir XCellus et Andre13,

Merci à vous ce code fonctionne à merveille ! Effectivement j'ai d'autres champs à saisie obligatoire mais je vois comment faire maintenant alors je vais me débrouiller !

Par contre, j'ai une autre question, j'ai essayé de chercher sur les forums mais je n'ai pas trouvé de réponse à cette question.

J'ai une Userform qui récupère des données dans une feuille Excel. Lorsque je sélectionne un destinataire dans la liste tout se passe bien mais si j'efface le champ Société les champs situés en dessous se remplissent automatiquement du nom donné dans "Caption". Comment éviter cela si vous avez une solution?

Encore un grand merci à vous, mon projet prends forme.

J-Baptiste

annotation 2020 11 15 213614 annotation 2020 11 15 213658
Private Sub ComboBox1_Change()
    lgn = ComboBox1.ListIndex + 2
    With Sheets("Destinataires")
        For j = 2 To 7
            Controls("TextBox_" & 10 + j) = .Cells(lgn, j)

        Next j
    End With
End Sub

Private Sub UserForm_initialize()
    mat = Range("Z5")
    Range("Z5") = ""
    With Sheets("Matricules")
        Ln = .Range("A:A").Find(mat, lookat:=xlWhole).Row
        For j = 1 To 7
            Controls("TextBox_" & j) = .Cells(Ln, j + 1).Value
        Next j
    End With
    With Sheets("Destinataires")
        ComboBox1.List = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row).Value
    End With
    With Sheets("Compteur")
    TextBox_NumBordereau.Value = Right(Year(Date), 2) & "-PARIS-" & Format(.Range("A1"), "000")
    End With
End Sub

A nouveau,

Avec les images je vois le souci. Il faut lorsque ton combo est vide, effacer aussi les autres contrôles.

Ce n'est que lorsqu'il y a une info dans le combo que la boucle peut remplir ensuite les TextBox.

Donc comme ci-dessous.

Private Sub ComboBox1_Change()
    lgn = ComboBox1.ListIndex + 2
    With Sheets("Destinataires")
        For j = 2 To 7
            If ComboBox1 > "" Then Controls("TextBox_" & 10 + j) = .Cells(lgn, j) Else Controls("TextBox_" & 10 + j) = ""
        Next j
    End With
End Sub

Bon(d), je retourne voir James.

A nouveau XCellus,

J'ai essayé ce code et tout fonctionne parfaitement ! Je vais poursuivre mon projet et je reviendrai vers vous si je rencontre un souci.

Merci beaucoup en tous cas, bonne fin de soirée.

J-Baptiste

Bonsoir à tout le forum,

Je me permets de revenir vers vous car j''ai une nouvelle question. Comment à partir de ce code, je pourrais générer une Msgbox si jamais le résultat n'est pas obtenu ?

Sub Recherche_Bordereau()
Dim Réponse As String
On Error Resume Next
  Réponse = InputBox("Saisir le numéro du bordereau à consulter svp.", "Recherche d'un bordereau")
Sheets(Réponse).Activate
End Sub

Je souhaiterais obtenir le message d'erreur ci-dessous tout en laissant la saisie visible dans l'inputbox pour que l'opérateur puisse identifier son erreur si cela est possible ?:

MsgBox "Votre bordereau n'est pas connu de la base de données, vérifiez la saisie.", 16

A nouveau, un grand merci à celles et ceux qui participent m'apportent leur aide :)

Bonne soirée

J-Baptiste

Bonjour toutes et tous

@ tester

Sub Recherche_Bordereau()
Dim Réponse As String
On Error Resume Next ' facultatif
Réponse = InputBox("Saisir le numéro du bordereau à consulter svp.", "Recherche d'un bordereau")
If reponse = "" Then
            MsgBox "Votre bordereau n'est pas connu de la base de données, vérifiez la saisie.", 16

Else
Sheets(Réponse).Activate
End If

Bonsoir Andre13,

C'est parfait, ça fonctionne très bien, merci beaucoup !

Bonne soirée

J-Baptiste

re,

De rien également bonne fin de soirée,

crdlt,

André

Bonjour à Andre13 et XCellus,

Je me permets de revenir vers vous pour un petit problème sur un saisie dans un combobox. XCellus avait répondu à ma problématique dimanche dernier en laissant vierges les champs situé sous "Société" si le champ "Société" était vide. Ça fonctionne très bien. Par contre mon problème aujourd'hui c'est que si je saisie une société qui n'existe pas dans la feuille "Destinataires", les champs situés sous "Société" recopient leur "caption" donc cela m'oblige à effacer les champs un par un avant de les remplir. Est-ce que le code ci-dessous peut-être adapté?

68702 5fb19235923d3166559855
Private Sub ComboBox1_Change()
    lgn = ComboBox1.ListIndex + 2
    With Sheets("Destinataires")
        For j = 2 To 7
            If ComboBox1 > "" Then Controls("TextBox_" & 10 + j) = .Cells(lgn, j) Else Controls("TextBox_" & 10 + j) = ""
        Next j
    End With
End Sub

Merci aux personnes qui auront une solution à proposer :)

J-Baptiste

Bonjour JeanBaptisteP,

Tu peux modifier le code précédent proposé par celui en dessous.

Private Sub ComboBox1_Change()
    lgn = ComboBox1.ListIndex + 2
    With Sheets("Destinataires")
        For j = 2 To 7
            If ComboBox1 > "" Then Controls("TextBox_" & 10 + j) = .Cells(lgn, j) Else Controls("TextBox_" & 10 + j) = ""
        Next j
        If Controls("TextBox_12") = "Correspondant:" Then
        For k = 2 To 7
        Controls("TextBox_" & 10 + k) = ""
        Next k
        End If
    End With
End Sub

Bonsoir XCellus,

Merci pour ce retour ça fonctionne bien! Par contre autre question qui ne pourra sans doute pas être resolue:

Lorsque je saisie le nom d'une société, certains caractères sont en majuscules et d'autres en minuscules, y a t-il moyen de corriger cela ? Par exemple de tout mettre en majuscules pour le textbox "Société" ?

Encore un grand merci XCellus pour votre aide!

J-Baptiste

Rechercher des sujets similaires à "saisie automatique champs userform inputbox"