toujours dans le cadre de mon projet de gestion de consommables.
j’ai un tableau [Tableau1] dans ma feuille « ENTREES » qui trace les entrées en stock :
date entrée
ref conso
etc…
Bien sur il y a parfois plusieurs entrées à la même date
Dans un userform j’ai créé un combobox (ComboBox7). Je voudrais que ce comboBox m’affiche les dates de mes entrées mais sans doublon et trié par ordre croissant
Dois-je obligatoirement faire du VBA ou existe t il un code spécial à mettre directement dans le champ « RowSource » de ma combobox ?
Dans ma UserForm « Test_Mulipage » Onglet « Entrées », je voudrais que ma combobox7 (au-dessus du champ « Date Entrée » m’affiche les dates de ma feuille de calcul « ENTREES » sans doublon et par ordre chronologique.
2ème soucis :
D’ailleurs vous constaterez un bug à partir de la ligne 6, mes dates ne se mettent pas au format dd/mm/yyyy quand je rentre une nouvelle entrée (Userform Ajouter_Entrées_en_stock). J’ai testé des dizaines de solutions, rien à faire, je n’y arrive pas malgré Format(TextBox1, « DD/MM/YYYY »). Si en même temps vous avez également une solution pour ça…
oui, tu as réglé les 2 soucis.
Cependant mon objectif est d’apprendre en même temps et là je ne comprends pas bien.
Pour le 1er soucis « liste déroulante triée sans doublon » j’ai vu que tu avais fait la macro « tri ». Mais je ne la comprends pas du tout, je ne vois dedans aucune référence sur ma colonne « Date entrée », ni comment et quand tu fais appel à cette macro.
Pour le 2ème soucis « format de date » je ne vois pas ce que tu as fait non plus car ma macro est restée telle quelle, le format de mes cellules également.
Re,
Pour le combobox, la macro se trouve dans l’userform qui appele à la fin la macro TRI
Private Sub ComboBox7_DropButtonClick()
Dim f As Worksheet, a(), I%, temp()
Dim mondico As Object
Set f = Sheets("ENTREES")
Set mondico = CreateObject("Scripting.Dictionary")
a = f.Range("A4:A" & f.[A65000].End(xlUp).Row)
For I = LBound(a) To UBound(a)
If a(I, 1) <> "" Then mondico(a(I, 1)) = ""
Next I
temp = mondico.keys
Call tri(temp, LBound(temp), UBound(temp))
ComboBox7.List = temp
End Sub
Pour le problème de date dans l’userform Ajouter Entrées en stock
sur la macro du bouton Ajouter
'Ajout des données dans le tableau
If erreur = 0 Then
Dim ligne As Integer
If remplissage_article_1 = 1 Then
Worksheets("ENTREES").Select
ligne = Sheets("ENTREES").Range("A1000").End(xlUp).Row + 1
'Saisie des données communes
Cells(ligne, 1) = Format(TextBox1.Value, "mm/dd/yyyy") '**ICI LE FORMAT POUR LA DATE**
Cells(ligne, 5) = TextBox4.Value
Cells(ligne, 6) = TextBox5.Value
Cells(ligne, 7) = TextBox6.Value
Re,
VBA c’est la langue de " Shakespeare" Américain, et dans leur environnement les dates sont au format mm/dd/yyy, d’ou la transformation pour nous Français
D’ailleurs, en Angleterre le format de date est identique au notre ( jour en premier suivi du mois)
En fait, le tri ne se fait pas bien. Si tu reprends ton fichier tu verras que dans la combobox1 la date du « 07/06/2022 » se positionne entre le 09/06/2022 et le 10/06/2022
Parce qu’il faut savoir que je peut antidater des entrées si litige.
Re,
Remplace dans le module5 la macro TRI par celle-ci pour une tri décroissant
Sub tri(a, gauc, droi)
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) > ref: g = g + 1: Loop
Do While ref > a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Pour un tri croissant
Sub tri(a, gauc, droi)
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub