Définir le nombre de ligne d'un listbox

TopNotch63

XLDnaute Nouveau
Bonjour,

Je mets à jour un classeur qui va chercher ses données dans d'autres classeurs. Toutes ces données sont raptriées dans la feuille "Liste".

J'ai un userform avec un listbox à l'intérieur qui doit afficher ces données.

Jusque là pas de problème. Mon problème est que je veux limiter la grosseur de mon listbox(le nombre de ligne) à celui du nombre de ligne de données de la feuille "Liste".

Je ne trouve pas la façon de définir ce nombre de ligne maximum du listbox.

Merci de votre aaide.

Voici essentiellement le code.

Dim Myarrayliste(20000, 25)
sub RemplirUF
Ligne = 1
LigneArray = 0
Do
For Colonne = 1 To 13
Myarrayliste(LigneArray, Colonne - 1) = Worksheets("Liste").Cells(Ligne + 1, Colonne).Text
Next Colonne

Ligne = Ligne + 1
LigneArray = LigneArray + 1
Loop Until Worksheets("Liste").Cells(Ligne, 1).Value = ""

Liste.ListBox1.List() = Myarrayliste
UF.Show
End Sub
 
G

Guest

Guest
Re : Définir le nombre de ligne d'un listbox

Bonsoir,

Pas sûr d'avoir tout compris m'enfin voici une solution pour limiter et remplir le listBox:

Code:
Sub Remplir()
    Dim cpt As Long
    cpt = Sheets("Liste").Range("A" & Rows.Count).End(xlUp).Row - 1
    ListBox1.List() = Range("A2").Resize(cpt, 13).Value
End Sub

A+
 

PMO2

XLDnaute Accro
Re : Définir le nombre de ligne d'un listbox

Bonjour,

Essayez le code suivant

Code:
Sub RemplirUF_pmo()
Dim S As Worksheet
Dim R As Range
Dim lastLig&
Dim var
Set S = Sheets("Liste")
lastLig& = S.Range(Cells(65536, 1), Cells(65536, 1)).End(xlUp).Row
Set R = S.Range(Cells(2, 1), Cells(lastLig&, 13))
var = R
UF.ListBox1.List() = var
UF.Show
End Sub

Cordialement.

PMO
Patrick Morange
 

TopNotch63

XLDnaute Nouveau
Re : Définir le nombre de ligne d'un listbox

Merci pour vos réponses mais ce n'est pas exactement cela.

Je vais tenter d'être plus clair.

Lorsque je monte le uf, le nombre de lignes dans la feuille "liste" peut varier entre 2 et 20000. Cette pour cette raison que je déclare avant les subs Dim MyArrayListe(20000,25)

De cette façon je suis sûr d'avoir au moins 20000 lignes dans le listbox sinon j'ai une erreur si je n'ai pas assez de lignes déclarées.

Ce que je désire, c'est si j'ai moins de 20000 lignes d'entrées, j'aimerais que le listbox soit "diminué" afin de de ne pas avoir de vide dans le listbox à la fin des données lorsqu'on défile avec le scrollbar.

J'espère que c'est plus clair!

Merci encore.
 

PMO2

XLDnaute Accro
Re : Définir le nombre de ligne d'un listbox

Bonjour,

En ce qui me concerne, c'est exactement ce que j'ai fait.

Dans le classeur exemple que j'ai fourni, allez dans la feuille "Liste" et étendez
les données jusqu'à la ligne que vous voulez (par exemple 1000).
Ne touchez pas au code. Appuyez sur le bouton de commande et vous devriez
obtenir vos 1000 lignes dans la ListBox.

Est-ce bon ?

Cordialement.

PMO
Patrick Morange
 

TopNotch63

XLDnaute Nouveau
Re : Définir le nombre de ligne d'un listbox

Merci PMO2. Ça fonctionne bien. Je ne sais pas si vous pouvez me dire comment je pourrais filtrer les données.

Par exemple si j'utilise votre fichier, j'aimerais que seule les données de la 4ième colonne qui finissent par un 3 soit dans la liste.

Merci et je vous très fort!
 

PMO2

XLDnaute Accro
Re : Définir le nombre de ligne d'un listbox

Bonjour,

Un exemple pour filtrer vos données et monter les données filtrées dans la ListBox (je me suis basé sur l'exemple que vous citez).

Code:
'### A adapter ###
Const COLONNE As Long = 4
Const WHAT_FIN As String = "3"
'#################

Private Function FiltreVar(ByVal var As Variant) As Variant
Dim var2
Dim i&
Dim j&
Dim cpt&
Dim T()
var2 = var
On Error GoTo Erreur
For i& = 1 To UBound(var2, 1)
  If Right(Trim(var2(i&, COLONNE)), Len(WHAT_FIN)) = WHAT_FIN Then
    cpt& = cpt& + 1
  End If
Next i&
If cpt& = 0 Then GoTo Erreur
ReDim T(1 To cpt&, 1 To UBound(var2, 2))
cpt& = 0
For i& = 1 To UBound(var2, 1)
  If Right(Trim(var2(i&, COLONNE)), Len(WHAT_FIN)) = WHAT_FIN Then
    cpt& = cpt& + 1
    For j& = 1 To UBound(var2, 2)
      T(cpt&, j&) = var2(i&, j&)
    Next j&
  End If
Next i&
FiltreVar = T
Exit Function
Erreur:
FiltreVar = var
End Function

Sub RemplirUF_pmo()
Dim S As Worksheet
Dim R As Range
Dim lastLig&
Dim var
Set S = Sheets("Liste")
lastLig& = S.Range(Cells(65536, 1), Cells(65536, 1)).End(xlUp).Row
Set R = S.Range(Cells(2, 1), Cells(lastLig&, 13))
var = R
UF.ListBox1.List() = FiltreVar(var)
UF.Show
End Sub

Cordialement.

PMO
Patrick Morange
 

TopNotch63

XLDnaute Nouveau
Re : Définir le nombre de ligne d'un listbox

Merci PM02

J'aurais une dernière petite demande à vous faire.

J'ai un autre journal, très semblable à celui-ci mais il comporte des données texte.

J'aimerais à l'aide de 2 combobox pouvoir filtrer les données selon ce que l'utilisateur choisi dans ces 2 combobox. Le combo1 filtre les données pour la colonne 3 et le combo2 filtre pour lacolonne 4.

Voici ce que j'ai comme code présentement

'regarde ce que l'utilisateur a choisi pour le tri sur le type
If Liste.ComboType.Value = "Tous" Then
GoTo OKPourLaListe
Else
'Il faut regarder si le 4ieme élémemnt de la liste est celui ci
If Liste.ComboType.Value = Worksheets("Liste").Cells(Ligne + 1, 4).Text Then
GoTo OKPourLaListe
Else
GoTo PasSurLaListe
End If
End If

Ce n'est pas l'idéal, c'est sûr. La façon dont vous fait le tri semble beaucoup plus efficace. De plus votre façon de faire remonte le lixtbox avec les données filtrées et de la bonne dimension, SUPER!.

J'apprécierais énormément si vous pouvez améliorer cette dernière chose.

Encore merci.
 

PMO2

XLDnaute Accro
Re : Définir le nombre de ligne d'un listbox

Bonjour,

Un exemple pour filtrer une feuille à partir des sélections de 2 ComboBox

1) Créez un classeur et copiez le code ci-dessous dans un module standard
Code:
'### Constante à adapter ###
Public Const FEUILLE As String = "data" 'nom de la feuille contenant les données
Public Const TOUS As String = "Tous"    'option pour toutes les données
'###########################

Sub demarrer()
UserForm1.Show
End Sub

Sub algoTri(ByVal limiteinf As Long, ByVal limitesup As Long, ByRef tabtri As Variant)
Dim i&
Dim j&
Dim element
Dim transit
i& = limiteinf
j& = limitesup
transit = tabtri((limiteinf + limitesup) \ 2, 1)
Do
  Do While tabtri(i&, 1) < transit
    i& = i& + 1
  Loop
  Do While transit < tabtri(j&, 1)
    j& = j& - 1
  Loop
  If i& <= j& Then
    element = tabtri(i&, 1)
    tabtri(i&, 1) = tabtri(j&, 1)
    tabtri(j&, 1) = element
    i& = i& + 1
    j& = j& - 1
  End If
Loop Until i& > j&
If limiteinf < j& Then
  Call algoTri(limiteinf, j&, tabtri)
End If
If i& < limitesup Then
  Call algoTri(i&, limitesup, tabtri)
End If
End Sub
2) Dans ce classeur, créez une feuille nommée "data" et mettez des données dans la plage "A1 : G10" (par exemple).
Les colonnes C et D doivent IMPERATIVEMENT contenir des données.
3) Créez un UserForm
4) Dans le UserForm créez 2 ComboBox et 1 CommandButton avec pour proprété (Name)
respectivement : ComboBox1 ComboBox2 CommandButton1
5) Dans la fenêtre de code du UserForm copiez le code suivant
Code:
Private Sub CommandButton1_Click()
Dim A$
Dim B$
Dim S As Worksheet
Dim lastLig&
Dim R As Range
Dim var
Dim i&
On Error GoTo Erreur
Application.ScreenUpdating = False
A$ = ComboBox1.SelText
B$ = ComboBox2.SelText
With ThisWorkbook
  .Sheets(FEUILLE).Copy after:=Sheets(.Sheets.Count)
End With
Set S = ActiveSheet
If A$ = "" And B$ = "" Or _
      A$ = TOUS And B$ = TOUS Then
  Unload Me
  Exit Sub
End If
If A$ <> TOUS And A$ <> "" Then
  lastLig& = S.UsedRange.Rows.Count
  Set R = S.Range("c1:c" & lastLig& & "")
  var = R
  For i& = lastLig& To 1 Step -1
    If var(i&, 1) <> A$ Then S.Rows(i&).Delete
  Next i&
End If
If B$ <> TOUS And B$ <> "" Then
  lastLig& = S.UsedRange.Rows.Count
  Set R = S.Range("d1:d" & lastLig& & "")
  var = R
  For i& = lastLig& To 1 Step -1
    If var(i&, 1) <> B$ Then S.Rows(i&).Delete
  Next i&
End If
S.[a1].Select
ActiveWindow.ScrollRow = 1
Erreur:
Application.ScreenUpdating = True
Unload Me
End Sub

Private Sub UserForm_Initialize()
Dim var
Dim i&
Dim j&
Dim T()
With ThisWorkbook.Sheets(FEUILLE)
  .Activate
    '--- ComboBox1 colonne C ---
  var = .Range("c1:c" & .[c65536].End(xlUp).Row)
  Call algoTri(LBound(var, 1), UBound(var, 1), var)
  j& = 2
  ReDim T(1 To j&)
  T(1) = TOUS
  T(2) = var(1, 1)
  For i& = 2 To UBound(var, 1) - 1
    If var(i& + 1, 1) <> var(i&, 1) Then
      j& = j& + 1
      ReDim Preserve T(1 To j&)
      T(j&) = var(i& + 1, 1)
    End If
  Next i&
  With ComboBox1
    .List() = T
    .Text = T(1)
    If UBound(T) > 40 Then
      .ListRows = 40
    Else
      .ListRows = UBound(T)
    End If
  End With
    '--- ComboBox2 colonne D ---
  Erase T
  var = .Range("d1:d" & .[c65536].End(xlUp).Row)
  Call algoTri(LBound(var, 1), UBound(var, 1), var)
  j& = 2
  ReDim T(1 To j&)
  T(1) = TOUS
  T(2) = var(1, 1)
  For i& = 2 To UBound(var, 1) - 1
    If var(i& + 1, 1) <> var(i&, 1) Then
      j& = j& + 1
      ReDim Preserve T(1 To j&)
      T(j&) = var(i& + 1, 1)
    End If
  Next i&
  With ComboBox2
    .List() = T
    .Text = T(1)
    If UBound(T) > 40 Then
      .ListRows = 40
    Else
      .ListRows = UBound(T)
    End If
  End With
End With
End Sub
6) Lancez la macro "demarrer"

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Réponses
18
Affichages
797
Réponses
8
Affichages
462

Statistiques des forums

Discussions
312 581
Messages
2 089 916
Membres
104 304
dernier inscrit
halo palo