Bonjour,

Tiens... nous sommes déjà un vendredi (jour que je dédie aux astuces...)

Le thème est aujourd'hui celui de la "passation", d'un tableau à une combobox ou à une listbox, de tous les articles contenus dans un tableau (ce sera par exemple un cas plus fréquent après un split ...)

Nous savons tous faire la chose en traitant par une boucle sur tous les articles du tableau et en les ajoutant (AddItem) à notre contrôle de destination...

Il s'agit toutefois là d'une méthode relativement lente (et pénalisante lorsque le nombre d'éléments est important)...
L'utilisation de la fonction SendMessage de la librairie User32 de l'Api de Windows permet d'atteindre le même but de manière significativement plus rapide ...

Je vous propose le petit test suivant, qui ne nécessite aucun commentaire autre que ceux qu'il contient dans son code :

Une Form et une combobox nommée Combo1...
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
    hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
    lParam As Any) As Long
 
Private Const LB_ADDSTRING = &H180
Private Const LB_RESETCONTENT = &H184
Private Const CB_ADDSTRING = &H143
Private Const CB_RESETCONTENT = &H14B
Private nombre As Long
 
Private Sub Form_Activate()
  nombre = 50000
  Dim i As Long, mode As String, depart As Double
  Do While mode <> "0" And mode <> "1"
    mode = InputBox("choisissez le mode (0 = String ou 1 = integer")
  Loop
  Select Case mode
    Case 0
      '================================================================================================================
      '                                 DEMO SUR TABLEAU DE STRINGS
      '================================================================================================================
      ReDim tableaustring(nombre) As String
      For i = 0 To nombre
        tableaustring(i) = "coucou " & i
      Next
      MsgBox "nous allons maintenant lancer successivement les 2 méthodes pour ce tableau de" & vbCrLf & _
      "S T R I N G s" & vbCrLf & _
      "et mesurer leur durée d'exécution"
 
      '-----------------------------------------méthode classique-----------------------------------------------------
      Combo1.Clear
      depart = Timer
      Combo1.Visible = False
      For i = 0 To nombre
        Combo1.AddItem tableaustring(i)
      Next
      Combo1.Visible = True
      MsgBox "durée de " & Timer - depart & " par la méthode classique"
      '--------------------------------------méthode par SendMessage---------------------------------------------------
      Combo1.Clear
      depart = Timer
      tableau_vers_box Combo1, tableaustring
      MsgBox "durée de " & Timer - depart & " par la méthode SendMessage"
 
    Case 1
      '================================================================================================================
      '                                 DEMO SUR TABLEAU DE INTEGERS
      '================================================================================================================
      ReDim tableauinteger(nombre + 1) As Long
      For i = 0 To nombre
        tableauinteger(i) = i
      Next
      MsgBox "nous allons maintenant lancer successivement les 2 méthodes pour ce tableau de" & vbCrLf & _
      "I N T E G E R s" & vbCrLf & _
      "et mesurer leur durée d'exécution"
 
            '-----------------------------------------méthode classique-----------------------------------------------------
      Combo1.Clear
      depart = Timer
      Combo1.Visible = False
      For i = 0 To nombre
        Combo1.AddItem tableauinteger(i)
      Next
      Combo1.Visible = True
      MsgBox "durée de " & Timer - depart & " par la méthode classique"
            '--------------------------------------méthode par SendMessage---------------------------------------------------
      Combo1.Clear
      depart = Timer
      tableau_vers_box Combo1, tableauinteger
      MsgBox "durée de " & Timer - depart & " par la méthode SendMessage"
  End Select
End Sub
 
Sub tableau_vers_box(ctrl As Object, T As Variant)
    Dim i As Long, mess As Long, handle As Long
    If TypeOf ctrl Is ComboBox Then
        mess = CB_ADDSTRING
    ElseIf TypeOf ctrl Is ListBox Then
        mess = LB_ADDSTRING
    Else
        Exit Sub
    End If
    handle = ctrl.hWnd
    For i = LBound(T) To UBound(T)
        SendMessage handle, mess, 0, ByVal CStr(T(i))
    Next
End Sub
Lancer et patienter .. comparer ....

Ce procédé ne manque pas d'intérêt lorsque le nombre des éléments est élevé.

Bon week-end à tous.