IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Alimenter Listbox à partir de textboxs [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Alimenter Listbox à partir de textboxs
    Bonjour,

    J'effectue des saisies dans des textboxs, je voudrais avec un bouton les transférer dans une listbox.

    M'inspirant des certains fichiers et tutoriel, je suis parvenu à faire ceci sur l'userform2, à l'initialisation sa listbox est vide.

    Par contre celui qui me concerne, à l'initialisation sa listbox n'est pas vide (propriété rowsource= bd qui est une plage dynamique nommée).

    Je n'ai pas compris pourquoi, ça fonctionne pour l'un et pas pour l'autre. C'est surement en rapport avec la source de la listbox.

    Si c'est ça, alors quelle serait la bonne solution pour y parvenir.

    En fait, je voudrais rajouter des items à la listbox en utilisant un bouton. Puis avant de fermer l'userform, transférer toute la listbox sur la feuille.

    en vous remerciant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub CmdValider_Click()
        i = UserForm2.ListBox1.ListCount
     
        UserForm2.ListBox1.AddItem
        UserForm2.ListBox1.Column(0, i) = TextBox1
        UserForm2.ListBox1.Column(1, i) = TextBox2
        UserForm2.ListBox1.Column(2, i) = TextBox3
     
        'vider textboxs------------
        For i = 1 To 3
            UserForm2.Controls("textbox" & i) = ""
        Next
     
        UserForm2.TextBox1.SetFocus
     
    End Sub
     
    Private Sub UserForm_Initialize()
    'UserForm2
        With ListBox1
            .ColumnCount = 3
            .ColumnWidths = "50;50;50"
        End With
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub CmdExit_Click()
        Unload Me
    End Sub
     
    Private Sub CmdVersListBox_Click()
        i = UserForm1.ListBox1.ListCount
     
        UserForm1.ListBox1.AddItem
        ListBox1.Column(0, i) = TextBox1
        ListBox1.Column(1, i) = TextBox2
        ListBox1.Column(2, i) = TextBox3
        ListBox1.Column(3, i) = TextBox4
        ListBox1.Column(4, i) = TextBox5
        ListBox1.Column(5, i) = TextBox6
        ListBox1.Column(6, i) = TextBox7
        ListBox1.Column(7, i) = TextBox8
        ListBox1.Column(8, i) = TextBox9
        ListBox1.Column(9, i) = TextBox10
        ListBox1.Column(10, i) = TextBox11
        ListBox1.Column(11, i) = TextBox12
        ListBox1.Column(12, i) = TextBox13
     
        For i = 1 To 13
            Controls("textbox" & i) = ""
        Next
     
        'ListBox1.Selected(ListBox1.ListCount - 1) = True       'selectionner dernière item de la listbox
     
        TextBox3.SetFocus
     
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Cathodique, bonjour le forum,

    Chaque fois que dans ce forum j'ose dire que la propriété [RowSource] d'une ComboBox/ListBox c'est de la m... je me fais reprendre. Il n'empêche que si tu alimentes ta ListBox1 dynamiquement (en effaçant bien sûr sa propriété {RowSource]) avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
    Me.ListBox1.List = Range("BD").Value
    End Sub
    Tu n'auras plus de problème. Seul préjudice, la propriété [ColumnHeads] qui ne fonctionne plus mais tu peux facilement la remplacer par des labels...
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir Thautheme,

    Je te suis très reconnaissant. En effet, pour la propriété ColumnHeads je peux m'en passer.

    C'est vraiment super, ça fait 3 jours que je cherche une solution.

    Pourrais-tu m'orienter pour transférer tous les items de la listbox vers la BD.

    Encore merci, bon week-end.

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir Cathodique, bonsoir le forum,

    Essaie comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub CmdListToXl_Click()    'transfert listbox vers feuille xl
    Dim BD As Object
    Dim PLV As Integer
     
    Set BD = Sheets("bd")
    PLV = BD.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
    For I = 1 To 13
        BD.Cells(PLV, I).Value = Me.Controls("TextBox" & I).Value
    Next I
    Unload Me
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour Thautheme,
    Chaque fois que dans ce forum j'ose dire que la propriété [RowSource] d'une ComboBox/ListBox c'est de la m... je me fais reprendre.
    Je trouve très excessif ce qualificatif pour cette propriété qui est d'une simplicité quant à son utilisation.
    En effet mis à part le chargement d'une liste avec condition, il me semble que cette propriété offre de nombreux avantages et j'aimerais connaître la raison qui te pousse à décrier son utilisation.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Invité
    Invité(e)
    Par défaut
    Rebonsoir Tautheme,

    Je te remercie beaucoup mais ce n'est pas les textboxs que je voulais transférer. Je voudrais transférer tout le contenu de la ListBox.

    Je sais mettre une plage de la feuille excel dans un tableau mais pas une listbox. Enfin, j'ai pensé aux tableaux car le transfert est très rapide.

    Encore merci.

    je me suis inspiré d'un code pour transférer toutes les lignes de la listbox avec 2 boucles.

    par contre je n'ai pas réussi en utilisant un tableau. voici le code ça pourrait servir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub CmdListToXl_Click()    'transfert listbox vers feuille xl
    Dim i As Long, j As Long
    i = UserForm1.ListBox1.ListCount
     
    For i = 0 To ListBox1.ListCount - 1
    For j = 1 To 13
        Cells(i + 2, j) = ListBox1.List(i)
        Cells(i + 2, j) = ListBox1.Column(j - 1, i)
        Next j
    Next i
    End Sub
    Un coup de pousse pour le transfert avec tableau si c'est faisable. Merci.

    Bonne soirée à tous!

    une autre méthode mais avec les tableaux que je ne maitrise pas beaucoup, niet je n'ai rien pu faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ListBoxToSheet()
    Worksheets(1).Range("A2").Resize(ListBox1.ListCount, 13).Value = ListBox1.List()
    End Sub
    J'ai trouvé ce code mais je n'arrive pas à l'adapter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub CopyFromArray()
    Dim TheArray As Variant
    Dim TheRange As Range
     
    TheArray = Me.ListBox1.List
     
    Set TheRange = Range(Cells(2, 1), Cells(UBound(TheArray) + 1, 1))
     
    TheRange = TheArray
    End Sub
    j'ai executé pas à pas et utilisé la fenêtre des variables locales, ayant 3 lignes dans la listbox (en haut du module option base 1)

    on a TheArray(1) ------> variant(0 to 12)
    TheArray(2) ------> variant(0 to 12)
    TheArray(3) ------> variant(0 to 12)
    Alors je n'ai pas compris grand chose, je pense que c'est au niveau de la ligne set TheRange que ça cloche.

    Merci de me donner un coup de pouce.

    Bonne soiréeNom : fenetre variables locales.JPG
Affichages : 1428
Taille : 26,2 Ko
    Dernière modification par AlainTech ; 01/01/2015 à 20h34. Motif: Fusion de 3 messages

  7. #7
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    @ Philippe

    Tu as raison Philippe j'ai sans doute été excessif. Pourtant au départ je voulais écrire grosse m... Mais je me suis dit que là, ça serait "excessif"... Je plaisante mais je considère que la propriété [RowSource] ne peut-être utilisée qu'avec des données fixes (les jours de la semaines, les mois, etc). Dès qu'il s'agit de données dynamique je la bannis... Tu me demandes quelle raison me pousse a décrier cette méthode et je te réponds : ce fil par exemple !

    @ Cathodique
    Ton code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub UserForm_Initialize()
    Me.ListBox1.List = Range("bd").Value
    End Sub
     
    Private Sub CmdVersListBox_Click()
    Dim I As Integer
     
    UserForm1.ListBox1.AddItem
    For I = 0 To 12
        ListBox1.Column(I, Me.ListBox1.ListCount - 1) = Me.Controls("TextBox" & I + 1).Value
        Controls("textbox" & I + 1).Value = ""
    Next
    End Sub
     
    Private Sub CmdListToXl_Click()    'transfert listbox vers feuille xl
    Dim tc As Variant
     
    tc = Me.ListBox1.List
    Sheets("bd").Range("A2").Resize(UBound(tc, 1) + 1, UBound(tc, 2) + 1) = tc
    End Sub
     
    Private Sub CmdExit_Click()
        Unload Me
    End Sub
    Toutefois il me semble que tu prends le problème à l'envers...
    À plus,

    Thauthème

    Je suis Charlie

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut





    Bonjour Thauthème,

    rien n'empêche d'utiliser en dynamique la propriété RowSource mais on n'a peut-être pas la même notion de "dynamique" …

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour Thautheme,
    Merci pour ta réponse.
    Je partage le même avis de Marc que je salue au passage, rien ne t'empêche de rendre dynamique la propriété RowSource
    Pour ma part, dans un formulaire je place le chargement de la liste ainsi que le dimensionnement de la plage de référence dans une procédure indépendante qui est invoquée au chargement du formulaire et à chaque fois qu'il y a une insertion ou une suppression de données dans la plage.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub InitRange()
      Set rng = shtData.Range("A1").CurrentRegion
      With rng: Set rngBodyRange = .Offset(1).Resize(.Rows.Count - 1): End With
      With Me.lstEmploye: .RowSource = rngBodyRange.Address(external:=True): End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour Tauthème,

    Bon dimanche et un grand bravo pour ton dernier code. Merci beaucoup.
    Toutefois il me semble que tu prends le problème à l'envers...
    En réalité, je voudrais faire un formulaire pour consulter une BD et avoir la possibilité par l'entremise de ce formulaire d'effectuer des modifications ou ajouter des enregistrements de données. Et pouvoir mettre à jour la BD et la listbox par un bouton sans que le formulaire ne se ferme. Est-ce réalisable?

    J'ai donc fait le fichier joint et j'y vais pas à pas (j'ai commencé par l'ajout de données). Pour info, je n'ai aucune contrainte, j'apprends le vba à mon rythme.
    Encore un grand merci, toute ma gratitude.

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En réalité, je voudrais faire un formulaire pour consulter une BD et avoir la possibilité par l'entremise de ce formulaire d'effectuer des modifications ou ajouter des enregistrements de données. Et pouvoir mettre à jour la BD et la listbox par un bouton sans que le formulaire ne se ferme. Est-ce réalisable?
    Bien sûr que c'est réalisable.
    Il suffit de découper tes procédures.
    Une procédure d'écriture et une procédure d'écriture
    On invoque l'écriture lors de la modification ou lorsque l'on ajoute un enregistrement.
    La procédure de lecture étant invoquée pour consulter
    Quand on consulte on place la propriété Enabled des contrôles TextBox, CheckBox et autres à False (pour ma part, j'utilise un contrôle Frame à l'intérieur duquel j'insère tout les contrôles concernés) et c'est la propriété Enabled de celui-ci que je place à False.
    Pour la modification, je prévois un CommandButton qui met la propriété Enabled du Frame à True ce qui permet d'effectuer les modifications. Un autre CommandButton de confirmation invoque la procédure d'écriture et replace les données en consultation (Enabled à False).
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    Merci Marc pour la leçon de dynamisme... Je dois mal m'exprimer ou vous faites semblant de ne pas comprendre (Marc et Philippe). Je ne dis pas que ça ne marche pas avec des plages dynamiques. Je dis simplement que cette méthode ([RowSource]) n'est pas fiable à 100%. Aussi je lui préfère la méthode .List/.Value qui ,elle, est toujours fiable. L'exemple de Cathodique illustre parfaitement ce que j'entends par fiable...
    Il en va de même avec les ListViews, Les Calendars et autres contrôles qui ne sont pas fiables sur toutes les machines. Je préfères les bannir pour éviter de me retrouver dans un cas où ça ne marchera pas.
    À plus,

    Thauthème

    Je suis Charlie

  13. #13
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    En pièce jointe ton fichier modifié. À l'ouverture de l'Userform la ListBox1 affiche la base de donnée intégrale.
    • Pour ajouter une ligne tu remplis les textboxes et tu cliques sur Ajouter
    • pour modifier une donnée, tu double-cliques dans la ListBox1 dans la ligne à modifier. Les valeurs de la ligne sont répercutées dans les différentes textboxes. Tu modifies la ou les textboxes et tu cliques sur Modifier
    • pour supprimer une donnée, tu double-cliques dans la ListBox1 dans la ligne à supprimer. Les valeurs de la ligne sont répercutées dans les différentes textboxes. Clique sur le bouton Supprimer.

    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private BD As Object 'déclare la variable BD (onglet bd)
    Private LI As Integer 'déclare la variable LI (LIgne)
     
    Private Sub UserForm_Initialize() 'à l'intitialisation de l'UserForm
    Set BD = Sheets("bd") 'définit l'onglet BD
    Me.ListBox1.List = Range("bd").Value 'alimente la ListBox1
    End Sub
     
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans la ListBox1
    Dim I As Byte 'déclare la variable I (Incrément)
     
    LI = Me.ListBox1.ListIndex + 2 'définit la ligne LI
    Me.CommandButton1.Caption = "Modifier" 'redéfinit le texte du bouton
    Me.CommandButton3.Visible = "True" 'affiche le bouton "Supprimer"
    For I = 0 To 12 'boucle sur les 13 colonnes de la ListBox1
        'renvoie dans la TextBox (I+1) la valeur de la colonne I de la ListBox1
        Me.Controls("TextBox" & I + 1).Value = Me.ListBox1.Column(I, Me.ListBox1.ListIndex)
    Next I 'prochaine colonne de la boucle
    With Me.TextBox1 'prend en compte la TextBox1
        .SetFocus 'place le curseur
        'sélectionne le texte
        .SelStart = 0 'début de la sélection
        .SelLength = Len(.Value) 'longueur de la sélection
    End With 'fin de la prise en compte de la TextBox1
    End Sub
     
    Private Sub CommandButton1_Click() 'Bouton "Ajouter/Modifier"
    Dim I As Byte 'déclare la variable I (Incrément)
     
    'si LI = 0 (donc si il n'y a pas eu double-clic dans la ListBox1), LI devient la première cellule vide de la colonne 1 (=A) de l'onglet BD
    If LI = 0 Then LI = BD.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
    For I = 1 To 13 'boucle sur les 13 textboxes
        'renvoie la valeur de la textbox dans le cellule ligne LI, colonne I de l'onglet BD
        BD.Cells(LI, I).Value = Me.Controls("TextBox" & I).Value
    Next I 'prochaine textbox de la boucle
    LI = 0 'initialise la variable LI
    Unload Me 'vide et ferme l'Userform
    UserForm1.Show 'affiche l'Userform vierge
    End Sub
     
    Private Sub CommandButton3_Click() 'bouton "Supprimer"
    'condition : si "oui" au message
    If MsgBox("Voulez-vouz supprimer l'élément sélectionné de la base de données ?", vbYesNo, "ATTENTION") = vbYes Then
        BD.Rows(LI).Delete 'supprime la ligne LI
        LI = 0 'initialise la ligne LI
    End If 'fin de la condition
    Unload Me 'vide et ferme l'Userform
    UserForm1.Show 'affiche l'Userform vierge
    End Sub
     
    Private Sub CommandButton2_Click()
    Unload Me 'vide et ferme l'Userform
    End Sub
    Le fichier :
    Fichiers attachés Fichiers attachés
    À plus,

    Thauthème

    Je suis Charlie

  14. #14
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Citation Envoyé par Thautheme Voir le message
    Merci Marc pour la leçon de dynamisme...
    Je ne dis pas que ça ne marche pas avec des plages dynamiques.
    Je dis simplement que cette méthode ([RowSource]) n'est pas fiable à 100%.
    Loin de moi l'idée d'une leçon mais par expérience le sens d'une terminologie fluctue d'une personne à une autre.

    Avec la version 2013 point n'aurais-je été surpris (vu les retours variés sur divers forums)
    mais sous les versions 2003 comme 2007 je n'ai jamais rencontré de souci avec RowSource, chanceux peut-être …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  15. #15
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    Arf ! Chanceux... Certainement pas Marc, ne me prend pas pour plus trumasse que je suis, on n'atteint pas ton niveau par chance...
    Mais, justement, comment résoudre le problème de Cathodique en gardant [RowSource] ? Ça, ça m'intéresse car il se pourrait que je tombasse subitement amoureux des sources en ligne...
    À plus,

    Thauthème

    Je suis Charlie

  16. #16
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour Tautheme,
    Il est évident que le problème de Cathodique n'est absolument pas un problème en utilisant la propriété RowSource en tout les cas de la façon dont tu as abordé le problème. C'est à dire que finalement tu remplis le TextBox par une boucle sur la ligne de la base de données.
    Il suffit de redimensionner RowSource lors de la suppression ou l'ajout d'une ligne et il n'y a en plus aucune raison de fermer le UserForm et de le recharger.
    Je vais te préparer un exemple pour t'en convaincre.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour tout le monde,

    @Tauthème Un grand merci pour ton aide et le temps que tu viens de me consacrer.

    J'étais entrain d'adapter tes codes à mon fichier et noter ce qui cloche. Mais tu m'as devancé. Je te dis bravo c'est à peu près le résultat rechercher (sans double-clic et sans le Unload me). Mais c'est un très très bon exemple pour moi surtout que tu l'as commenté, encore merci.

    Sur mon fichier, quand je clique sur une ligne les items s'affichent dans les textboxs correspondantes. tes précédents codes pour le transfert vers la listbox (additem) fonctionne bien (pour ajouter une ligne dans listbox). Je bloque pour les modifications.

    je suis parvenu à ne modifier que la dernière colonne (etat machine: en service ou hors-service) en utilisant une checkbox qui déclenche suivant le cas telle ou telle macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Sub CheckBox1_AfterUpdate()
    If Trim(Me.TextBox1) = "" Then
            MsgBox "Sélectionnez une Machine!", vbCritical, "Choix Machine"
            'Exit Sub
            ElseIf Me.TextBox1 <> "" And OptMeServ = True Then En_Hors_Service
            ElseIf Me.TextBox1 <> "" And OptCorriger = True Then Modif_Machine
            ElseIf Me.TextBox1 <> "" And OptAjouter = True Then Ajout_Machine
            ElseIf Me.TextBox1 <> "" And OptSupprimer = True Then Suppr_Machine
     
            End If
    End Sub
    -----------------------------
    Sub En_Hors_Service()
        Dim Cel As Range, I As Byte
        Set Cel = f.Columns("A").Find(What:=Me.TextBox1, LookIn:=xlValues, LookAt:=xlWhole)
        I = ListBox1.ListIndex
     
        With Me.CheckBox1
            If .Value = True Then
                .Caption = "En service"
                Me.TextBox13 = .Caption
                f.Cells(Cel.Row, 13).Value = .Caption
                ListBox1.Column(12, I) = .Caption   '********
            ElseIf .Value = False Then
                .Caption = "Hors-service"
                Me.TextBox13.Text = .Caption
                f.Cells(Cel.Row, 13).Value = .Caption
                ListBox1.Column(12, I) = .Caption   '********
     
            End If
        End With
    End Sub
    j'ai fait la même chose pour la modification càd ListBox1.Column(1,I)=Textbox1, ListBox1.Column(2,I)=Textbox2, etc... Mais ça ne fonctionne pas. RIEN COMPRIS DU TOUT.

    Merci beaucoup, bonne fin de soirée.

  18. #18
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Thauthème, en effet, à cause du besoin exprimé initialement,
    RowSource bloque l'AddItem de la procédure CmdVersListBox_Click de l'UserForm1.

    Donc oui dans ce cas c'est plus simple de l'initialiser via .List :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
        With Feuil1.Cells(1).CurrentRegion
            ListBox1.List = .Rows("2:" & .Rows.Count).Value
        End With
    End Sub

    Citation Envoyé par Thautheme Voir le message
    Mais, justement, comment résoudre le problème de Cathodique en gardant [RowSource] ?
    Soit il y a la solution de Philippe (la seule pour conserver les titres des colonnes),
    soit celle d'annuler RowSource (d'après le classeur joint par cathodique tel quel) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub CmdVersListBox_Click()
        With ListBox1
            If .RowSource > "" Then VA = .List: .RowSource = "": .List = VA
            .AddItem
     
            For C& = 1 To .ColumnCount
                .List(.ListCount - 1, C - 1) = Controls("TextBox" & C).Text
                Controls("TextBox" & C).Text = ""
            Next
        End With
     
        TextBox1.SetFocus
    End Sub
    C'est juste la ligne n°3, vraiment pas compliqué ! Comme la solution de Philippe du reste …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonsoir Marc-L,

    Bravo, ta solution est parfaite. pas tout compris mais pour le résultat c'est parfait.

    Si tu permets, 2 questions:

    Q1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For C& = 1 To .ColumnCount   'Que signifie C&?
    Q2:Si on mettait une ligne dans les textboxs, que l'on modifiait celles-ci, comment faire pour les transférer dans la listbox.

    Merci par avance.

  20. #20
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    R1 : équivalent à Dim C as Long = 1 en VB …

    Et c'est expliqué dans l'aide VBA dans certains types de déclaration de variable, origine BASIC !


    R2 : comme dans mon code précédent en spécifiant l'index de la ligne source en place de .ListCount - 1

    Modification du code de mon précédent message sur le principe d'une mise à jour de ligne
    lors de la création d'une nouvelle ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub ListBox1Maj(Ligne&)
        For C& = 1 To ListBox1.ColumnCount
             ListBox1.List(Ligne, C - 1) = Controls("TextBox" & C).Text
            Controls("TextBox" & C).Text = ""
        Next
     
        TextBox1.SetFocus
    End Sub
     
     
    Private Sub CmdVersListBox_Click()
        With ListBox1
            If .RowSource > "" Then VA = .List: .RowSource = "": .List = VA
            .AddItem
            ListBox1Maj .ListCount - 1
        End With
    End Sub
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Remplir un Listbox à partir d'un textbox
    Par samiasamia dans le forum VB.NET
    Réponses: 3
    Dernier message: 12/04/2013, 19h41
  2. [XL-2007] Remplissage de 2 Listbox à partir de n Textbox et d'une Listbox
    Par JmVBA dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/11/2012, 17h06
  3. Trier une Listbox à partir d'une Textbox
    Par Aquarium dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/08/2010, 14h15
  4. [XL-2002] Alimenter une listbox à partir d'une autre sur une feuille différente
    Par pitoumad dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/06/2010, 16h22
  5. Réponses: 3
    Dernier message: 14/06/2008, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo