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 :

Stocker une sélection Multiple de ListBox dans un tableau dynamique (Dim, Redim, Preserve Redim) [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    physico-chimiste
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : physico-chimiste

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Par défaut Stocker une sélection Multiple de ListBox dans un tableau dynamique (Dim, Redim, Preserve Redim)
    Bonjour à tous,

    malgré la lecture de cet article https://silkyroad.developpez.com/vba/tableaux/ et autres tutos ainsi que plusieurs heures de galère, je n'arrive toujours pas à stocker une sélection multiple issue d'une Listbox dans un tableau.
    J'ai l'impression que malgré l'instruction "Redim Preserve" mon tableau est vidé à chaque tour de boucle.

    Voici la dernière version de mon 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
     
     
    Dim nbIsoTotal As Integer
    Dim nbIsoSel As Integer
    Dim TabOnglets() As Variant
     
     
    nbIsoTotal = UserForm1.ListBox1.ListCount ' nombre de selections possibles
     
     nbIsoSel = 0 'nombre de selections effectives initialisé à 0
     
     ReDim TabOnglets(1)
     
     For i = 0 To nbIsoTotal - 1
       If UserForm1.ListBox1.Selected(i) = True Then
       nbIsoSel = nbIsoSel + 1 'comptage des selections effectives
       ReDim Preserve TabOnglets(nbIsoSel) ' Redimensionnement tu tableau en fonction du nombre de sélections à stocker
       MsgBox TabOnglets(nbIsoSel) 'les MsgBox sont tous vides
       TabOnglets(nbIsoSel - 1) = UserForm1.ListBox1.List(i) 'nbIsoSel -1 est l'index du tableau qui commence à 0
       ' A la fin de la boucle il reste la dernière entrée puisque tous les autres sembles avoir été vidées
       End If
     Next i
    Ma question est donc comment faire pour stocker ces sélections dans un tableau dont on ne connait pas la dimension au départ ? ou plus précisément comment faire pour le redimensionner à chaque fois qu'en ajoute une entrée sans vider les entrées précédentes ?

    Et pour info voici comment cette partie s'insère dans le code complet (pour l'instant)

    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
     
     
    Dim ws As Worksheet
    Dim NouvelleFeuille As Worksheet
    Dim Onglets As String
    Dim Onglet As Variant 'une variable for each poru les tableaux doit être de type variant
     
    Dim nbIsoTotal As Integer
    Dim nbIsoSel As Integer
    Dim TabOnglets() As Variant
     
     
    nbIsoTotal = UserForm1.ListBox1.ListCount
     
     nbIsoSel = 0
     
     ReDim TabOnglets(1)
     
     For i = 0 To nbIsoTotal - 1
       If UserForm1.ListBox1.Selected(i) = True Then
       nbIsoSel = nbIsoSel + 1
       ReDim Preserve TabOnglets(nbIsoSel)
       MsgBox TabOnglets(nbIsoSel)
       TabOnglets(nbIsoSel - 1) = UserForm1.ListBox1.List(i)
     
       End If
     Next i
      'à adapter
     
     Set FeuilleMoy = ClasseurMacro.Worksheets.Add
     FeuilleMoy.Name = "Feuille Moyenne"
     
    Dim j As Integer
    Dim dl As Integer
     
     
     
    j = 1
     
    For Each Onglet In TabOnglets()
     
    Set FeuilleOng = ClasseurKSV.Worksheets(Onglet)
     
    dl = FeuilleOng.Range("G" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne Aire
     
    ClasseurKSV.Worksheets(Onglet).Range("G1:H" & dl).Copy Destination:=FeuilleMoy.Range(Cells(2, j), Cells(dl, j + 1)) ' a vérifier
    j = j + 2
    Next
    Merci d'avance pour votre aide,

    David

  2. #2
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Salut,

    Tu redimensionnes ton ntableau sans affecter de valeur à son index lmaximal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve TabOnglets(1 to nbIsoSel
    )

    Mais aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabOnglets(nbIsoSel) =...

  3. #3
    Membre averti
    Homme Profil pro
    physico-chimiste
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : physico-chimiste

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Par défaut
    Merci pour ta réponse, mais apparemment entre temps le fait d'avoir exposé mes bêtises a dû avoir un effet sur l'activité de mes neurones puisque qu'en changeant le code 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
    16
    17
    18
    19
    20
    21
    22
     
    nbIsoTotal = UserForm1.ListBox1.ListCount
     
     nbIsoSel = 0
     
     ReDim TabOnglets(1)
     
       For i = 0 To nbIsoTotal - 1
       If UserForm1.ListBox1.Selected(i) = True Then
       nbIsoSel = nbIsoSel + 1
       TabOnglets(nbIsoSel - 1) = UserForm1.ListBox1.List(i)
          ReDim Preserve TabOnglets(nbIsoSel)
     
       End If
     Next i
     
     
     Dim a As Integer
     
      For a = 0 To nbIsoSel - 1
      MsgBox TabOnglets(a)
      Next a
    ...j'ai pu constater que mon tableau était bien rempli.

    C'est juste que me MsgBox m'affichait le contenu d'une case qui n'existait pas; i.e celle dont l'index était égale à la taille du tableau or l'index commençant à 0. La dernière case n'était pas nbIsoSel mais nbIsoSel-1.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Boucle pour une sélection multiple par nom sur un tableau croisé dynamique VBA
    Par kuro200 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2015, 20h31
  2. action sur une sélection multiple dans un DBGRID
    Par tarmo57 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/09/2012, 14h16
  3. Intégrer une sélection multiple dans un mail
    Par djjero dans le forum Langage
    Réponses: 1
    Dernier message: 09/10/2008, 17h35
  4. Réponses: 1
    Dernier message: 30/10/2007, 16h30
  5. Réponses: 2
    Dernier message: 24/08/2006, 11h33

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