Reunir

Hiei972 - 15 mars 2013 à 16:33
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 25 mars 2013 à 11:20
Bonjour,

je développe un petit programme dans le cadre de mon stage et je suis tombé sur un os.

Je voudrai recupperer les données disons

des cellules A1:D10 puis A20:D26 puis A32:D50

et les renvoyer dans une listbox

j'ai essayé quelque chose comme ça:

UserForm.ListBox.ColumnCount = 4
UserForm.ListBox.List() = Application.Union(Range("Feuil1!A1:D10"), Range("Feuil1!A20:D26"), Range("Feuil1!A32:D50")).Value

le resultat actuel est que je recupère uniquement les données de A1:D10 dans ma listBox, alors que je voudrai celle des 3 plages que j'ai defini.

Quelqu'un a une idée pour realiser cette manip ?

Merci d'avance

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
15 mars 2013 à 17:28
Salut

En effet, cela ne peut pas marcher car les "Region" s'arrêtent dès qu'une cellule vide est rencontrée :
Référence du développeur Excel 
Range.CurrentRegion, propriété 
Cette propriété renvoie un objet Range qui représente la zone en cours.
Celle-ci est une plage limitée par toute combinaison de lignes et de
colonnes vides.

Je ne vois, hélas, pas d'autre moyen que d'énumérer les Range :
Private Sub UserForm_Initialize()
    ListBox1.Clear
    Call AddToListbox(Range("A1:D10"))
    Call AddToListbox(Range("A20:D26"))
    Call AddToListbox(Range("A32:D50"))
End Sub

Sub AddToListbox(ByRef myRange As Range)
    Dim oRange As Range
    For Each oRange In myRange
        ListBox1.AddItem oRange.Value
    Next
End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
0
Bonjour,

merci pour l'explication.

j'ai pas réussi à utiliser ta proposition de code en l'état, mais dans l'esprist j'ai fait ça:


' Déclaration des variables pour les boucles
    Dim i, j, k As Integer

' Déclaration de tableaux
    Dim Tab3, Tab2, Tab1 As Variant
    Dim Tabtot As Variant
        
'Chargement d'une plage de cellules dans chaque tableaux
    Tab1 = Range("A1:D10").Value
    Tab2 = Range("A20:D26").Value
    Tab3 = Range("A32:D50").Value
    
'Définit le nombre de colonnes (basé sur Tab1) pour la ListBox.
   UserForm2.ListBox1.ColumnCount = UBound(Tab1, 2)


''''''''''''''''''''''''''''''''''''''''''''''
'' Exécution du code
''''''''''''''''''''''''''''''''''''''''''''''


ReDim Tabtot(1 To UBound(TabAirbus, 1) + UBound(TabEmbraer, 1), 1 To UBound(TabAirbus, 2)) As Variant

For i = 1 To UBound(Tab1, 1)
    For j = 1 To UBound(Tab1, 2)
        For k = UBound(Tab1, 1) + 1 To UBound(Tab1, 1) + UBound(Tab3, 1)
        
       Tabtot(i, j) = Tab1(i, j)
       Tabtot(k, j) = Tab3(k - UBound(Tab1, 1), j)
       
        Next k
    Next j
Next i

    UserForm2.ListBox1.List = Tabtot



ça fonctionne quand j'ai pas trop de tableau à lier (jusqu'à 4 sur).
Parcontre quand je lie 6 tableau (costo quand même) je bug.

je risque d'avoir besoin d'en liéer plus, alors quelqu'un a t'il une idée pour que je mange moins de mémoir ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 mars 2013 à 20:45
Quand tu auras abandonné l'autre discussion ouverte aujourd'hui pour le même sujet, je te parlerai peut-être un peu plus complètement que ce que je vais me contenter de faire ici :
Dim i, j, k As Integer

fait que seul k est typé en Integer.
idem pour
Dim Tab3, Tab2, Tab1 As Variant

sans compter que ce qui n'est pas typé, l'est d'office en Variant
ça fonctionne quand j'ai pas trop de tableau à lier (jusqu'à 4 sur)

ma foi ! cela arrivera forcément si i, k ou j dépassent les limites de leur typage, hein !
Quand tu reviendras et auras déclaré abandonner définitivement ton doublon inacceptable, je t'exposerai une méthode bien plus rapide que la tienne.
A toi de voir, hein ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
(Pour info à de nouveaux arrivant sur le sujet:
j'ai oublié de faire une modif dans le code que je vous ai présenté. il faut comprendre:
Tab1 TabAirbus et Tab3 TabEmbraer)

peut-tu m'expliquer (plus pour ma culture) pourquoi malgré le fait que i et j ne sont pas réfèrencer comme "interger" la boucle fonctionne quand même ?

Quand je parle de lier plus de tableau je provisionne le nombre de variable nécessaire avant et fait une boucle sur le même modèle que celle que j'ai exposé. Par exemple pour 6 :

Dim i, j, k, l, m, n As Integer

et

Dim Tab1, Tab2, Tab3, Tab4, Tab5, Tab6 As Variant

Si tu es disposé à me l'exposer je suis preneur de ta methode plus efficace.

Encore désolé pour ce doublon.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 mars 2013 à 11:20
Bien (je vois que tu as dit dans l'autre discussion que tu l'abandonnais).
On ne continue donc qu'ici === >>
1)
peut-tu m'expliquer (plus pour ma culture) pourquoi malgré le fait que i et j ne sont pas réfèrencer comme "interger" la boucle fonctionne quand même ?

parce que "variant". Et ce n'est pas propre.
2) regarde ce que fait ceci ( exemple ) :
Sur un projet tout neuf , avec une litbox nommée listbox1
Dim toto As Range, titi as variant
  Set toto  = Union(Range("A1:D2"), Range("A7:D8"))
  With Worksheets.Add
    .Name = "tata"
    toto.Copy Destination:=.Range("A1")
    titi = .UsedRange
    Application.DisplayAlerts = False
    .Delete
    Application.DisplayAlerts = True
  End With
  With ListBox1
    .ColumnCount = toto.Columns.Count
    .List = titi
  End With

Par cette feinte : un seul tableau, d'un seul coup
A toi, bien sur, de mettre les plages que tu veux à cette ligne :
Set toto = Union(Range("A1:D2"), Range("A7:D8"))
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous