Dictionary, textBox et date

cathodique

XLDnaute Barbatruc
Bonsoir à tous,

Sur le fichier joint, j'ai illustré mon problème en faisant beaucoup de ménage dans l'userform, je n'ai gardé que l'essentiel.

Je fais de sélection par combobox en utilisant pour récupérer les données un dictionnaire. Je voudrai afficher dans la combobox au format "mmm yyyy"et là les choses se corsent, dans la combobox suivante je n'ai le résultat que de la première occurence car comme dans mon exemple j'ai 3 dates pour le mois de décembre 2012. et là je bloque vraiment. voici le code où ça coince:
Code:
Private Sub textbox21_change() 'TEXTBOX PREND LA VALEUR C
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each C In Range(Sheets("B").[r2], Sheets("B").[r65000].End(xlUp))
'  If C = Me.TextBox21 Then mondico(C.Offset(, -15).Value) = Format(C.Offset(, -15).Value, "mmm yyyy") 'test1
    If C = Me.TextBox21 Then mondico(C.Offset(, -15).Value) = CDate(C.Offset(, -15).Value)         'test2
  Next C
  Me.ComboBox3.List = mondico.items 
  Me.ComboBox3.ListIndex = -1       
  Me.ComboBox4.ListIndex = -1       
  'Me.ListBox2.ListIndex = -1        
End Sub
J'ai essayé comme ceci, avec ligne test2 j'ai le format standard des dates l'affichage est bon. mais avec la ligne test1 le résultat n'est pas bon.
Je vous remercie pour votre aide. J'ai compris que c'est une question de récupération des données suivant mois et année mais pour le mettre en code là je donne ma langue au chat.

Cordialement,
 

Pièces jointes

  • textbox&date.xls
    231.5 KB · Affichages: 40

Paf

XLDnaute Barbatruc
Re : Dictionary, textBox et date

bonsoir,

Pour répondre strictement, sans être sûr d'avoir tout compris, s'il s'agit de récupérer toutes les dates et de les insérer avec un format particulier dans la combobox3, dans Private Sub textbox21_change():

remplacer:
Code:
 If C = Me.TextBox21 Then mondico(C.Offset(, -15).Value) = CDate(C.Offset(, -15).Value)         'test2
par
Code:
If C = Me.TextBox21 Then
    i = i + 1
    ReDim Preserve montab(i)
    montab(i) = Format(C.Offset(, -15).Value, "mmm yyyy") 'test1
  End If
et
Code:
Me.ComboBox3.List = mondico.items
par
Code:
 Me.ComboBox3.List = montab

et supprimer
Code:
  Set mondico = CreateObject("Scripting.Dictionary")
sans oublier la déclaration du tableau montab()

par ailleurs, à quoi sert la création du même dictionnaire que celui qi était crée ci dessus, dans Private Sub UserForm_Initialize() et dans Private Sub combobox3_Change()

Bonne suite
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Bonjour Paf,

Je te remercie beaucoup pour tes suggestions.
En fait, avec mon code les dates sont récupérées, ce sont les items correspondants qui ne le sont pas tous (dans comboBox4).

par ailleurs, à quoi sert la création du même dictionnaire que celui qi était crée ci dessus, dans Private Sub UserForm_Initialize() et dans Private Sub combobox3_Change()
Je suis suis nul en VBA et je me suis inspiré de l'excellent site de Boisgontier pour réaliser mes formulaires
ici: Formation Excel VBA JB

voici comment j'ai modifié le code suivant tes instructions
Code:
Private Sub textbox21_change() 'TEXTBOX PREND LA VALEUR CP
Dim montab()
Dim i As Integer
   For Each C In Range(Sheets("B").[r2], Sheets("B").[r65000].End(xlUp))
   If C = Me.TextBox21 Then
    i = i + 1
    ReDim Preserve montab(i)
    montab(i) = Format(C.Offset(, -15).Value, "mmm yyyy") 'test1
  End If
   Next C
  Me.ComboBox3.List = montab
   Me.ComboBox3.ListIndex = -1       '===3
  Me.ComboBox4.ListIndex = -1       '===4
  Me.ListBox2.ListIndex = -1        '===2
End Sub
Mais ce n'est pas ça, je ne veux pas récupérer toutes les dates, je voudrai toutes les dates sans doublons. Avec mon code, les dates sont bien affichées dans combobox3, ce sont les items correspondants dans combobox4 qui ne le sont pas tous et ce, seulement quand je modifie le code pour afficher les dates au format "mmm yyyy".
je te donne un exemple concret de mon fichier joint pour décembre 2012 on a ceci en feuille B:
12/12/2012 CP T6
12/12/2012 CP T6
12/12/2012 CP T6
12/12/2012 CP T6
01/12/2012 CP T1a
12/12/2012 CP T4
12/12/2012 CP T4
12/12/2012 CP T4

Donc avec mon code, dans combobox3 on trouve déc 2012, 2 fois (pour 12/12/2012 et 01/12/2012). Si je sélectionne déc 2012 correspondant au 12/12/2012 je devrais avoir en combobox4 T6 etT4 alors que je n'ai que T6.
Je voudrai parvenir à avoir dans combobox3 une seule fois déc 2012 et en combobox4 T6, T1a et T4; c-a-d retrouver toutes les données sans doublons), c'est pour pour cela que je suis tourné vers Dictionary.

En espérant, que c'est plus clair. Merci d'avoir répondu à mon post et pour votre aide.


Encore merci @+

Cordialement,
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Bonjour cathodique, Paf

Voyez le fichier joint où j'ai fait le ménage.

L'utilisation du tableau VBA t accélèrera beaucoup les macros sur un grand tableau.

A+
 

Pièces jointes

  • textbox&date(1).xls
    231.5 KB · Affichages: 37

cathodique

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Bonjour Job75,

Je te remercie beaucoup pour ton aide. Ton fichier répond bien au résultat auquel je voulais parvenir. en effet, mon tableau est très grand.

J'espère parvenir à adapter ton code à mon userform original, car moi aussi j'ai fait un ménage sur le fichier joint. En réalité, l'userform sur lequel je travaille contient d'autres textboxs, un spinbutton et Une listbox. Je me suis démenè en m'inspirant des exemples de Boisgontier pour y parvenir.

Je te dis bravo pour ton code. 1000 mercis. Je reviendrai pour vous informer de la suite.

Cordialement,
 

job75

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Re,

Il y a donc 3 listes.

Si l'on veut qu'elles soient triées il faut faire 3 tris du tableau et le mémoriser 3 fois :

Code:
Dim t1, t2, t3 'mémorisations du tableau

Private Sub UserForm_Initialize()
With Sheets("B")
  With .Range("A1:AB" & .Range("A" & .Rows.Count).End(xlUp).Row)
    .Sort .Columns("C"), Header:=xlYes
    t1 = .Cells
    .Columns("AB") = .Columns("S").Value
    .Columns("AB").Replace "T", "" 'pour classer les nombres
    .Sort .Columns("AB"), Header:=xlYes
    t2 = .Cells
    .Columns("AB").ClearContents
    .Sort .Columns("B"), Header:=xlYes
    t3 = .Cells
  End With
End With
TextBox21 = "CP"
End Sub
Fichier (3).

Edit : pour que le 3ème tri ait un sens, il faut avoir supprimé les formules en colonnes B...

A+
 

Pièces jointes

  • textbox&date(3).xls
    234.5 KB · Affichages: 19
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Bonsoir Job75,

je te remercie beaucoup pour ta gentillesse. On dirait que tu as lu dans mes pensées ou c'est l'expérience. Tu as deviné que j'arriverai à cela (tri des données dans textbox). Je viens de terminer un fichier qui inclut ton dernier code. Sur ce fichier j'ai retiré le code de gestion des saisies (numérique, date ou alphanumérique).

Voilà sans vouloir abuser de ta gentillesse, ce formulaire va me permettre de réviser une base de données assez conséquentes (de 1960 à ce jour) et y apporter des corrections. Donc je voudrai qu'en modifiant la valeur d'une textbox, celle-ci soit multiplier par mille et mise dans une autre textbox à la seule condition que la ListBox.count=1.

Voir exemple sur le formulaire.

Je te remercie beaucoup pour ta gentillesse, ta disponibilité et pour ton aide.

ps: je t'avoue ne pas avoir tout compris dans ton code, mais il fonctionne bien

Cordialement,
 

Pièces jointes

  • textbox&date(4).xls
    191 KB · Affichages: 35

cathodique

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Re,

je pense avoir trouvé la solution de mon précédent post#8
Code:
Private Sub TextBox4_AfterUpdate()
If TextBox20.Value = 1 Then
TextBox6.Value = TextBox4.Value * 1000
End If
End Sub

Par contre le rafraichissement des textboxs récupérant les données ne se fait que si je clique sur les spinbuttons ou listbox.

ex: quand je sélectionne une date puis N°, les données les autres textboxs ne s'affichent que si je clique sur la spinbutton ou que je sélectionne un n° dans la listbox.

Comment pourrait-on faire pour que par défaut la première donnée de la listbox soit sélectionnée, afin que les textboxs récupèrent les données correspondantes.

Merci encore ton aide et ton intérêt pour mon post.

Bonne soirée.

Cordialement,
 

job75

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Re,

A priori c'est simple :

Code:
Private Sub TextBox4_Change()
If ListBox2.ListCount = 1 Then _
  TextBox6 = 1000 * Val(Replace(TextBox4, ",", "."))
End Sub

Private Sub ListBox2_Click()
Dim i&
i = Application.Match(ListBox2, Application.Index(t3, , 2), 0)
TextBox1 = ListBox2
TextBox2 = Round(t3(i, 7)) 'VAL7
TextBox3 = t3(i, 20) 'VAL20
TextBox6 = t3(i, 15) 'VAL15
TextBox4 = t3(i, 21) 'VAL21
TextBox5 = t3(i, 9)  'VAL9
TextBox7 = t3(i, 16) 'VAL16
TextBox8 = t3(i, 17) 'VAL17
End Sub
Nota : s'il n'y a jamais de "trou" dans la numérotation en colonne B on peut tout simplement écrire :

Code:
i = ListBox2 + 1
A+
 

job75

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Re, réponse au post #9 :

Comment pourrait-on faire pour que par défaut la première donnée de la listbox soit sélectionnée, afin que les textboxs récupèrent les données correspondantes.

Code:
Private Sub Combobox4_Change() 'CHOIX DU N°
Dim i&, a(), n&
For i = 2 To UBound(t3)
  If t3(i, 18) = TextBox21 And Format(t3(i, 3), "mmm yyyy") = ComboBox3 _
    And t3(i, 19) = ComboBox4 Then
    ReDim Preserve a(n)
    a(n) = t3(i, 2)
    n = n + 1
  End If
Next
ListBox2.Clear
If n Then ListBox2.List = a: ListBox2.ListIndex = 0
TextBox20 = ListBox2.ListCount
End Sub
A+
 

cathodique

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Bonsoir Job75,

Je te suis vraiment reconnaissant pour tout. le code fonctionne bien mais la valeur est transférée en texte sur la feuille B (dans la cellule il y a le petit triangle rouge en haut à gauche). j'ai essayé avec cdbl au lieu de val mais ça ne fonctionne pas. bug sur cette ligne
Code:
TextBox6 = 1000 * Val(Replace(TextBox4, ",", "."))

Nota : s'il n'y a jamais de "trou" dans la numérotation en colonne B on peut tout simplement écrire :
Code :
i = ListBox2 + 1
je te confirme qu'il n'y a pas de trou dans la numérotation en colonne B, je suppose que je dois remplacer cette ligne:
Code:
i = Application.Match(ListBox2, Application.Index(t3, , 2), 0)
par
Code:
i = ListBox2 + 1
et garder les lignes suivantes.

1000 mercis. Bonne soirée.

Cordialement,
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : Dictionary, textBox et date

Re, je m'aperçois que tu as répondu à mon post alors que j'étais entrain de le modifier. Pour les numéros en colonne B, c'est en effet une formule [=LIGNE()-1]. Je viens de constater que tu me demandes de supprimer les formules dans cette colonne (excuses mes étourderies, tu m'as signalé au post#7 qu'il fallait supprimer les formules).
Est-ce que ton risque de ne pas être fiable si je dois garder les formules en colonne B? car je ne peux pas le faire.

Merci encore pour tout. Bonne soirée.

Cordialement,
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 450
Messages
2 109 721
Membres
110 551
dernier inscrit
Khyolyanna