Demande d'aide remplissage via formulaire

mezvin

XLDnaute Nouveau
Bonjour,

J'ai besoin de réaliser un fichier de type Lexique.
Il s'agit d'un fichier simple.

Ce fichier devra avoir un formulaire de saisie avec 3 champs de texte :

- Abréviation
- Correspondance
- Catégorie

Qui remplirons 3 colonnes associées triées sur la première colonne.

L'idée est de pouvoir faire saisir des abréviations par des utilisateurs lambda via ce formulaire ayant 3 champs de saisie.

Les deux premiers champs sont des champs de saisies. Le 3ème champ "Catégorie" devra être un champ de type liste permettant de sélectionner les valeurs de catégories présentes dans la liste (en excluant les doublons bien sur).

Merci de votre aide
 

Pièces jointes

  • Lexique.xlsx
    9.7 KB · Affichages: 41

Lone-wolf

XLDnaute Barbatruc
Re : Demande d'aide remplissage via formulaire

Bonsoir mezvin

rempli la colonne D avec les catégories correspondantes, ensuite enregistre le fichier soit en .xls, soit .xlsm. Le fichier que tu as mis ne prend pas en charge les macros. La combobox (ou liste déroulante) ensuite sera sans doublons.
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Demande d'aide remplissage via formulaire

Bonsoir Mezvin, bonsoir le forum,

En pièce jointe ton fichier modifié avec un bouton Saisie de Données qui lance une UserForm.

Le code commenté de l'UserForm :

Code:
Option Explicit 'oblige à déclarer toutes les variables
Private A As Worksheet 'déclare la variable A (onglet Acronymes)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Long 'déclare la variable I (Incrément)

Set A = Sheets("Acronymes") 'définit l'onglet A
TV = A.Range("B4").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    If TV(I, 3) <> "" Then D(TV(I, 3)) = "" 'si la donnée ligne I colonne 3 de TV n'est pas vide, alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec les éléments du dictionnaire D sans doublon
End Sub

Private Sub CommandButton1_Click() 'bouton "Valider"
Dim I As Byte 'déclare la variable I
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Dim LI As Long 'déclare la variable LI (LIgne)

'********************************************
'oblige à renseigner les deux premiers champs
'********************************************
For I = 1 To 2 'boucle sur les deux TextBoxes
    If Me.Controls("TextBox" & I).Value = "" Then 'condition si la TextBox est vide
        MsgBox "Vous devez renseigner le champ " & Chr(34) & Me.Controls("L" & "TextBox" & I).Caption & Chr(34) & " !" 'message
        Me.Controls("TextBox" & I).SetFocus 'place le curseur dans la TextBox
        Exit Sub 'sort de la procédure
    End If 'fin de la condition
Next I 'prochaine TextBox de la boucle

'************************
'message de non catégorie
'************************
If Me.ComboBox1.Value = "" Then 'condition : si la ComboBox1 est vide
    'si "Non" au message, sort de la procédure, si "Oui" au message va à l'étiquette "suite"
    If MsgBox("Cet acronyme n'aura pas de catégorie ! Voulez-vous continuer ?", vbYesNo, "ATTENTION") = vbNo Then Exit Sub Else GoTo suite
End If 'fin de la condition

'**************************************
'Autorisation de rajouter une catégorie
'**************************************
If Me.ComboBox1.ListIndex = -1 Then 'condition : si la valeur éditée dans la Combobox1 ne fait pas partie des éléments de cette Combobox1
    'si "Non" au message, efface la valeur de la Combobox1, sort de la procédure
    If MsgBox("Voulez-vous ajouter une catégorie ?", vbYesNo, "ATTENTION") = vbNo Then Me.ComboBox1.Value = "": Exit Sub
End If 'fin de la condition

suite: 'étiquette
'****************************************************************
'renvoie des données de l'userForm dans le tableau  de l'onglet A
'****************************************************************
'définit la ligne de renvoie (4 si B4 est vide, sinon, la première ligne vide de la colonne 2 (=B))
LI = IIf(A.Range("B4").Value = "", 4, A.Cells(Application.Rows.Count, 2).End(xlUp).Row + 1)
For Each CTRL In Me.Controls 'boucle sur tous les contrôles
    'si la propriété [Tag] du Contrôle n'est pas vide, renvoie dans la cellue ligne : LI,
    'colonne : propriété {tag] du contrôle (convertie en byte), la valeur du contrôle
    If CTRL.Tag <> "" Then A.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
Next CTRL 'prochain contrôle de la boucle
Unload Me 'vide et ferme l'UserForm
UserForm1.Show 'affiche l'userForm1 (vierge)
End Sub

Private Sub CommandButton2_Click() 'bouton "Annuler"
Unload Me 'vide et ferme l'UserFOrm
End Sub

[Édition]
Bonsoir Bernard nos posts se sont croisés...


[Édition2]
Bonsoir Lone-Wolf...

 

Pièces jointes

  • Mezvin_v01.xlsm
    24.2 KB · Affichages: 53
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Demande d'aide remplissage via formulaire

Qui peut le plus peut le moins…

Je peut rajouter une recherche intuitive sur la correspondance si ça vous arrange.
Ainsi l'userform permettra aussi de retrouver un acronyme correspondant à un texte s'il existe.
 

mezvin

XLDnaute Nouveau
Re : Demande d'aide remplissage via formulaire

Bonsoir Mezvin, bonsoir le forum,

En pièce jointe ton fichier modifié avec un bouton Saisie de Données qui lance une UserForm.

Le code commenté de l'UserForm :

Code:
Option Explicit 'oblige à déclarer toutes les variables
Private A As Worksheet 'déclare la variable A (onglet Acronymes)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Long 'déclare la variable I (Incrément)

Set A = Sheets("Acronymes") 'définit l'onglet A
TV = A.Range("B4").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    If TV(I, 3) <> "" Then D(TV(I, 3)) = "" 'si la donnée ligne I colonne 3 de TV n'est pas vide, alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec les éléments du dictionnaire D sans doublon
End Sub

Private Sub CommandButton1_Click() 'bouton "Valider"
Dim I As Byte 'déclare la variable I
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Dim LI As Long 'déclare la variable LI (LIgne)

'********************************************
'oblige à renseigner les deux premiers champs
'********************************************
For I = 1 To 2 'boucle sur les deux TextBoxes
    If Me.Controls("TextBox" & I).Value = "" Then 'condition si la TextBox est vide
        MsgBox "Vous devez renseigner le champ " & Chr(34) & Me.Controls("L" & "TextBox" & I).Caption & Chr(34) & " !" 'message
        Me.Controls("TextBox" & I).SetFocus 'place le curseur dans la TextBox
        Exit Sub 'sort de la procédure
    End If 'fin de la condition
Next I 'prochaine TextBox de la boucle

'************************
'message de non catégorie
'************************
If Me.ComboBox1.Value = "" Then 'condition : si la ComboBox1 est vide
    'si "Non" au message, sort de la procédure, si "Oui" au message va à l'étiquette "suite"
    If MsgBox("Cet acronyme n'aura pas de catégorie ! Voulez-vous continuer ?", vbYesNo, "ATTENTION") = vbNo Then Exit Sub Else GoTo suite
End If 'fin de la condition

'**************************************
'Autorisation de rajouter une catégorie
'**************************************
If Me.ComboBox1.ListIndex = -1 Then 'condition : si la valeur éditée dans la Combobox1 ne fait pas partie des éléments de cette Combobox1
    'si "Non" au message, efface la valeur de la Combobox1, sort de la procédure
    If MsgBox("Voulez-vous ajouter une catégorie ?", vbYesNo, "ATTENTION") = vbNo Then Me.ComboBox1.Value = "": Exit Sub
End If 'fin de la condition

suite: 'étiquette
'****************************************************************
'renvoie des données de l'userForm dans le tableau  de l'onglet A
'****************************************************************
'définit la ligne de renvoie (4 si B4 est vide, sinon, la première ligne vide de la colonne 2 (=B))
LI = IIf(A.Range("B4").Value = "", 4, A.Cells(Application.Rows.Count, 2).End(xlUp).Row + 1)
For Each CTRL In Me.Controls 'boucle sur tous les contrôles
    'si la propriété [Tag] du Contrôle n'est pas vide, renvoie dans la cellue ligne : LI,
    'colonne : propriété {tag] du contrôle (convertie en byte), la valeur du contrôle
    If CTRL.Tag <> "" Then A.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
Next CTRL 'prochain contrôle de la boucle
Unload Me 'vide et ferme l'UserForm
UserForm1.Show 'affiche l'userForm1 (vierge)
End Sub

Private Sub CommandButton2_Click() 'bouton "Annuler"
Unload Me 'vide et ferme l'UserFOrm
End Sub

[Édition]
Bonsoir Bernard nos posts se sont croisés...


[Édition2]
Bonsoir Lone-Wolf...


C'est parfait. Merci
 

mezvin

XLDnaute Nouveau
Re : Demande d'aide remplissage via formulaire

Bonsoir Mezvin, bonsoir le forum,

En pièce jointe ton fichier modifié avec un bouton Saisie de Données qui lance une UserForm.

Le code commenté de l'UserForm :

Code:
Option Explicit 'oblige à déclarer toutes les variables
Private A As Worksheet 'déclare la variable A (onglet Acronymes)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Long 'déclare la variable I (Incrément)

Set A = Sheets("Acronymes") 'définit l'onglet A
TV = A.Range("B4").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    If TV(I, 3) <> "" Then D(TV(I, 3)) = "" 'si la donnée ligne I colonne 3 de TV n'est pas vide, alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec les éléments du dictionnaire D sans doublon
End Sub

Private Sub CommandButton1_Click() 'bouton "Valider"
Dim I As Byte 'déclare la variable I
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Dim LI As Long 'déclare la variable LI (LIgne)

'********************************************
'oblige à renseigner les deux premiers champs
'********************************************
For I = 1 To 2 'boucle sur les deux TextBoxes
    If Me.Controls("TextBox" & I).Value = "" Then 'condition si la TextBox est vide
        MsgBox "Vous devez renseigner le champ " & Chr(34) & Me.Controls("L" & "TextBox" & I).Caption & Chr(34) & " !" 'message
        Me.Controls("TextBox" & I).SetFocus 'place le curseur dans la TextBox
        Exit Sub 'sort de la procédure
    End If 'fin de la condition
Next I 'prochaine TextBox de la boucle

'************************
'message de non catégorie
'************************
If Me.ComboBox1.Value = "" Then 'condition : si la ComboBox1 est vide
    'si "Non" au message, sort de la procédure, si "Oui" au message va à l'étiquette "suite"
    If MsgBox("Cet acronyme n'aura pas de catégorie ! Voulez-vous continuer ?", vbYesNo, "ATTENTION") = vbNo Then Exit Sub Else GoTo suite
End If 'fin de la condition

'**************************************
'Autorisation de rajouter une catégorie
'**************************************
If Me.ComboBox1.ListIndex = -1 Then 'condition : si la valeur éditée dans la Combobox1 ne fait pas partie des éléments de cette Combobox1
    'si "Non" au message, efface la valeur de la Combobox1, sort de la procédure
    If MsgBox("Voulez-vous ajouter une catégorie ?", vbYesNo, "ATTENTION") = vbNo Then Me.ComboBox1.Value = "": Exit Sub
End If 'fin de la condition

suite: 'étiquette
'****************************************************************
'renvoie des données de l'userForm dans le tableau  de l'onglet A
'****************************************************************
'définit la ligne de renvoie (4 si B4 est vide, sinon, la première ligne vide de la colonne 2 (=B))
LI = IIf(A.Range("B4").Value = "", 4, A.Cells(Application.Rows.Count, 2).End(xlUp).Row + 1)
For Each CTRL In Me.Controls 'boucle sur tous les contrôles
    'si la propriété [Tag] du Contrôle n'est pas vide, renvoie dans la cellue ligne : LI,
    'colonne : propriété {tag] du contrôle (convertie en byte), la valeur du contrôle
    If CTRL.Tag <> "" Then A.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
Next CTRL 'prochain contrôle de la boucle
Unload Me 'vide et ferme l'UserForm
UserForm1.Show 'affiche l'userForm1 (vierge)
End Sub

Private Sub CommandButton2_Click() 'bouton "Annuler"
Unload Me 'vide et ferme l'UserFOrm
End Sub

[Édition]
Bonsoir Bernard nos posts se sont croisés...


[Édition2]
Bonsoir Lone-Wolf...


Robert,

Que dois-je ajouter dans le code pour qu'un tri sur la colonne B soit fait à l'insertion ?

Merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Demande d'aide remplissage via formulaire

Bonjour le fil, bonjour le forum,

À la fin de la boucle qui renvoie les données de l'UserForm dans le tableau de l'onglet A rajoute cette ligne :

Code:
'tri sur la colonne B (méthode 2003)
A.Range("B4").CurrentRegion.Sort Key1:=A.Range("B4"), Order1:=xlAscending, Header:=xlNo

Pour que tu aies l'endroit plus précisément :

Code:
For Each CTRL In Me.Controls 'boucle sur tous les contrôles
    'si la propriété [Tag] du Contrôle n'est pas vide, renvoie dans la cellue ligne : LI,
    'colonne : propriété {tag] du contrôle (convertie en byte), la valeur du contrôle
    If CTRL.Tag <> "" Then A.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
Next CTRL 'prochain contrôle de la boucle
'tri sur la colonne B (méthode 2003)
A.Range("B4").CurrentRegion.Sort Key1:=A.Range("B4"), Order1:=xlAscending, Header:=xlNo
Unload Me 'vide et ferme l'UserForm
UserForm1.Show 'affiche l'userForm1 (vierge)
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Demande d'aide remplissage via formulaire

Bonjour.
Pareil avec ma solution, avant les CL.Réactualiser mais c'est CL.PlgTablo.Sort Key1:=CL.PlgTablo.Columns("B"), Order1:=xlAscending, Header:=xlNo
Mais c'est inutile pour qu'ils apparaissent classés dans la liste de la ComboBox.
 

mezvin

XLDnaute Nouveau
Re : Demande d'aide remplissage via formulaire

Bonjour le fil, bonjour le forum,

À la fin de la boucle qui renvoie les données de l'UserForm dans le tableau de l'onglet A rajoute cette ligne :

Code:
'tri sur la colonne B (méthode 2003)
A.Range("B4").CurrentRegion.Sort Key1:=A.Range("B4"), Order1:=xlAscending, Header:=xlNo

Pour que tu aies l'endroit plus précisément :

Code:
For Each CTRL In Me.Controls 'boucle sur tous les contrôles
    'si la propriété [Tag] du Contrôle n'est pas vide, renvoie dans la cellue ligne : LI,
    'colonne : propriété {tag] du contrôle (convertie en byte), la valeur du contrôle
    If CTRL.Tag <> "" Then A.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
Next CTRL 'prochain contrôle de la boucle
'tri sur la colonne B (méthode 2003)
A.Range("B4").CurrentRegion.Sort Key1:=A.Range("B4"), Order1:=xlAscending, Header:=xlNo
Unload Me 'vide et ferme l'UserForm
UserForm1.Show 'affiche l'userForm1 (vierge)
End Sub

Je viens de me rendre de quelques manques.

- Il me manque un champ de saisie à la fin du formulaire "Description" de type commentaire de texte (Non obligatoire) qui irait alimenter la colonne E.
- Peux-tu aussi m'indiquer comment déplacer le bouton de saisie ? Je n'y parviens pas. Il est verrouillé ? J'aimerai le positionner sur la feuille "Catégories" et qu'il continue d'insérer sur la feuille "Acronyme".
- Est-il possible de mettre en place un champ de recherche d'une abréviation sur la feuille "Catégorie" qui ira recherche celui-ci dans une feuille où il l'aura trouvé en ne tenant pas compte qu'elle existe aussi dans "Catégorie" ?
- Comment ramener les lignes de la catégorie "Informatique" par exemple dans la feuille "Informatique et filtrées sur cette catégorie et triées sur la première colonne ?

Je t'envoi le fichier pour que tu comprennes de quoi il s'agit. Je pense que tu vas vite comprendre l'idée.
Si question n'hésite pas.

J'espère ne pas abuser. Sinon tu me dis.

Un grand merci
 

Pièces jointes

  • Lexique.xlsm
    62.7 KB · Affichages: 32
  • Lexique.xlsm
    62.7 KB · Affichages: 31
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Demande d'aide remplissage via formulaire

Bonjour.
C'est fait dans ma solution, pourquoi n'en parlez vous pas ?
(Alors que vous m'aviez initialement contacté par MP pour que je m'en occupe. Ne serais-je pas le seul ?…)
 

Pièces jointes

  • CBxLiéesMezvin.xlsm
    124.9 KB · Affichages: 28
Dernière édition:

mezvin

XLDnaute Nouveau
Re : Demande d'aide remplissage via formulaire

Bonjour.
C'est fait dans ma solution, pourquoi n'en parlez vous pas ?
(Alors que vous m'aviez initialement contacté par MP pour que je m'en occupe. Ne serais-je pas le seul ?…)

Bonjour,

Les solutions proposées se sont télescopées et j'ai pris l'une d'entre elles.
Et ne sais pas les implémenter dedans.

J'ai à présent besoin de terminer le fichier en PJ avec ces besoins :

- Il me manque un champ de saisie à la fin du formulaire "Description" de type commentaire de texte (Non obligatoire) qui irait alimenter la colonne E.
- Peux-tu aussi m'indiquer comment déplacer le bouton de saisie ? Je n'y parviens pas. Il est verrouillé ? J'aimerai le positionner sur la feuille "Catégories" et qu'il continue d'insérer sur la feuille "Acronyme".
- Est-il possible de mettre en place un champ de recherche d'une abréviation sur la feuille "Catégorie" qui ira recherche celui-ci dans une feuille où il l'aura trouvé en ne tenant pas compte qu'elle existe aussi dans "Catégorie" ?
- Comment ramener les lignes de la catégorie "Informatique" par exemple dans la feuille "Informatique et filtrées sur cette catégorie et triées sur la première colonne ?

Merci de votre aide
 

Pièces jointes

  • Lexique.xlsm
    62.7 KB · Affichages: 40
  • Lexique.xlsm
    62.7 KB · Affichages: 40

Discussions similaires

Statistiques des forums

Discussions
312 496
Messages
2 088 979
Membres
103 996
dernier inscrit
KB4175