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

XL 2010 Problème pour remplir un Array

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

À l'ouverture du classeur, un Array se créé à partir d'éléments gardés en mémoire sur une plage de cellules de la feuille, avant la dernière fermeture dudit classeur.
Pour récupérer ces données, j'écris ceci, et ça marche :
VB:
    listeoptions = Array([Liste_ComboChx].Cells(1, 1).Value, [Liste_ComboChx].Cells(2, 1).Value, [Liste_ComboChx].Cells(3, 1).Value, [Liste_ComboChx].Cells(4, 1).Value, [Liste_ComboChx].Cells(5, 1).Value)
"Liste_ComboChx" étant la plage de cellules où sont mémorisées les données.

Bon, maintenant supposons qu'il y ait 50 items dans cet Array... Donc j'ai tenté audacieusement une boucle qui a lamentablement échoué. ¡Caramba! Où me suis-je encore bien planté ?
Code:
    For Each c In [Liste_ComboChx] '"Liste_ComboChx" est la plage nommée qui reçoit tous les items de la ComboBox "ComboChx"
            listeoptions(i) = c.Value
    Next
Code:
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir Sylvanu.

Je viens d'essayer, ça ne marche pas du tout.
Du reste quand je veux tester par curiosité :
VB:
Code:
Sub Essai()

Dim listeoptions As Variant

     listeoptions = [Liste_ComboChx]

     [B16] = listeoptions(0)

End Sub
ça plante...
 

patricktoulon

XLDnaute Barbatruc
re
bonjour
array , tableau ,1 dim , 2 dim , je sais plus moi

'si le range est vertical
VB:
Sub range_vertical_to_array_1dim()
listeoptions = Application.Transpose([Liste_ComboChx].Value)
MsgBox listeoptions(1)
End Sub

--------------------------------------------------------------------------------
'si le range est horizontal
'version1 pour faineant de la calbasse

VB:
Sub range_horizontal_to_array_1dim()
listeoptions = Application.Transpose(Application.Transpose([Liste_ComboChx2].Value))
MsgBox listeoptions(1)
End Sub

'version2
VB:
Sub xrange_horizontal_to_array_1dim()
listeoptions = Application.Index([Liste_ComboChx2].Value, 1, 0)
MsgBox listeoptions(1)
End Sub

 

job75

XLDnaute Barbatruc
Bonjour à tous,

Ceci fonctionne quelle que soit la plage, vecteur vertical ou horizontal :
VB:
Dim r As Range, listeoptions(), i&
Set r = [Liste_ComboChx]
ReDim listeoptions(1 To r.Count)
For i = 1 To r.Count
    listeoptions(i) = r(i)
Next
A+
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Magic_Doctor, Patrick, Job,

Essayez cette PJ, elle marche très bien avec cette macro :
Code:
Sub Lecture()
    Dim i As Integer, listeoptions
    [A3] = Int(100 * Rnd()) ' init tableau
   
' Transfert tableau dans array
    listeoptions = [Liste_ComboChx]
   
' Ecriture array dans cellules Col D
    For i = 1 To UBound(listeoptions)
        Cells(i + 2, 4) = listeoptions(i, 1)
    Next i
End Sub

Le transfert listeoptions = [Liste_ComboChx] marche correctement.

[Edit] Dans votre macro :
VB:
Sub Essai()
Dim listeoptions As Variant
     listeoptions = [Liste_ComboChx]
     [B16] = listeoptions(0)
End Sub
Il y a deux erreurs.
Comme dit au post #2 le tranfert cellules array est fait dans un array de dimension 2.
Qui plus est, l'indice le plus bas est 1 et non 0;
Code:
Sub Essai()
     listeoptions = [Liste_ComboChx]
     [B16] = listeoptions(1,1)
End Sub
 

Pièces jointes

  • Essai.xlsm
    15.2 KB · Affichages: 11
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Merci pour vos réponses.
Et bien les solutions de patricktoulon et job75 marchent. Où était donc le problème ? Tout simplement pour une histoire d'Option Base. J'étais en "0" et je devais être en "1".
Explication :
VB:
Option Explicit

Option Base 1
.............................................................................

Private Sub Workbook_Open()

    Dim i As Byte, listeoptions As Variant, dico As Object
    
    Set dico = CreateObject("Scripting.Dictionary")
    
    'Dresse la liste de tous les items mémorisés de la ComboBox "ComboChx" avant la dernière fermeture du classeur
    listeoptions = Application.Transpose([Liste_ComboChx].Value)
    
    'For i = 0 To UBound(listeoptions) 'rempli le dictionnaire ("dico") avec les éléments de la matrice "listeoptions" (Option Base 0)
    For i = 1 To UBound(listeoptions) 'rempli le dictionnaire ("dico") avec les éléments de la matrice "listeoptions" (Option Base 1)
        dico(listeoptions(i)) = ""
    Next
    Sheets("Hoja1").ComboChx.List = dico.keys 'dresse la liste de la ComboBox "ComboChx" à partir du dictionnaire
    Sheets("Hoja1").ComboChx.ListIndex = 0 'sélection par défaut du 1er item de la liste de la ComboBox "ComboChx"
      
End Sub
Donc, redoubler d'attention avec ces histoires d'Option Base.

Encore merci à tous les deux.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…