Saisie automatique de champs userform depuis Inputbox

Bonjour toutes et tous

@JeanBaptiste merci pour le classeur de Gmb merci à lui également pour son travail

je te remets dedans le code , j'ai remis le sien et l'autre userform que tu as fais

pour voir ou cela cloche

en attendant car là, je vais travailler @ bientôt

Bonjour à toutes et tous,

J'ai essayé d'avancer sur mon classeur mais me voilà bloqué donc je fais appel à vous et à vos connaissances !

En fait, je cherche à réaliser une incrémentation automatique du numéro de bordereau dès que je clique sur le bouton jaune "Nouvelle Expédition".

J'ai bien réussi à renseigner les premiers éléments que je souhaite voir figurer dans ce numéro mais c'est la suite qui pose problème.

En fait je voudrais que ce numéro prenne la forme suivante: 20-PARIS-001 avec le nombre "001" extrait de la cellule A1 de la feuille "Compteurs".

Je pensais écrire le code ci-dessous dans la Userform "Nouvelle-Exp" mais cela ne fonctionne pas car dès que je veux la lancer elle ne veut plus s'ouvrir. Je pense que je dois préciser à un endroit que le nombre "001" provient de la feuille "Compteur" mais je ne sais pas où renseigner ça. Si jamais vous avez des propositions je suis preneur :)

TextBox_NumBordereau.Value = " 20-PARIS-" & Sheets ("Compteur").Range("A1"). Mid(Range("A1"), 8)

PS: Par contre si je mets ce code là, la UserForm "Nouvelle_Exp" veut bien s'ouvrir de nouveau...

TextBox_NumBordereau.Value = " 20-PARIS-" 

Essayez si vous le souhaitez de saisir une expédition avec le matricule "A111AA"

Merci à vous

Bonne fin de journée.

J-Baptiste

Bonjour JeanBaptisteP,

Dans la feuille Compteurs placer un 1 pour débuter.

Apparemment ton départ sera la capitale.

Ensuite dans le code de l'Userform modifiez avec

 With Sheets("Compteur")
  TextBox_NumBordereau.Value = " 20-PARIS-" & Format(.Range("A1"), "000")
  End With

Ne pas oublier lors de la validation d'incrémenter le compteur en case A1.

Donc faire Range("A1")=Range("A1")+1.

Edit: Par Sheets("Compteur").Range("A1")=Sheets("Compteur").Range("A1")+1 pour être précis.

Bonsoir XCellus,

Merci pour votre aide ça fonctionne à merveille!

Par contre, j'ai essayé d'ajouter le code pour incrémenter de +1 lors de la validation mais cela ne fonctionne pas, là je ne vois pas trop pourquoi...

Private Sub Valider_click()

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

ActiveSheet.Range("M4") = TextBox_NumBordereau

ActiveSheet.Range("D17") = ComboBox1
ActiveSheet.Range("D18") = TextBox_12
ActiveSheet.Range("D19") = TextBox_13
ActiveSheet.Range("D20") = TextBox_14
ActiveSheet.Range("D21") = TextBox_15
ActiveSheet.Range("D22") = TextBox_16
ActiveSheet.Range("D23") = TextBox_17

ActiveSheet.Range("L17") = TextBox_1
ActiveSheet.Range("L18") = TextBox_2
ActiveSheet.Range("L19") = TextBox_3
ActiveSheet.Range("L20") = TextBox_4
ActiveSheet.Range("L21") = TextBox_5
ActiveSheet.Range("L22") = TextBox_6
ActiveSheet.Range("L23") = TextBox_7

ActiveSheet.Range("B29") = ComboBox_Type_expédition

ActiveSheet.Range("J29") = TextBox_Date

ActiveSheet.Range("J35") = TextBox_Remarque

ActiveSheet.Range("B45") = ComboBox_PS1
ActiveSheet.Range("B47") = ComboBox_PS2
ActiveSheet.Range("B49") = ComboBox_PS3
ActiveSheet.Range("B51") = ComboBox_PS4
ActiveSheet.Range("B53") = ComboBox_PS5

ActiveSheet.Range("D45") = Designation_materiel_1
ActiveSheet.Range("D47") = Designation_materiel_2
ActiveSheet.Range("D49") = Designation_materiel_3
ActiveSheet.Range("D51") = Designation_materiel_4
ActiveSheet.Range("D53") = Designation_materiel_5

ActiveSheet.Range("L45") = N°serie_1
ActiveSheet.Range("L47") = N°serie_2
ActiveSheet.Range("L49") = N°serie_3
ActiveSheet.Range("L51") = N°serie_4
ActiveSheet.Range("L53") = N°serie_5

ActiveSheet.Range("O45") = Quantite_1
ActiveSheet.Range("O47") = Quantite_2
ActiveSheet.Range("O49") = Quantite_3
ActiveSheet.Range("O51") = Quantite_4
ActiveSheet.Range("O53") = Quantite_5

ActiveSheet.Range("B58") = TextBox_Motif

ActiveSheet.Range("E66") = ComboBox_Emballage
ActiveSheet.Range("E67") = TextBox_Dimensions
ActiveSheet.Range("E68") = TextBox_Poids

ActiveSheet.Name = Range("M4")
Sheets("Compteur").Range("A1") = Range("A1") + 1

Unload Me

End Sub

D'ailleurs, je pense que ça doit vous piquer les yeux quand vous voyez cela mais serait-il possible de simplifier ce code ?

Merci à vous !

J-Baptiste

A nouveau,

Revois mon dernier message. J'ai été plus précis en fin et apparemment c'est nécessaire.

Comme tu cibles le Range("A1") mais de la feuille Compteur il faut toujours faire référence à cette feuille.

Et après le = tu as oublié cela.

Oups, effectivement j'avais oublié de rappeler la feuille "compteur" par le =

Merci pour votre aide. Je vais poursuivre mon projet mais je risque de faire appel à vous de temps en temps même.

Bonne soirée

J-Baptiste

A nouveau,

Pour simplifier il serait possible à première vue de créer plusieurs boucles.

Mais il faut vérifier que les contrôles ont été placés de manière incrémentiel.

Ainsi on peut facilement les cibler car les cellules cibles se suivent à l'unité ou maximum d'un écart de 2.

Il faut plus de temps pour le contrôler. Je regarderais demain à la lumière du jour.

Merci pour votre réponse. Même si beaucoup de gens ici ne vont pas trouver ce code optimisé, cela fonctionne pour ce que je souhaite en faire et au vu de mon niveau cela me convient.

Cependant, si vous avez des solutions à proposer je suis preneur :)
Bonne soirée à vous XCellus.

J-Baptiste

Bonjour à tous

Une nouvelle proposition bien que je ne sois pas sûr d'avoir bien compris ce que tu demandes;

16jb-v4.xlsm (132.22 Ko)

Bye !

Bonjour JeanBaptisteP, le Forum,

Comme promis voici en retour la réduction du code de validation.

Private Sub Valider_click()
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
.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
.Range("B58") = TextBox_Motif
.Range("E66") = ComboBox_Emballage
.Range("E67") = TextBox_Dimensions
.Range("E68") = TextBox_Poids
.Name = Range("M4")
End With
Sheets("Compteur").Range("A1") = Sheets("Compteur").Range("A1") + 1
Unload Me
End Sub

Bonjour XCellus,

Je viens d'intégrer votre code à mon projet et cela fonctionne parfaitement, merci à vous !

Si cela ne vous dérange pas, j'ai une autre question. J'aurais aimé que lorsque je clique sur le bouton "VALIDER" dans la UserForm "Nouvelle_Exp, cela vienne recopier une partie des champs dans la feuille "Index". Seulement si j'ai plusieurs matériels à expédier dans un même bordereau, je souhaiterais voir apparaitre chacun de ses matériels dans la feuille "Index". Bien-sûr si nous n'avons saisi que 2 matériels à expédier, il n'y aura que 2 lignes de renseignées dans la feuille "Index".

Pour que cela soit plus compréhensible, je joins mon fichier EXCEL. Consultez la feuille "Index" et "20-PARIS-004". Attention, ce classeur ne tient pas compte des dernières solutions apportées par XCellus, car la dernière version de mon classeur est trop volumineuse pour être postée ici.

Un grand merci à celles et ceux qui pourront m'apporter des solutions !

J-Baptiste

A nouveau,

Je télécharge le dernier fichier et proposerais une fois rassasié...

A bientôt.

Pas de souci XCellus, prenez votre temps !

Juste une petite précision, j'aurais souhaité que sur la feuille "Index" figurent en haut de tableau les derniers matériels expédiés plutôt qu'en bas de tableau au fur et à mesure qu'on alimente cette feuille, est-ce possible avec VBA ? Je pensais utiliser les termes tels que End(xlUp) ou End(xlDown).

Un grand merci à vous XCellus, bon appétit :)

J-Baptiste

A nouveau,

J'ai bien digéré... y compris le code avec ta récente demande.

Donc je te proposes de modifier le code selon ci-dessous.

Private Sub Valider_click()
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
.Range("B58") = TextBox_Motif
.Range("E66") = ComboBox_Emballage
.Range("E67") = TextBox_Dimensions
.Range("E68") = TextBox_Poids
.Name = Range("M4")
End With
Sheets("Index").Select
'Report sur Index et sous-traitance d'insertion de lignes
With Sheets("Index")
Range("A4").Select
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
End Sub

Plus l'ajout de l'insertion de lignes à placer dans un module du classeur

Sub InsLig(p)
For L = 1 To p
Range("A4:F4").Select
Selection.EntireRow.Insert
Range("A4:F4").RowHeight = 15
Range("A4:F4").Font.Size = 11
Range("A3").Select
Next L
End Sub

Ce dernier code est laissé en premier jet. Afin que tu puisses tester. Mais je vais revenir dessus afin de le réduire.

A tantôt.

A nouveau XCellus,

C'est parfait, c'est exactement ce que je recherchais ! Par contre j'aimerais que ça n'impacte pas les hauteurs de lignes sur la feuille "Index" ainsi que le remplissage en couleur des colonnes G & H. C'est possible ou on peut rien faire contre ça?

Encore un grand merci à vous !

J-Baptiste

Suite,

Je viens de simplifier sans passer par l’ajout de module.

Private Sub Valider_click()
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
.Range("B58") = TextBox_Motif
.Range("E66") = ComboBox_Emballage
.Range("E67") = TextBox_Dimensions
.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 = 15
Rows("4:" & 2 + p).Font.Size = 11
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
End Sub

La hauteur de ligne est laissée à 15. Voir RowHeight

Et la police utilisée est de 11. Mais possible de faire plus petit si besoin. Inscrire 10 ou 9 après le = de Font.Size

Super XCellus, je vais tester ça de suite !

Par contre je sèche sur un autre point. J'aurais aimé bloqué la validation de la Userform "Nouvelle_Exp" si quelques champs restent vides comme la date par exemple.

Je pensais écrire ce code mais je ne vois pas trop où la placer dans la chaine...

If Me.TextBox_Date.Value = "" Then
MsgBox "Entrez une date svp"
End If

Auriez-vous une proposition ?

Un grand merci !

J-Baptiste

A nouveau,

Voici le code remodifié en tenant compte de tes remarques.

Private Sub Valider_click()
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
.Range("B58") = TextBox_Motif
.Range("E66") = ComboBox_Emballage
.Range("E67") = TextBox_Dimensions
.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 = 15
Rows("4:" & 2 + p).Font.Size = 11
Range("A4:H" & 2 + p).Font.Name = "Calibri"
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
End Sub

Suite,

Pour la date j'ai créé récemment une vérification de la date dans un textBox.

17textboxdate3.xlsm (42.23 Ko)

Peut être cela te conviendrait?

Clic sur le bouton AppelBoxDate

Merci pour votre proposition XCellus, en fait je cherche à afficher un Msgbox si jamais le champ Textbox8date n'est pas renseigné dans la UserForm "Nouvelle_Exp".

J'ai essayé avec votre fichier mais je n'arrive pas à faire apparaitre ce message.

Merci à vous :)

J-Baptiste

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