Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Saisie de lignes multiples dans un formulaire

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;

J'aimerai bien avoir vos avis concernant le problème suivant.
Dans un USF, j'aimerais avoir la possibilité d'avoir un contrôle me permettant de saisir plusieurs valeurs, en considérant que chaque valeur sera à terme destinée a être ajoutée dans un tableau structuré.

1 valeur = 1 nouvelle ligne de tableau.

En fait il s'agit de pouvoir saisir plusieurs valeurs à la suite comme par exemple :
- Toto
- Titi
- Tutu
Sachant que chaque "ligne ou valeur" doit créer une nouvelle ligne dans un tableau structuré, grâce à une procédure VBA.

J'ai pensé à une TextBox multi-ligne, mais je ne suis pas sûr que cela soit la meilleur solution.
En fait le nombre de lignes possible est inconnu, sana pour autant excéder un maximum de 10.
j'aimerai bien pouvoir avoir un champ (Contrôle) sur mon formulaire permettant la saisie.

Auriez-vous des idées pour résoudre mon problème?
Je vous remercie d'avance pour votre aide, et vous souhaite une bonne journée.
A+
 

jurassic pork

XLDnaute Occasionnel
Hello,
En plus compliqué, je te propose une ListBox avec un menu contextuel qui permet d'ajouter ou supprimer des éléments dans la ListBox. L'ajout d'éléments se fait par une InputBox.
Quand on a rentré tous les éléments on clique sur un bouton pour ajouter les éléments au tableau structuré
1 - Le code du formulaire :
VB:
Private Const mCONTEXT_MENU_NAME = "myRightClickListbox"
Private m_clsContextMenu As CContextMenu

Private Sub CommandButton1_Click()
 'code pour ajout dans tableau structuré
End Sub

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 2 Then
Application.CommandBars(mCONTEXT_MENU_NAME).ShowPopup
End If
End Sub

Private Sub UserForm_Initialize()
' remove any previous instance
On Error Resume Next
Application.CommandBars(mCONTEXT_MENU_NAME).Delete
On Error GoTo 0
Set m_clsContextMenu = New CContextMenu
With CommandBars.Add(mCONTEXT_MENU_NAME, Position:=msoBarPopup)
.Controls.Add(Type:=msoControlButton).Caption = "Ajouter élément"
With .Controls.Add(Type:=msoControlButton)
.Caption = "Supprimer élément"
.BeginGroup = True
End With
Set m_clsContextMenu.ContextMenu_Add = .Controls(1)
Set m_clsContextMenu.ContextMenu_Remove = .Controls(2)
Set m_clsContextMenu.LBox = Me.ListBox1
End With
'ListBox1.List = Array(1, 2, 3, 4, 5, 6, 7, 8)
End Sub

Private Sub UserForm_Terminate()
Application.CommandBars(mCONTEXT_MENU_NAME).Delete
End Sub
2 - Le code du Module de classe CContextMenu pour gérer le menu contextuel de la ListBox :
VB:
Public LBox As MSForms.ListBox
Public WithEvents ContextMenu_Add As CommandBarButton
Public WithEvents ContextMenu_Remove As CommandBarButton

Private Sub ContextMenu_Add_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Dim elem
elem = InputBox("Entrez votre élément :", "Ajouter élément", , _
                UserForm2.Left / 0.75 * 15, _
               (UserForm2.Top + UserForm2.Height) / 0.75 * 15)
If elem <> "" Then LBox.AddItem elem
End Sub
Private Sub ContextMenu_Remove_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
If LBox.ListIndex >= 0 Then
LBox.RemoveItem LBox.ListIndex
End If
End Sub


Ami calmant, J.P
 

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
Et merci à vous deux pour vos solutions.
@job75 : J'avais pensé aussi à ce genre de solution. Étant dans une approche de "simili formation" je vais pencher vers la solution de @jurassic pork . Mais je vous remercie pour votre attention.

@jurassic pork : Maintenant je vais décortiquer ce code et voir comment l'utiliser.
Merci à toi.
Bonne journée à toutes et tous.
 

jeff1494

XLDnaute Occasionnel
Bonjour @patricktoulon
Je vais en effet continuer de regarder la solution de @jurassic pork car cela me donne l'occasion de voir des choses que je ne connais pas, mais je crois que comme tu le dis Patrick cela devient beaucoup plus compliqué pour mon faible niveau.
Néanmoins je vais garder cela sous le coude et voir comment cela fonctionne dans le détail plus tard. J'aurais bien le moyen d'utiliser cette solution un jour ou un autre.
Je vais regarder comment faire fonctionner exactement la textbox multiligne, car cela serait la première fois que je l'utilise. Comment passe-t-on d'une ligne à l'autre, avec la touche "Entrée", et dans ce cas il me faudra isoler ce "Entrée" pour isoler chaque élément.
Bref encore un apprentissage pour mon profit.
Avec quelques années peut-être finirais-je par maitriser un peu Excel.

Bonne journée à toutes et tous.
 

patricktoulon

XLDnaute Barbatruc
re
@jurassic pork ben tu a l'events deja implémenté de la listbox non ?
et le ".onAction" tu le dirige vers une simple sub dans un module
et encore peut être même comme on peut diriger le ".onAction" vers un module thisworkbook qui est je le rappelle un module classe avant tout

peut être même qu' il soit possible que si je titille un peu mon clavier vite fait je bricole un truc pour tout garder dans le userform mais là je suppute car me semble t il j'avais déjà essayé

en tout cas une chose est sur à 100% on a pas besoins de classe pour gérer les events des boutons du menu ,on peut envoyer le onAction vers un module standard ou le thisworkbook(dans une sub public)

la gestion par classe des controls de menu dynamique (commandbarpopup) n'est utile que lorsque l'on est dans un parent application toute autres situations on dirige vers un module standard ou le thisworkbook
 

job75

XLDnaute Barbatruc
Je ne vois vraiment pas l'intérêt de compliquer les choses, testez ceci :
VB:
Sub Ajout_lignes()
Dim e, a(), n, lig&
Do
    e = Application.InputBox("Nom " & n + 1 & " :", "Ajout lignes")
    If e = False Then Exit Do
    ReDim Preserve a(n)
    a(n) = e
    n = n + 1
Loop
With [Tableau1] 'tableau structuré
    lig = .Rows.Count - (.Rows.Count > 1 Or .Cells(1) <> "")
    If n Then .Cells(lig, 1).Resize(n) = Application.Transpose(a)
End With
End Sub
 

Pièces jointes

  • Ajout lignes.xlsm
    17.4 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
je plussoie @job75 car je suis assez d'accords avec lui
cela dit pour @jurassic pork et surtout pour jeff qui visiblement découvre


le code dans le userform
VB:
Private Sub ListBox1_Mouseup(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'le menu est généré au click droite dans la listebox
    ' et est supprimé immediatement au momment ou il disparait
    If Button = 2 Then 'si bouton droite
        Set bar = CommandBars.Add("menuf", msoBarPopup, , True)

        With bar.Controls.Add(msoControlButton)
            .Caption = "Ajouter"
            .OnAction = "Ajouter"
          End With

        With bar.Controls.Add(msoControlButton)
            .Caption = "Suprimer"
            .OnAction = "supprim"
         End With

        bar.ShowPopup
        CommandBars("menuf").Delete
    End If
End Sub
le code dans le module
VB:
Option Explicit
 Sub Ajouter()
    UserForm1.ListBox1.AddItem InputBox("vous avez appuyé sur " & CommandBars.ActionControl.Caption & " pour ajouter", "ajouter")
End Sub


 Sub supprim()
    Dim index, i
    With UserForm1.ListBox1
        index = .ListIndex
        MsgBox "vous avez appuyé sur " & CommandBars.ActionControl.Caption & "pour supprimer " & .List(index)
        .RemoveItem (i)
    End With
End Sub

voila ca fonctionne très bien sans module classe
 

jeff1494

XLDnaute Occasionnel
Merci à vous deux pour ces explications.
@patricktoulon : Un grand merci pour tes explications documentées. J'ai soudainement l'impression d'être un peu plus intelligent, car j'ai compris ce que tu as fait.
Voilà qui va me permettre de passer un bon week-end.

@job75 : Grâce à ton code j'ai compris ce qu'il est possible de faire. Un grand merci à vous trois d'avoir pris le temps pour m'expliquer tout cela.
Je vous souhaite un bon week-end.
A+
 

patricktoulon

XLDnaute Barbatruc
re
tiens ça c'est pour @jurassic pork
TOUT DANS LE USERFORM
VB:
'menu contextuel avec le onAction redirigigé dans des pseudo events dans le  userform
'Auteur @jurassic pork
'remastered  par @patricktoulon(sub classing intra userform)

Option Explicit

Public WithEvents ContextMenu_Add As CommandBarButton
Public WithEvents ContextMenu_Remove As CommandBarButton
Public LeMe As Object
Const twips = 15
'event bouton ajouter
Private Sub ContextMenu_Add_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    Dim elem
    elem = InputBox("Entrez votre élément :", "Ajouter élément", , _
                     LeMe.Left / 0.75 * twips, _
                     (LeMe.Top + LeMe.Height) / 0.75 * twips)
    If elem <> "" Then LeMe.ListBox1.AddItem elem
End Sub

'Events bouton supprimer
Private Sub ContextMenu_Remove_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    With LeMe.ListBox1
        If .ListIndex >= 0 Then .RemoveItem .ListIndex
    End With
End Sub

Private Sub ListBox1_Mouseup(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'le menu est généré au click droite dans la listebox
    ' et est supprimé immediatement au momment ou il disparait
    Dim Bar
    If Button = 2 Then 'si bouton droite
        Set Bar = CommandBars.Add("menuf", msoBarPopup, , True)

        'creation bouton dans menu
        With Bar.Controls.Add(msoControlButton): .Caption = "Ajouter": End With
        With Bar.Controls.Add(msoControlButton): .Caption = "Suprimer": End With

        'classemment intra classe userform
        With UserForm1
            Set .ContextMenu_Add = Bar.Controls(1)
            Set .ContextMenu_Remove = Bar.Controls(2)
            Set LeMe = Me
        End With

        Bar.ShowPopup
        CommandBars("menuf").Delete
    End If
    Exit Sub
    CommandBars("menuf").Delete
    On Error GoTo 0
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir jeff1494 , à tous les autres ,

Une autre façon de voir les choses en faisant de la saisie au km. Voir l'exemple joint.

Pour l'exemple, j'ai choisi de saisir des nombres à virgule ou non, positifs ou non
  • Le séparateur décimal est soit le point (plus pratique avec le clavier numérique) ou bien la virgule.
  • on peut mettre des séparateurs 'espace' dans les nombres (partie entière ou décimal)
  • Quand un nombre est saisi, tapez sur la touche entrée pour saisir le suivant, une nouvelle ligne sera créée
  • Pour validez toutes les saisies, cliquez sur un des boutons avec une coche verte.
On affiche la liste des nombres valides et insérés ainsi que la liste des saisies incorrectes ou des nombres en doublon.

Le code reste simple. De toute manière je sais pas écrire du code complexe. Il est commenté.
 

Pièces jointes

  • jeff1494-USF-Saisie.xlsm
    34.7 KB · Affichages: 10
Dernière édition:

Discussions similaires

Réponses
3
Affichages
556
Réponses
49
Affichages
957
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…