Salut Anne et le Forum...
Merci pour cet exemple, c'est très bien de montrer cette possibilité de travailler directement en intégrant des tableaux entier en variable "dynamic array".
Voici ce que je fais pour construire une table de trois colonnes indéxées sequentiellement qui me génère deux listBox dans un UserForm et me permets de faire diverses Stats en temps rééls sur la mémoire, sans consulter la feuille... La ListBox1 étant la récupération de ma liste de fournisseurs dans une feuille qui se créé donc à l'initialisation du USF. (Avec Tri Alpha et suppression de Doublon)
Quand on click sur cette ListBox1, elle génère la Listbox2 qui présentera les diverses comptes imputés à ce fournisseur sélectionné.
Ceci se fait toujours avec les données stockées en dynamic array, avec de nouveau un Tri et suppression de doublon.
Lorsque l'on sélectionne un de ces Comptes, je récupère la somme globale de ce Fournisseur avec ce Compte dans une label. Je compte aussi le nombre de d'écritures... etc etc, Depuis l'initialisation, toutes les données nécessaires sont stockées dans ce tableau en trois colonnes, donc plus de lecture sur la feuille...
Voici les codes successifs. (A titre d'info/exemple simplement, car un simple copié/collé ne risquera pas de marcher)
Option Explicit
Public Tab1() As String
Public Tab2() As String
Public Tab3(1 To 100) As String
Public Tab4(1 To 100) As String
Private Sub UserForm_Initialize()
Dim i As Integer
Dim plage As Range
Dim Cell As Range
Dim Item As String
If Sheets(1).AutoFilterMode Then Sheets(1).AutoFilterMode = False
ListBoxSuppliers.ColumnCount = 1
Set plage = ThisWorkbook.Sheets("Database").Range("K3:" _
& ThisWorkbook.Sheets("Database").Range("K65536").End(xlUp).Address)
ReDim Tab1(1 To plage.Count, 1 To 3)
i = 0
For Each Cell In plage
i = i + 1
With Cell
Tab1(i, 1) = .Text
Tab1(i, 2) = .Offset(0, -5).Text
Tab1(i, 3) = .Offset(0, 8).Value
End With
Next
TriListBox1
DoublonSuppliers
End Sub
Sub TriListBox1()
Dim ValMin As Integer, ValSup As Integer
Dim i As Integer, j As Integer, ii As Integer, iii As Integer
Dim t1 As String, t2 As String, t3 As String
ValMin = LBound(Tab1)
ValSup = UBound(Tab1)
For i = ValMin To ValSup
For j = ValMin + ii To ValSup
If Tab1(i, 1) > Tab1(j, 1) Then
t1 = Tab1(j, 1): t2 = Tab1(j, 2): t3 = Tab1(j, 3)
Tab1(j, 1) = Tab1(i, 1): Tab1(j, 2) = Tab1(i, 2): Tab1(j, 3) = Tab1(i, 3)
Tab1(i, 1) = t1: Tab1(i, 2) = t2: Tab1(i, 3) = t3
End If
Next j
ii = ii + 1
Next i
End Sub
Sub DoublonSuppliers()
Dim i As Integer, ii As Integer, iii As Integer
Dim Item As String
Item = ""
Me.ListBoxSuppliers.Clear
For i = LBound(Tab1) To UBound(Tab1)
If Item = Tab1(i, 1) Then
ii = ii + 1
Else
Item = Tab1(i, 1)
Me.ListBoxSuppliers.AddItem Item
iii = iii + 1
Tab3(iii) = i
ii = 1
End If
Next i
Tab3(iii + 1) = i - 1
End Sub
Private Sub ListBoxSuppliers_Click()
Dim ValMin As Integer
Dim ValSup As Integer
Dim Item As String
Dim i As Integer
ValMin = Tab3(Me.ListBoxSuppliers.ListIndex + 1)
Item = Tab1(ValMin, 1)
Me.ListBoxAccounts.Clear
ValSup = Tab3(Me.ListBoxSuppliers.ListIndex + 2) - Tab3(Me.ListBoxSuppliers.ListIndex + 1)
ReDim Tab2(1 To ValSup, 1 To 2)
Do While Item = Tab1(ValMin, 1)
i = i + 1
Tab2(i, 1) = Tab1(ValMin, 2)
Tab2(i, 2) = Tab1(ValMin, 3)
ValMin = ValMin + 1
Loop
TriListBox2
DoublonAccounts
End Sub
Sub TriListBox2()
Dim ValMin As Integer, ValSup As Integer
Dim i As Integer, j As Integer, ii As Integer
Dim t1 As String, t2 As String
ValMin = LBound(Tab2)
ValSup = UBound(Tab2)
For i = ValMin To ValSup
For j = ValMin + ii To ValSup
If Tab2(i, 1) > Tab2(j, 1) Then
t1 = Tab2(j, 1): t2 = Tab2(j, 2)
Tab2(j, 1) = Tab2(i, 1): Tab2(j, 2) = Tab2(i, 2)
Tab2(i, 1) = t1: Tab2(i, 2) = t2
End If
Next j
ii = ii + 1
Next i
For i = 1 To ValSup
Debug.Print i, Tab2(i, 1)
Next
End Sub
Sub DoublonAccounts()
Dim i As Integer, ii As Integer, iii As Integer
Dim ValMin As Integer, ValSup As Integer
Dim Item As String
Item = ""
Me.ListBoxAccounts.Clear
ValMin = LBound(Tab2)
ValSup = UBound(Tab2)
For i = ValMin To ValSup
If Item = Tab2(i, 1) Then
ii = ii + 1
Else
Item = Tab2(i, 1)
Me.ListBoxAccounts.AddItem Item
iii = iii + 1
Tab4(iii) = i
ii = 1
End If
Next i
Tab4(iii + 1) = i - 1
End Sub
Private Sub ListBoxAccounts_Click()
Dim ValMin As Integer
Dim ValSup As Integer
Dim Item As String
Dim i As Integer
Dim S As Integer
Dim Somme As Currency
LabelCountAc1 = ListBoxAccounts
ValMin = LBound(Tab2)
ValSup = UBound(Tab2)
S = 0
For i = ValMin To ValSup
If LabelCountAc1 = Tab2(i, 1) Then
S = S + 1
Somme = Somme + Tab2(i, 2)
End If
Next i
LabelCountAc2 = "Number of Input : " & S
LabelBALANCE = "Balance USD : " & Format(Somme, "# ##0.00")
End Sub
Voilà en espérant que çà ne donnera pas mal à la tête à Moa, ou que çà va faire poser des questions par Fabrice !! lol
Bon Allez bonne fin de journée
@+Thierry