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 :

Afficher les selections multiple d'une Listbox dans une seule cellule en séparant par une virgule


Sujet :

Macros et VBA Excel

  1. #21
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    Tu vires la propriété RowSource, et tu utilises ce code pour lancer ton userform

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub lancer_formulaire()
    UserForm1.ListBox1.List = Range("tableau2[Liste des services]").Value
    UserForm1.Show vbModeless
    End Sub
    Attention que dans ton classeur, il y a un espace après "Liste des services" dans l'intitulé de la colonne. Il faut le virer aussi
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  2. #22
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    Super ca fonctionne j'ai le contenu de ma ListBox sans avoir besoin de la Rawsource grace à ton initialisation.
    Maintenant il me reste à faire le code du commandbutton4 pour qu'il confirme la selection multiple et ensuite aller pousser la chaine dans la cellule c'est bien ca ?
    dois-je modifier le code de mes boutons Nouveau produit et Editer pour qu'ils prennent en compte ma listbox comme ils le font avec les combo et text box ?

  3. #23
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    Step by step, je pense...

    Pour moi, le transfert doit se faire en bout de course, c'est-à-dire lorsque tu fermes ton userform. J'ai vu qu'il était vbModeLess... Il y a une raison particulière?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #24
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    J'ai vu que cela permettait de cliquer en dehors du formulaire pendant son utilisation. Je m'en sers pour renseigner le nouveau numéro d'arret de commercialisation lors de la création d'un nouveau produit. Je n'ai pas su faire en sorte que le nouveau produit prenne directement la valeur numérique suivante de la dernière cellule non vide de la colonne A pour "Numéro d'arret de commercialisation"". Du coup j'ai voulu permettre à l'utilisateur d'aller voir quel numéro il devait renseigner

  5. #25
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    Ok. On verra plus tard.

    Quoi qu'il en soit, la récupération de la chaine contenant les choix de la liste t'a été donnée de trois façons différentes:
    • tableau redimensionné à la volée (j'aime pas);
    • solution de Marcel supprimant le dernier ; dans une chaine concaténée;
    • ma solution évitant la suppression finale;



    A toi de t'inspirer de cela, surtout que tu as mon classeur de démo pour t'aider
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #26
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    Je suis en intense session de bidouillage à partir de ton fichier test ! j'update au fur et à mesure de mes tests =).
    Merci beaucoup de ton aide encore une fois. Merci aux autres participants aussi, ma direction est ravie que je mette autant de coeur à l'ouvrage. Comme je vous le disais avant hier encore je ne connaissais meme pas l'existence de VBA c'est super sympa de m'apprendre avec exemples et patience

  7. #27
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    J'ai essayé avec un peu toute les méthodes mais il y a toujours un problème que ca soit dans le module ou l'userform j'obtiens tjr une erreur au moment de l’exécution.
    Arret de commercialisation modèle Forum.xlsm

  8. #28
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    Update : Cela fonctionne avec la solution de Philippe ou du moins en partie ! J'arrive enfin à obtenir tous les items sélectionnés dans une seule et meme cellule de la colonne H et séparés par une virgule. Seul problème j'ai du mal écrire mon Range car mes données atterrissent en H9 alors que je traite le produit en ligne 2 :
    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
    Private Sub CommandButton4_Click()
      Dim i As Byte
      Dim Elem As Integer, Count As Integer
      Dim tbl()
      ' Charge les éléments sélectionnés dans une table
      With ListBox1
        For Elem = 0 To .ListCount - 1
          If .Selected(Elem) Then
             ReDim Preserve tbl(Count)
             tbl(Count) = .List(Elem)
             Count = Count + 1
          End If
        Next
      End With
      ' Ecrit tous les éléments de la table dans une cellule en séparant chaque élément par une virgule
      With Worksheets("Produits").Range("H" & Elem)
      .Value = Join(tbl, ",")
      End With
    End Sub
    Meme en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = Sheets("Produits").Range("a65536").End(xlUp).Row + 1
    aucun changement j'ai tjr mes services en H9

  9. #29
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    C'est normal.

    Elem n'a rien à voir avec la position de la cellule. C'est juste le compteur qui permet de boucler sur toutes lies lignes du listbox. Comme tu as 9 lignes dans ton listbox (0 à 8), en sortie de boucle, Elem vaut 8 (le dernier indice) +1, soit 9. Tu ne peux donc pas utiliser cette valeur pour déterminer sur quelle ligne de H tu dois renvoyer ta chaîne.

    Sauf mauvaise lecture, je n'ai pas vu dans ton code comment déterminer H2. Soit c'est une constante et tu mets H2 en dur, soit c'est variable, mais tu devras alors nous expliquer comment calculer cette variable

    Autre chose:
    • Nomme tes contrôles. ListBox1 et CommandButton4, ça le fait pas trop. Lorsque tu vas revenir dans ton code plus tard, ce sera loin d'être le top;
    • Perso, je ne mets pas le code exécutif dans les proc évènementielles. Je ne trouve pas ça propre et pour la maintenance, c'est souvent galère dès qu'un clic sur le bouton doit lancer un code plus long et qui fait plusieurs choses (c'est une des premières règles de bonnes pratiques;
    • Attention à tes adressages en dur dans le code du userform (c'est notamment pour cela que je n'aime pas adresser directement des plages dans le code du userform). Si ta structure change, tu vas devoir repasser tout ton code en revue, et ça va être vraiment galère;
    • Sois particulièrement attentif aux noms de tes procédures, fonctions et variables. Un code bien écrit doit pouvoir se lire et se comprendre sans commentaires, ce qui est loin d'être évident avec des listbox1, Elem et autres... On n'est plus à un caractère près de nos jours.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #30
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    J'ai remplacé par cela et cette fois ci les services apparaissent tout en bas
    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
    Private Sub CommandButton4_Click()
      Dim i As Byte
      Dim Elem As Integer, Count As Integer, L As Integer
      Dim tbl()
      L = Sheets("Produits").Range("a65536").End(xlUp).Row + 1
      ' Charge les éléments sélectionnés dans une table
      With ListBox1
        For Elem = 0 To .ListCount - 1
          If .Selected(Elem) Then
             ReDim Preserve tbl(Count)
             tbl(Count) = .List(Elem)
             Count = Count + 1
          End If
        Next
      End With
      ' Ecrit tous les éléments de la table dans une cellule en séparant chaque élément par une virgule
      With Worksheets("Produits").Range("H" & L)
      .Value = Join(tbl, ",")
      End With
    End Sub

  11. #31
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    Le bloc With...End With ne sert à rien dans ce contexte. Tu peux tout écrire sur une ligne. L représente la ligne qui suit la dernière ligne remplie en colonne A. A toi de voir si c'est la bonne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Produits").Range("H" & L).Value = Join(tbl, ",")

    Je suppose que tu travailles avec une version XL2007 ou ultérieure. Prends l'habitude d'utiliser range("a1048576").end(xlup). Si un jour tu as plus de lignes que l'ancienne limite 2003, tu seras chocolat...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #32
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    Effectivement je suis sur Excel 2016 j'avais lu dans le tuto d'où me vient ce Range qu'effectivement sur les nouvelles versions le nombre de case était plus grand seulement vu la petite taille de mon tableau j'avais choisi de ne pas m'en préoccuper. C'est surement une mauvaise habitude si je suis un jour appelé à gérer de plus grandes quantités de données.

    Si L représente la ligne qui suit la dernière ligne remplie en colonne A quelle lettre correspond à la ligne qui suit la dernière ligne remplie en colonne H ? Est ce que toute la colonne est prise en compte pour l'identification de la dernière ligne ou est ce que le titre de mes colonnes est pris en compte ?

  13. #33
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Prends l'habitude d'utiliser range("a1048576").end(xlup).
    Quand bien même.
    Pour ma part, depuis Excel 2003, j'ai toujours considéré le nombre de lignes de la feuille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Worksheets("lawks")
      derlign = .Cells(.Rows.Count, 1).end(xlUp).Row
    End With
    J'ai été, récemment je l'avoue, convaincu de déclarer derlign en Long.

    Cela dit. Cela dit.
    Des bases avec plus de 1048576 enregistrements ne devraient pas courir les rues de Rome ou Bruxelles ( )

    Sans flagornerie aucune, bravo Pierre pour avoir rappelé quelques bonnes pratiques.
    J'y reviens parfois au cours de mes modestes interventions.
    Partant, je pense qu'un exposé à ce sujet, quelle qu'en soit la forme, serait opportun.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  14. #34
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Si L représente la ligne qui suit la dernière ligne remplie en colonne A quelle lettre correspond à la ligne qui suit la dernière ligne remplie en colonne H ? Est ce que toute la colonne est prise en compte pour l'identification de la dernière ligne ou est ce que le titre de mes colonnes est pris en compte ?
    Ouh là!
    Le titre des colonnes n'a rien à voir.
    L est une variable. Elle pourrait tout autant être derlign, mondernierenreistrement, ...
    Et celle-ci peut tout aussi bien s'appliquer à la colonne A qu'à celle IV.

    A toute fin utile, ci-joint quelques liens qui te permettront, comme je l'espère, de progresser.
    Fichiers attachés Fichiers attachés

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  15. #35
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    perso je verrais plutôt cela comme bonne pratique histoire d'être compatible avec toute versions d'Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     range("A" & rows.count).end(xlup).
    ou meme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(rows.count,"A").end(xlup)
    bien sur devant range ou cells mettre le parent. ou le point si on est dans un with et que l'on travaille pas sur la feuille active
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #36
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    Marcel, Patrick,

    J'utilise aussi Rows.count (enfin non, pas tout à fait, voir plus bas), mais vu les problèmes avec L et autres, je ne suis pas rentré dans le détail... Cela étant, c'est vrai que 1048576 lignes de données, c'est rare, mais je peux garantir que plus que 65536, c'est de plus en plus fréquent (au passage, derlig en integer plantait au delà de 32767...). Par contre, je ne tiens pas compte de la remarque de Patrick concernant le fait que cela permet de tourner sur toutes les versions car aujourd'hui, je considère comme obsolète les versions 2003 et antérieures, le code étant, notamment par l'utilisation des listobjects et références structurées, verrouillé sur les dernières versions.

    Cela dit, tant qu'à faire du beau code, je vous informe à toutes fins utiles ( ) que Rows.Count n'est pas suffisant dans les bonnes pratiques car il peut planter... Allez, c'est la devinette du vendredi: Quand Rows.Count pourrait-il bien planter et par quoi le remplacer pour que cela ne plante pas (dans les cas les plus courants), si tant est que ce soit possible? Perso, je pense que ce n'est pas possible d'être sûr que ça ne plantera pas (dans un cas trèèèèès tiré par les cheveux, j'avoue).

    Et donc, en conclusion, ne vous en déplaise messieurs , 1048576 en dur est pour moi la seule façon d'avoir, à coup sûr et pour les versions "actuelles" (2007, ça fait du 12 ans d'âge, quand même), le nombre de lignes max d'une feuille.

    Pour tenir compte de la remarque de Patrick, on pourrait écrire une fonction qui tient compte de la version, mais c'est pour la beauté du geste car dans les faits, je le répète, je ne vois pas comment écrire du code qui tienne compte de toutes les versions, pour plein d'autres notions que le simple nombre de lignes (tables de données, références structurées, thèmes, PowerQuery, nouvelles fonctions, ...)

    La seule façon "simple" d'obtenir à coup sûr le nombre de lignes serait donc d'utiliser une fonction perso comme celle-ci, par exemple, et qui à mon avis tiendra la route un certain temps car je ne pense pas que ce soit à l'ordre du jour chez MS d'augmenter le nombre de lignes prochainement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function RowsCount() As Long
      If CLng(Replace(Application.Version, ".", ",")) < 12 Then
        RowsCount = 65536
      Else
        RowsCount = 1048576
      End If
    End Function
    Mais je suis d'accord que je pousse le bouchon un peu loin et que j'évoque un cas d'école jamais rencontré dans la réalité.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #37
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Hé salut Patrick!

    Si tu peux m'indiquer la différence entre les post de 16 h 06 ET 16 H 23, alors je suis preneur.

    Aucun problème, bien entendu.

    Edit.

    Je viens de constater la présence du dernier post de Pierre.
    Pour la devinette, je sèche un peu.
    En 13 ans, je n'ai jamais constaté d'erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count,1).End(xlUp).Row
    .
    Je vais essayer d'y réfléchir, avant le repas du dimanche (impossible après ), mais pour l'instant....

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  18. #38
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Il faut aussi restituer lors de la lecture.
    J'ai remplacé le RowSource du ListBox par Me.ListBox1.List = [tableau2].Value

    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
    Private Sub UserForm_Initialize()
        Dim J As Long
        Dim i As Integer
        Me.ListBox1.List = [tableau2].Value
     
        Set Ws = Sheets("Produits") 'Correspond au nom de votre onglet dans le fichier Excel
        With Me.ComboBox1
            For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
                .AddItem Ws.Range("A" & J)
            Next J
        End With
        With Me.ComboBox2
            For J = 2 To Ws.Range("B" & Rows.Count).End(xlUp).Row
                .AddItem Ws.Range("B" & J)
            Next J
        End With
        For i = 1 To 5
            Me.Controls("TextBox" & i).Visible = True
        Next i
    End Sub
     
    'Pour la liste d?roulante numéro d'arret de commercialisation
    Private Sub ComboBox1_Change()
        Dim Ligne As Long
        Dim i As Integer, temp
     
        If Me.ComboBox1.ListIndex = -1 Then Exit Sub
        Ligne = Me.ComboBox1.ListIndex + 2
        ComboBox2 = Ws.Cells(Ligne, "B")
        For i = 1 To 5
            Me.Controls("TextBox" & i) = Ws.Cells(Ligne, i + 2)
        Next i
        '---
         temp = Ws.Cells(Ligne, "h")
         a = Split(temp, ",")
         For i = 0 To Me.ListBox1.ListCount - 1: Me.ListBox1.Selected(i) = False: Next i
         If UBound(a) >= 0 Then
           For i = 0 To Me.ListBox1.ListCount - 1
            If Not IsError(Application.Match(Me.ListBox1.List(i), a, 0)) Then
                Me.ListBox1.Selected(i) = True
            Else
                Me.ListBox1.Selected(i) = False
            End If
           Next i
         End If
     End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  19. #39
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 947
    Points
    55 947
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    [...]
    En 13 ans, je n'ai jamais constaté d'erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count,1).End(xlUp).Row
    .[...]
    Avec le code que tu donnes, il n'y aura pas d'erreurs. Mais ce n'est pas celui que Patrick a donné
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #40
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 46
    Points : 13
    Points
    13
    Par défaut
    Wow c'est super Boisgontier merci beaucoup tu l'as carrément fait a ma place :O !!
    Je n'ai pas tout compris a ce que tu as fait par contre donc je suis en train d'explorer le code =) !
    Quelqu'un peut m'expliquer ce que fait ce morceau svp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    temp = Ws.Cells(Ligne, "h")
         a = Split(temp, ",")
         For i = 0 To Me.ListBox1.ListCount - 1: Me.ListBox1.Selected(i) = False: Next i
         If UBound(a) >= 0 Then
           For i = 0 To Me.ListBox1.ListCount - 1
            If Not IsError(Application.Match(Me.ListBox1.List(i), a, 0)) Then
                Me.ListBox1.Selected(i) = True
            Else
                Me.ListBox1.Selected(i) = False
            End If
           Next i
         End If
     End Sub
    et celui-ci est bien celui qui va pousser la valeur de la listbox dans ma cellule ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 0 To Me.ListBox1.ListCount - 1
               If Me.ListBox1.Selected(i) = True Then
                 tmp = tmp & Me.ListBox1.List(i) & ","
               End If
             Next i
             Ws.Cells(Ligne, "h") = tmp

    Comment puis-je faire pour adapter ce que tu m'as donné Jacques pour que mon bouton Nouveau produit (commandbutton1) fasse comme ce que tu as fait faire au bouton Modifier pour les services concernés ?

    J'ai essayé comme ceci

    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
    'Pour le bouton Nouveau produit
    Private Sub CommandButton1_Click()
        Dim L As Integer
        If MsgBox("Confirmez-vous l'insertion de ce nouveau produit?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
            L = Sheets("Produits").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
            Range("A" & L).Value = ComboBox1
            Range("B" & L).Value = ComboBox2
            Range("C" & L).Value = TextBox1
            Range("D" & L).Value = TextBox2
            Range("E" & L).Value = TextBox3
            Range("F" & L).Value = TextBox4
            Range("G" & L).Value = TextBox5
            Range("H" & L).Value = ListBox1
        End If
    End Sub
    mais ca n'a pas l'air d'être comme ca :p. Faut il que je rajoute ceci au code du commandbutton1 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim tmp
    tmp = ""
             For i = 0 To Me.ListBox1.ListCount - 1
               If Me.ListBox1.Selected(i) = True Then
                 tmp = tmp & Me.ListBox1.List(i) & ","
               End If
             Next i
             Ws.Cells(Ligne, "h") = tmp

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2017, 13h55
  2. Réponses: 0
    Dernier message: 24/08/2007, 12h27
  3. Réponses: 5
    Dernier message: 27/04/2007, 15h06
  4. afficher les champs null de deux tables dans un select
    Par poil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/09/2005, 15h05
  5. [C#]Sauvegarde d'une selection multiple d'une listbox?
    Par onouiri dans le forum ASP.NET
    Réponses: 7
    Dernier message: 29/04/2004, 17h16

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