OVH Cloud OVH Cloud

combobox(ordre alpha)

7 réponses
Avatar
petchy
bonjour
comment mettre par ordre alphab=E9tique un combobox qui se=20
trouve dans un USF

7 réponses

Avatar
docm
Bonjour.

Sous toutes réserves,
Il n'y a pas de classement alphabétique intégré dans les contrôles sur
Excel.
Tu dois classer les éléments en utilisant une fonction extérieure au
combobox, par exemple en utilisant les capacités de tri sur une feuille
Excel.

Amicalement.


"petchy" wrote in message
news:10b3f01c440a0$dac0f400$
bonjour
comment mettre par ordre alphabétique un combobox qui se
trouve dans un USF
Avatar
michdenis
Bonjour petchy,


Voici 3 façons de faire :

Le premier exemple si ta plage de cellules contenant ton combobox n'est pas énorme.

Le deuxième exemple est plus rapide sur une grande plage de cellule mais requiert d'ajouter une référence au projet.
Le deuxième exemple vient en 2 versions selon qu'un étiquette est présente ou non dans ta plage de cellules contenu dans
ton combobox.

Amuse-toi bien,

Salutations!



************ PREMIER EXEMPLE****************

Voici un exemple comment trier par ordre croissant le contenu
d'un combobox avec l'aide d'une fonction

Si tu utilises ceci, tu ne dois pas utiliser la propriété "RowSource"
du combobox pour définir son contenu.

Tu dois adapter le nom de la feuille et la plage de cellules définies
dans cette exemple selon ton projet.

'---------------------------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Tblo As Variant

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

Me.ComboBox1.List = BubbleSort(Tblo)

Set Rg = Nothing

End Sub
'---------------------------------------------------------------

' À copier dans un Module Standard

Public Function BubbleSort(List As Variant)

Dim First As Integer, Last As Integer
Dim i As Integer, j As Integer
Dim Temp

First = LBound(List)
Last = UBound(List)
For i = First To Last - 1
For j = i + 1 To Last
If List(i, 1) > List(j, 1) Then
Temp = List(j, 1)
List(j, 1) = List(i, 1)
List(i, 1) = Temp
End If
Next j
Next i
BubbleSort = List
End Function
'---------------------------------------------------------------


************ DEUXIÈME EXEMPLE****************

À l'aide d'une fonction utilisant ADO (activex data objet), il est
possible de combiner plusieurs opérations dans la même :

A ) Éliminer les doublons
B ) Trier les items du combobox par ordre croissant
C ) Éliminer les lignes(entrées) vides si il y en a dans la plage de cellules.

Pour ce faire, ajouter la bibliothèque suivante à ton projet :
"Microsoft Activex Data Object 2.0 Librairy"

Le nom de la feuille et la plage de cellules doivent être adapté
selon ton projet.

Selon que ta plage de cellules a une étiquette de colonne tu devras
utiliser dans cette ligne de code qui fait référence à une fonction différente...

Me.ComboBox1.List = MaListe(Rg, Fichier) 'Avec étiquette

OU

Me.ComboBox1.List = MaListe1(Rg, Fichier) 'Sans étiquette


à copier dans le module du formulaire
'---------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Fichier As Workbook

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With

Me.ComboBox1.List = MaListe(Rg, Fichier)

Set Fichier = Nothing: Set Rg = Nothing

End Sub
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules CONTIENT une étiquette de colonne, utilise ceci :
'---------------------------------------------
Public Function MaListe(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomColonne As String

Rg.Name = Rg(1, 1).Text
NomColonne = Fichier.Names(Rg(1, 1).Text).Name

Requete = "SELECT " & NomColonne & " From " & NomColonne & "" _
& vbCrLf & "Where " & NomColonne & " <> Null " & vbCrLf & _
"Group By " & NomColonne & " ORDER By " & NomColonne & ""

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe = Application.Transpose(Rst.GetRows)
ThisWorkbook.Names(Rg(1, 1).Text).Delete
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules NE CONTIENT PAS d'étiquette de colonne, utilise ceci :
'---------------------------------------------
Public Function MaListe1(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------



************** DAO SOLUTION******************



Tu ajoutes la bibliothèque suivante ;
"Microsoft DAO 3.51 Objects Librairy"

ATTENTION : Vous allez éprouver des difficultés si les données
de la plage n'appartiennent pas au même type comme par
exemple du Numérique avec du texte. La liste ne contiendra
qu'un type de données...

2 Procédures selon que ta colonne a une étiquette de colonnes ou non.

Si ta plage de cellules a une étiquette de colonne
L'étiquette ne fera pas parti de la liste du combobox

'-------------------------------------------
Private Sub UserForm_Initialize()
'Avec Étiquettes de colonnes
Dim bd As Database, Rst As Recordset, Rg As Range
Dim Requete As String, Titre As String

With Worksheets("Denis")
Set Rg = .Range("A1:A" & .Range("A65356").End(xlUp).Row)
Rg.Name = "NomColonne"
Titre = Rg(1, 1).Text
End With

Set bd = OpenDatabase(ThisWorkbook.Name, False, False, "excel 8.0")

Requete = "SELECT " & Titre & " From NomColonne " & vbCrLf & _
"Where " & Titre & " <> Null " & vbCrLf & _
"Group By " & Titre & " ORDER By " & Titre & ""

Set Rst = bd.OpenRecordset(Requete)
Rst.MoveLast
Rst.MoveFirst
Rst.MoveNext

Do Until Rst.EOF
Me.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop

Rst.Close
bd.Close
Set Rg = Nothing
Set Rst = Nothing
Set bd = Nothing

End Sub
'-------------------------------------------


Sans étiquettes de colonne, la première cellule de la plage signifiée
dans la procédure doit être vide. Avec DAO, on ne peut spécifier
explicitement comme ADO que l'étiquette est absente. Pour DAO,
la première donnée est résevée au nom du champ.

'--------------------------------------------
Private Sub UserForm_Initialize()

'Sans étiquettes de colonnes

Dim bd As Database, Rst As Recordset, Rg As Range
Dim Requete As String

With Worksheets("Denis")
.Range("A1:A" & .Range("A65356").End(xlUp).Row).Name = "NomColonne"
End With

Set bd = OpenDatabase(ThisWorkbook.Name, False, False, "excel 8.0")

Requete = "SELECT F1 From NomColonne " & vbCrLf & _
"Where F1 <> Null " & vbCrLf & _
"Group By F1 ORDER By F1"

Set Rst = bd.OpenRecordset(Requete)
Rst.MoveLast
Rst.MoveFirst

Do Until Rst.EOF
Me.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop

Rst.Close 'ferme le recordset
bd.Close
'Libère la mémoir des objets
Set Rst = Nothing
Set bd = Nothing
Set Rg = Nothing

End Sub
'--------------------------------------------




"petchy" a écrit dans le message de
news:10b3f01c440a0$dac0f400$
bonjour
comment mettre par ordre alphabétique un combobox qui se
trouve dans un USF
Avatar
J-Dan
bonjour,

je suis autant impressionné par la rapidité de la réponse
de Michdenis (rappelons qu'hier c'etait dimanche, qu'il
faisait beau...), laquelle reponse ne se contentait pas
de botter en touche (3 options présentées) que par
l'absence de remerciements (à l'heure actuelle).
Alors, merci Michdenis !


question subsidiaire qui concerne un autre fil (sur les
compteurs au 100 ème de seconde). Chez moi, ça ne marche
pas (Excel 2000, Win Xp), j'ai toujours des "00" en
centièmes.
Why that ?


-----Message d'origine-----
Bonjour petchy,


Voici 3 façons de faire :

Le premier exemple si ta plage de cellules contenant ton
combobox n'est pas énorme.


Le deuxième exemple est plus rapide sur une grande plage
de cellule mais requiert d'ajouter une référence au

projet.
Le deuxième exemple vient en 2 versions selon qu'un
étiquette est présente ou non dans ta plage de cellules

contenu dans
ton combobox.

Amuse-toi bien,

Salutations!



************ PREMIER EXEMPLE****************

Voici un exemple comment trier par ordre croissant le
contenu

d'un combobox avec l'aide d'une fonction

Si tu utilises ceci, tu ne dois pas utiliser la
propriété "RowSource"

du combobox pour définir son contenu.

Tu dois adapter le nom de la feuille et la plage de
cellules définies

dans cette exemple selon ton projet.

'--------------------------------------------------------
-------

Private Sub UserForm_Initialize()

Dim Rg As Range, Tblo As Variant

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End
(xlUp).Row)

Tblo = Rg
End With

Me.ComboBox1.List = BubbleSort(Tblo)

Set Rg = Nothing

End Sub
'--------------------------------------------------------
-------


' À copier dans un Module Standard

Public Function BubbleSort(List As Variant)

Dim First As Integer, Last As Integer
Dim i As Integer, j As Integer
Dim Temp

First = LBound(List)
Last = UBound(List)
For i = First To Last - 1
For j = i + 1 To Last
If List(i, 1) > List(j, 1) Then
Temp = List(j, 1)
List(j, 1) = List(i, 1)
List(i, 1) = Temp
End If
Next j
Next i
BubbleSort = List
End Function
'--------------------------------------------------------
-------



************ DEUXIÈME EXEMPLE****************

À l'aide d'une fonction utilisant ADO (activex data
objet), il est

possible de combiner plusieurs opérations dans la même :

A ) Éliminer les doublons
B ) Trier les items du combobox par ordre croissant
C ) Éliminer les lignes(entrées) vides si il y en a dans
la plage de cellules.


Pour ce faire, ajouter la bibliothèque suivante à ton
projet :

"Microsoft Activex Data Object 2.0 Librairy"

Le nom de la feuille et la plage de cellules doivent
être adapté

selon ton projet.

Selon que ta plage de cellules a une étiquette de
colonne tu devras

utiliser dans cette ligne de code qui fait référence à
une fonction différente...


Me.ComboBox1.List = MaListe(Rg, Fichier) 'Avec étiquette

OU

Me.ComboBox1.List = MaListe1(Rg, Fichier) 'Sans étiquette


à copier dans le module du formulaire
'---------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Fichier As Workbook

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End
(xlUp).Row)

End With

Me.ComboBox1.List = MaListe(Rg, Fichier)

Set Fichier = Nothing: Set Rg = Nothing

End Sub
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules CONTIENT une étiquette de
colonne, utilise ceci :

'---------------------------------------------
Public Function MaListe(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomColonne As String

Rg.Name = Rg(1, 1).Text
NomColonne = Fichier.Names(Rg(1, 1).Text).Name

Requete = "SELECT " & NomColonne & " From " & NomColonne
& "" _

& vbCrLf & "Where " & NomColonne & " <> Null " &
vbCrLf & _

"Group By " & NomColonne & " ORDER By " & NomColonne
& ""


Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""

Rst.Open Requete, Conn, adOpenForwardOnly,
adLockOptimistic


MaListe = Application.Transpose(Rst.GetRows)
ThisWorkbook.Names(Rg(1, 1).Text).Delete
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules NE CONTIENT PAS d'étiquette de
colonne, utilise ceci :

'---------------------------------------------
Public Function MaListe1(Rg As Range, Fichier As
Workbook)


Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly,
adLockOptimistic


MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------



************** DAO SOLUTION******************



Tu ajoutes la bibliothèque suivante ;
"Microsoft DAO 3.51 Objects Librairy"

ATTENTION : Vous allez éprouver des difficultés si les
données

de la plage n'appartiennent pas au même type comme par
exemple du Numérique avec du texte. La liste ne
contiendra

qu'un type de données...

2 Procédures selon que ta colonne a une étiquette de
colonnes ou non.


Si ta plage de cellules a une étiquette de colonne
L'étiquette ne fera pas parti de la liste du combobox

'-------------------------------------------
Private Sub UserForm_Initialize()
'Avec Étiquettes de colonnes
Dim bd As Database, Rst As Recordset, Rg As Range
Dim Requete As String, Titre As String

With Worksheets("Denis")
Set Rg = .Range("A1:A" & .Range("A65356").End
(xlUp).Row)

Rg.Name = "NomColonne"
Titre = Rg(1, 1).Text
End With

Set bd = OpenDatabase(ThisWorkbook.Name, False,
False, "excel 8.0")


Requete = "SELECT " & Titre & " From NomColonne " &
vbCrLf & _

"Where " & Titre & " <> Null " & vbCrLf
& _

"Group By " & Titre & " ORDER By " &
Titre & ""


Set Rst = bd.OpenRecordset(Requete)
Rst.MoveLast
Rst.MoveFirst
Rst.MoveNext

Do Until Rst.EOF
Me.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop

Rst.Close
bd.Close
Set Rg = Nothing
Set Rst = Nothing
Set bd = Nothing

End Sub
'-------------------------------------------


Sans étiquettes de colonne, la première cellule de la
plage signifiée

dans la procédure doit être vide. Avec DAO, on ne peut
spécifier

explicitement comme ADO que l'étiquette est absente.
Pour DAO,

la première donnée est résevée au nom du champ.

'--------------------------------------------
Private Sub UserForm_Initialize()

'Sans étiquettes de colonnes

Dim bd As Database, Rst As Recordset, Rg As Range
Dim Requete As String

With Worksheets("Denis")
.Range("A1:A" & .Range("A65356").End
(xlUp).Row).Name = "NomColonne"

End With

Set bd = OpenDatabase(ThisWorkbook.Name, False,
False, "excel 8.0")


Requete = "SELECT F1 From NomColonne " & vbCrLf & _
"Where F1 <> Null " & vbCrLf & _
"Group By F1 ORDER By F1"

Set Rst = bd.OpenRecordset(Requete)
Rst.MoveLast
Rst.MoveFirst

Do Until Rst.EOF
Me.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop

Rst.Close 'ferme le recordset
bd.Close
'Libère la mémoir des objets
Set Rst = Nothing
Set bd = Nothing
Set Rg = Nothing

End Sub
'--------------------------------------------




"petchy" a écrit
dans le message de

news:10b3f01c440a0$dac0f400$
bonjour
comment mettre par ordre alphabétique un combobox qui se
trouve dans un USF


.



Avatar
michdenis
Bonjour J-Dan,

Attention au séparateur décimal

le format est : hh:mm:ss.00 et le point devant les 00 doit être le séparateur décimal reconnu par excel. (le point ou
la virgule)

à titre d'exemple :

Entre la formule suivante dans une cellule : = Maintenant()
Formate la cellule de cette façon : hh:mm:ss.00

et tu devrais voir s'afficher dans la cellule (expérience mené sur excel 2002) les dixièmes et les centièmes de seconde.
Si tu utilises la touche F9, leur valeur se met à jour au même titre que le reste du contenu de la cellule. De plus, si
tu additionnes 2 cellules ayant ce format, excel tiendra compte des dixièmes et centièmes dans son calcul. Si le nombre
d'heures est étale ou supérieur à 24, utilise plutôt ce format [hh]:mm:ss.00 .

Si le résultat n'est pas au rendez-vous, tu as sûrement un autre type de problème sur ta bécane ...!


Salutations!


"J-Dan" a écrit dans le message de news:1124601c44165$a7a1aef0$
bonjour,

je suis autant impressionné par la rapidité de la réponse
de Michdenis (rappelons qu'hier c'etait dimanche, qu'il
faisait beau...), laquelle reponse ne se contentait pas
de botter en touche (3 options présentées) que par
l'absence de remerciements (à l'heure actuelle).
Alors, merci Michdenis !


question subsidiaire qui concerne un autre fil (sur les
compteurs au 100 ème de seconde). Chez moi, ça ne marche
pas (Excel 2000, Win Xp), j'ai toujours des "00" en
centièmes.
Why that ?


-----Message d'origine-----
Bonjour petchy,


Voici 3 façons de faire :

Le premier exemple si ta plage de cellules contenant ton
combobox n'est pas énorme.


Le deuxième exemple est plus rapide sur une grande plage
de cellule mais requiert d'ajouter une référence au

projet.
Le deuxième exemple vient en 2 versions selon qu'un
étiquette est présente ou non dans ta plage de cellules

contenu dans
ton combobox.

Amuse-toi bien,

Salutations!



************ PREMIER EXEMPLE****************

Voici un exemple comment trier par ordre croissant le
contenu

d'un combobox avec l'aide d'une fonction

Si tu utilises ceci, tu ne dois pas utiliser la
propriété "RowSource"

du combobox pour définir son contenu.

Tu dois adapter le nom de la feuille et la plage de
cellules définies

dans cette exemple selon ton projet.

'--------------------------------------------------------
-------

Private Sub UserForm_Initialize()

Dim Rg As Range, Tblo As Variant

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End
(xlUp).Row)

Tblo = Rg
End With

Me.ComboBox1.List = BubbleSort(Tblo)

Set Rg = Nothing

End Sub
'--------------------------------------------------------
-------


' À copier dans un Module Standard

Public Function BubbleSort(List As Variant)

Dim First As Integer, Last As Integer
Dim i As Integer, j As Integer
Dim Temp

First = LBound(List)
Last = UBound(List)
For i = First To Last - 1
For j = i + 1 To Last
If List(i, 1) > List(j, 1) Then
Temp = List(j, 1)
List(j, 1) = List(i, 1)
List(i, 1) = Temp
End If
Next j
Next i
BubbleSort = List
End Function
'--------------------------------------------------------
-------



************ DEUXIÈME EXEMPLE****************

À l'aide d'une fonction utilisant ADO (activex data
objet), il est

possible de combiner plusieurs opérations dans la même :

A ) Éliminer les doublons
B ) Trier les items du combobox par ordre croissant
C ) Éliminer les lignes(entrées) vides si il y en a dans
la plage de cellules.


Pour ce faire, ajouter la bibliothèque suivante à ton
projet :

"Microsoft Activex Data Object 2.0 Librairy"

Le nom de la feuille et la plage de cellules doivent
être adapté

selon ton projet.

Selon que ta plage de cellules a une étiquette de
colonne tu devras

utiliser dans cette ligne de code qui fait référence à
une fonction différente...


Me.ComboBox1.List = MaListe(Rg, Fichier) 'Avec étiquette

OU

Me.ComboBox1.List = MaListe1(Rg, Fichier) 'Sans étiquette


à copier dans le module du formulaire
'---------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Fichier As Workbook

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End
(xlUp).Row)

End With

Me.ComboBox1.List = MaListe(Rg, Fichier)

Set Fichier = Nothing: Set Rg = Nothing

End Sub
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules CONTIENT une étiquette de
colonne, utilise ceci :

'---------------------------------------------
Public Function MaListe(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomColonne As String

Rg.Name = Rg(1, 1).Text
NomColonne = Fichier.Names(Rg(1, 1).Text).Name

Requete = "SELECT " & NomColonne & " From " & NomColonne
& "" _

& vbCrLf & "Where " & NomColonne & " <> Null " &
vbCrLf & _

"Group By " & NomColonne & " ORDER By " & NomColonne
& ""


Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""

Rst.Open Requete, Conn, adOpenForwardOnly,
adLockOptimistic


MaListe = Application.Transpose(Rst.GetRows)
ThisWorkbook.Names(Rg(1, 1).Text).Delete
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules NE CONTIENT PAS d'étiquette de
colonne, utilise ceci :

'---------------------------------------------
Public Function MaListe1(Rg As Range, Fichier As
Workbook)


Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly,
adLockOptimistic


MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------



************** DAO SOLUTION******************



Tu ajoutes la bibliothèque suivante ;
"Microsoft DAO 3.51 Objects Librairy"

ATTENTION : Vous allez éprouver des difficultés si les
données

de la plage n'appartiennent pas au même type comme par
exemple du Numérique avec du texte. La liste ne
contiendra

qu'un type de données...

2 Procédures selon que ta colonne a une étiquette de
colonnes ou non.


Si ta plage de cellules a une étiquette de colonne
L'étiquette ne fera pas parti de la liste du combobox

'-------------------------------------------
Private Sub UserForm_Initialize()
'Avec Étiquettes de colonnes
Dim bd As Database, Rst As Recordset, Rg As Range
Dim Requete As String, Titre As String

With Worksheets("Denis")
Set Rg = .Range("A1:A" & .Range("A65356").End
(xlUp).Row)

Rg.Name = "NomColonne"
Titre = Rg(1, 1).Text
End With

Set bd = OpenDatabase(ThisWorkbook.Name, False,
False, "excel 8.0")


Requete = "SELECT " & Titre & " From NomColonne " &
vbCrLf & _

"Where " & Titre & " <> Null " & vbCrLf
& _

"Group By " & Titre & " ORDER By " &
Titre & ""


Set Rst = bd.OpenRecordset(Requete)
Rst.MoveLast
Rst.MoveFirst
Rst.MoveNext

Do Until Rst.EOF
Me.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop

Rst.Close
bd.Close
Set Rg = Nothing
Set Rst = Nothing
Set bd = Nothing

End Sub
'-------------------------------------------


Sans étiquettes de colonne, la première cellule de la
plage signifiée

dans la procédure doit être vide. Avec DAO, on ne peut
spécifier

explicitement comme ADO que l'étiquette est absente.
Pour DAO,

la première donnée est résevée au nom du champ.

'--------------------------------------------
Private Sub UserForm_Initialize()

'Sans étiquettes de colonnes

Dim bd As Database, Rst As Recordset, Rg As Range
Dim Requete As String

With Worksheets("Denis")
.Range("A1:A" & .Range("A65356").End
(xlUp).Row).Name = "NomColonne"

End With

Set bd = OpenDatabase(ThisWorkbook.Name, False,
False, "excel 8.0")


Requete = "SELECT F1 From NomColonne " & vbCrLf & _
"Where F1 <> Null " & vbCrLf & _
"Group By F1 ORDER By F1"

Set Rst = bd.OpenRecordset(Requete)
Rst.MoveLast
Rst.MoveFirst

Do Until Rst.EOF
Me.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop

Rst.Close 'ferme le recordset
bd.Close
'Libère la mémoir des objets
Set Rst = Nothing
Set bd = Nothing
Set Rg = Nothing

End Sub
'--------------------------------------------




"petchy" a écrit
dans le message de

news:10b3f01c440a0$dac0f400$
bonjour
comment mettre par ordre alphabétique un combobox qui se
trouve dans un USF


.



Avatar
J-Dan
merci pour ta réponse, et pardon de pousuivre une
conversation en dehors de son fil.

Ce que tu me proposes fonctionne parfaitement. Mon
problème doit se situer au niveau de la macro :

Sub compteur()

Temps = Time 'j'ai essayé aussi avec "Now"
' ** routine quelconque **
Temps = Time - Temps
[D1] = Format(Temps, "mm:ss.00")

End Sub

En "D1", j'obtiens quelque chose comme 12:06.00 !
En revanche, si en "D1" je saisis à nouveau =MAINTENANT
(), les centièmes sont présents.

Je sèche lamentablement !

-----Message d'origine-----
Bonjour J-Dan,

Attention au séparateur décimal

le format est : hh:mm:ss.00 et le point devant les 00
doit être le séparateur décimal reconnu par excel. (le

point ou
la virgule)

à titre d'exemple :

Entre la formule suivante dans une cellule : = Maintenant
()

Formate la cellule de cette façon : hh:mm:ss.00

et tu devrais voir s'afficher dans la cellule
(expérience mené sur excel 2002) les dixièmes et les

centièmes de seconde.
Si tu utilises la touche F9, leur valeur se met à jour
au même titre que le reste du contenu de la cellule. De

plus, si
tu additionnes 2 cellules ayant ce format, excel tiendra
compte des dixièmes et centièmes dans son calcul. Si le

nombre
d'heures est étale ou supérieur à 24, utilise plutôt ce
format [hh]:mm:ss.00 .


Si le résultat n'est pas au rendez-vous, tu as sûrement
un autre type de problème sur ta bécane ...!



Salutations!


Avatar
michdenis
Bonjour J-Dan,

Voici un exemple trafiqué pour obtenir ce que tu veux :


A ) à sa face même, la fonction "Now()" et TimeValue() dans une fenêtre VBA gèrent seulement des heures H:M:S . Il est
difficile de leur faire afficher les centièmes de secondes dans une cellule.

B ) pour ce qui est du format à transmettre à la cellule avec une ligne de code comme celle-ci :
[D1].NumberFormat = "HH:mm:ss.00"

Cela fonctionne très bien si le séparateur décimale est le point. Si c'est la virgule utilisé dans la feuille de
calcul, cela ne semble pas fonctionner !!!


C ) voici l'exemple : En utilisant l'api GetTickCount , il est possible de retourner dans la feuille une valeur au
millième de seconde ...mais ce n'est pas évident parce que ce n'est pas toutes les fonctions qui retournent une valeur
que l'on peut formater au millième....!!!


'Déclaration de l'API dans le haut d'un module
Public Declare Function GetTickCount Lib "kernel32" () As Long

'------------------------
Sub compteur()

Dim A As Double, B As Double, C As Double
Dim D As Integer, E As Integer, F As String
B = 0
A = GetTickCount

'Pour provoquer un délai de 2 secondes ...
Application.Wait (Now + TimeValue("0:00:02"))
B = GetTickCount
C = B - A
D = Int(C / 1000)
E = C Mod 1000

'la paire de "00:00:" c'est pour compléter
'la donnée à être transmise à la cellule
'soit heure:Minutes:Secondes.Millième Sec.
F = "00:00:" & D & "." & E
[D1].NumberFormat = "HH:mm:ss.00"
[D1] = F

End Sub
'------------------------


Salutations!





"J-Dan" a écrit dans le message de news:113db01c44183$4707ef00$
merci pour ta réponse, et pardon de pousuivre une
conversation en dehors de son fil.

Ce que tu me proposes fonctionne parfaitement. Mon
problème doit se situer au niveau de la macro :

Sub compteur()

Temps = Time 'j'ai essayé aussi avec "Now"
' ** routine quelconque **
Temps = Time - Temps
[D1] = Format(Temps, "mm:ss.00")

End Sub

En "D1", j'obtiens quelque chose comme 12:06.00 !
En revanche, si en "D1" je saisis à nouveau =MAINTENANT
(), les centièmes sont présents.

Je sèche lamentablement !

-----Message d'origine-----
Bonjour J-Dan,

Attention au séparateur décimal

le format est : hh:mm:ss.00 et le point devant les 00
doit être le séparateur décimal reconnu par excel. (le

point ou
la virgule)

à titre d'exemple :

Entre la formule suivante dans une cellule : = Maintenant
()

Formate la cellule de cette façon : hh:mm:ss.00

et tu devrais voir s'afficher dans la cellule
(expérience mené sur excel 2002) les dixièmes et les

centièmes de seconde.
Si tu utilises la touche F9, leur valeur se met à jour
au même titre que le reste du contenu de la cellule. De

plus, si
tu additionnes 2 cellules ayant ce format, excel tiendra
compte des dixièmes et centièmes dans son calcul. Si le

nombre
d'heures est étale ou supérieur à 24, utilise plutôt ce
format [hh]:mm:ss.00 .


Si le résultat n'est pas au rendez-vous, tu as sûrement
un autre type de problème sur ta bécane ...!



Salutations!


Avatar
J-Dan
merci Denis,
ça marche parfaitement et le code est léger.
-----Message d'origine-----
Bonjour J-Dan,

Voici un exemple trafiqué pour obtenir ce que tu veux :


A ) à sa face même, la fonction "Now()" et TimeValue()
dans une fenêtre VBA gèrent seulement des heures H:M:S .

Il est
difficile de leur faire afficher les centièmes de
secondes dans une cellule.


B ) pour ce qui est du format à transmettre à la cellule
avec une ligne de code comme celle-ci :

[D1].NumberFormat = "HH:mm:ss.00"

Cela fonctionne très bien si le séparateur décimale
est le point. Si c'est la virgule utilisé dans la feuille

de
calcul, cela ne semble pas fonctionner !!!


C ) voici l'exemple : En utilisant l'api GetTickCount ,
il est possible de retourner dans la feuille une valeur au

millième de seconde ...mais ce n'est pas évident parce
que ce n'est pas toutes les fonctions qui retournent une

valeur
que l'on peut formater au millième....!!!


'Déclaration de l'API dans le haut d'un module
Public Declare Function GetTickCount Lib "kernel32" ()
As Long


'------------------------
Sub compteur()

Dim A As Double, B As Double, C As Double
Dim D As Integer, E As Integer, F As String
B = 0
A = GetTickCount

'Pour provoquer un délai de 2 secondes ...
Application.Wait (Now + TimeValue("0:00:02"))
B = GetTickCount
C = B - A
D = Int(C / 1000)
E = C Mod 1000

'la paire de "00:00:" c'est pour compléter
'la donnée à être transmise à la cellule
'soit heure:Minutes:Secondes.Millième Sec.
F = "00:00:" & D & "." & E
[D1].NumberFormat = "HH:mm:ss.00"
[D1] = F

End Sub
'------------------------


Salutations!





"J-Dan" a écrit
dans le message de news:113db01c44183$4707ef00

$
merci pour ta réponse, et pardon de pousuivre une
conversation en dehors de son fil.

Ce que tu me proposes fonctionne parfaitement. Mon
problème doit se situer au niveau de la macro :

Sub compteur()

Temps = Time 'j'ai essayé aussi avec "Now"
' ** routine quelconque **
Temps = Time - Temps
[D1] = Format(Temps, "mm:ss.00")

End Sub

En "D1", j'obtiens quelque chose comme 12:06.00 !
En revanche, si en "D1" je saisis à nouveau =MAINTENANT
(), les centièmes sont présents.

Je sèche lamentablement !

-----Message d'origine-----
Bonjour J-Dan,

Attention au séparateur décimal

le format est : hh:mm:ss.00 et le point devant les 00
doit être le séparateur décimal reconnu par excel. (le

point ou
la virgule)

à titre d'exemple :

Entre la formule suivante dans une cellule : =
Maintenant


()
Formate la cellule de cette façon : hh:mm:ss.00

et tu devrais voir s'afficher dans la cellule
(expérience mené sur excel 2002) les dixièmes et les

centièmes de seconde.
Si tu utilises la touche F9, leur valeur se met à jour
au même titre que le reste du contenu de la cellule. De

plus, si
tu additionnes 2 cellules ayant ce format, excel tiendra
compte des dixièmes et centièmes dans son calcul. Si le

nombre
d'heures est étale ou supérieur à 24, utilise plutôt ce
format [hh]:mm:ss.00 .


Si le résultat n'est pas au rendez-vous, tu as sûrement
un autre type de problème sur ta bécane ...!



Salutations!



.