Alimenter Combobox et Textbox via Dictionary

cathodique

XLDnaute Barbatruc
Bonsoir,

Je récupère dans un dictionnaire les données de la colonne B et celles de la colonne J.
Je voudrais qu'au choix dans combobox1, j'ai la correspondance en textbox1.
J'avoue que je ne maitrise pas bien le dictionnaire. Merci de m'aider.
VB:
Option Explicit
Dim ShBd As Worksheet, rng As Range, BD, d As Object, temp, temp1
Private Sub UserForm_Initialize()
   Dim i As Integer
   '   Set UserActif = Me
   Set ShBd = ThisWorkbook.Sheets("Comptes")
   Set rng = ShBd.Range("A6:L" & ShBd.[A65000].End(xlUp).Row)

   BD = rng.Value
   Set d = CreateObject("Scripting.Dictionary")
   For i = LBound(BD) To UBound(BD)
      d(BD(i, 2)) = ""    'N°Facture
      If Not d.exists(BD(i, 2)) Then d.Add BD(i, 2), BD(i, 10)
   Next i
   temp = d.keys
   temp1 = d.items
Me.ComboBox1.List = temp
End Sub

Private Sub ComboBox1_Change()
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
'c'est ici que je bloque
End Sub
 

Pièces jointes

  • Combo_Textbox_Dictionary.xlsm
    24.1 KB · Affichages: 25

cathodique

XLDnaute Barbatruc
Bonsoir Jean Marie:),

Content de te "revoir";). Exactement, c'est en rapport avec la discussion du lien que tu as mis dans ton post.
En effet, dès que j'ai un moment de libre je creuse pour trouver une solution à mes soucis.
Je penses qu'en récupérant le type d'opération au préalable, c-à-d dès la choix du No de facture.
On pourrait éviter le plantage du passage d'un type à un autre. Enfin, c'est ce que je pense, il se peut que je me trompe.

Merci.
Bonne soirée.
 

cathodique

XLDnaute Barbatruc
Bonjour,

Je viens de trouver une solution ce matin en utilisant le dictionnaire.
Donc voici le code pour le partage.
VB:
Option Explicit
Dim ShBd As Worksheet, rng As Range, BD, d As Object
Private Sub UserForm_Initialize()
   Dim i As Integer
   '   Set UserActif = Me
   Set ShBd = ThisWorkbook.Sheets("Comptes")
   Set rng = ShBd.Range("A6:L" & ShBd.[A65000].End(xlUp).Row)

   BD = rng.Value
   Set d = CreateObject("Scripting.Dictionary")
   For i = LBound(BD) To UBound(BD)
      If Not d.exists(BD(i, 2)) Then d.Add BD(i, 2), BD(i, 10)
   Next i
   Me.ComboBox1.List = d.keys
End Sub

Private Sub ComboBox1_click()
   Dim i As Integer
   Me.TextBox1 = ""
   For i = 0 To d.Count - 1
      If d.keys()(i) = CInt(Me.ComboBox1) Then Me.TextBox1 = d.items()(i)
   Next i
End Sub
Bonne journée.
 

cathodique

XLDnaute Barbatruc
Bonjour Cath
Bonjour le Fil ,le Forum

En ce qui concerne ton autre fichier , j'avais fait ceci ,qui semble fonctionner.
tu regardes et tu me Dis ce qui ne va pas .
Je pourrai(si tu le désires) mettre des Commentaires (dans le Code) pour expliquer le fonctionnement des Procédures.
Edit : j'ai modifié le Fichier (améliorations)
Dans l'attente
Bonne journée
jean marie
Bonjour Jean Marie:),
J'apprécie beaucoup ton aide. Avant de partir, j'ai jeté un coup d’œil sur ton fichier.
Comment te dire, je suis un peu gêné surtout que tu as dû passer du temps pour accomplir tout ce travail.
Je l'avais expliqué dans le dernier fichier joint, à l'ouverture il faut que tous les contrôles soient vides.
C-à-d rien dans la listbox. Je testerai ce soir et reviendrai te mettre au courant mais sur l'autre discussion.
Stp, supprime ce post avec le fichier joint ou bien transfére-le dans la discussion d'origine.
Merci beaucoup. Je dois y aller.
Bonne journée.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Code:
Private Sub ComboBox1_click()
   Dim i As Integer
   Me.TextBox1 = ""
   For i = 0 To d.Count - 1
      If d.keys()(i) = CInt(Me.ComboBox1) Then Me.TextBox1 = d.items()(i)
   Next i
End Sub

Peut être remplacé par:

Code:
Private Sub ComboBox1_click()
   Me.TextBox1 = d(CInt(Me.ComboBox1))
End Sub

Si on voulait voir dans le combobox 2 colonnes:

Code:
Option Explicit
Dim ShBd As Worksheet, Rng As Range, BD, d As Object, temp, temp1, Coll_Factures
Private Sub UserForm_Initialize()
   Dim i As Integer, n, d
   Set ShBd = ThisWorkbook.Sheets("Comptes")
   Set Rng = ShBd.Range("A6:L" & ShBd.[A65000].End(xlUp).Row)
   BD = Rng.Value
   Me.ComboBox1.ColumnCount = 2
   Me.ComboBox1.ColumnWidths = "20;50"
   Set d = CreateObject("scripting.dictionary")
   n = 0
   For i = LBound(BD) To UBound(BD)
     If Not d.exists(BD(i, 2)) Then
       d(BD(i, 2)) = ""
       Me.ComboBox1.AddItem BD(i, 2)
       Me.ComboBox1.List(n, 1) = BD(i, 10)
       n = n + 1
     End If
   Next i
End Sub

Private Sub ComboBox1_click()
   If Me.ComboBox1.ListIndex = -1 Then Exit Sub
   Me.TextBox1.Value = Me.ComboBox1.Column(1)
End Sub


Boisgontier
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour,

Code:
Private Sub ComboBox1_click()
   Dim i As Integer
   Me.TextBox1 = ""
   For i = 0 To d.Count - 1
      If d.keys()(i) = CInt(Me.ComboBox1) Then Me.TextBox1 = d.items()(i)
   Next i
End Sub

Peut être remplacé par:

Code:
Private Sub ComboBox1_click()
   Me.TextBox1 = d(CInt(Me.ComboBox1))
End Sub

Si on voulait voir dans le combobox 2 colonnes:

Code:
Option Explicit
Dim ShBd As Worksheet, Rng As Range, BD, d As Object, temp, temp1, Coll_Factures
Private Sub UserForm_Initialize()
   Dim i As Integer, n, d
   Set ShBd = ThisWorkbook.Sheets("Comptes")
   Set Rng = ShBd.Range("A6:L" & ShBd.[A65000].End(xlUp).Row)
   BD = Rng.Value
   Me.ComboBox1.ColumnCount = 2
   Me.ComboBox1.ColumnWidths = "20;50"
   Set d = CreateObject("scripting.dictionary")
   n = 0
   For i = LBound(BD) To UBound(BD)
     If Not d.exists(BD(i, 2)) Then
       d(BD(i, 2)) = ""
       Me.ComboBox1.AddItem BD(i, 2)
       Me.ComboBox1.List(n, 1) = BD(i, 10)
       n = n + 1
     End If
   Next i
End Sub

Private Sub ComboBox1_click()
   If Me.ComboBox1.ListIndex = -1 Then Exit Sub
   Me.TextBox1.Value = Me.ComboBox1.Column(1)
End Sub


Boisgontier
Bonsoir Boisgontier,

Ça ne pouvait être que parfait. Chapeau bas:):).
Merci beaucoup.

Bon week-end à toutes et à tous. ;)
 

Si...

XLDnaute Barbatruc
Bonsoir

Tiré de mon chapeau...;)
Avec un Tableau, on a simplement :
VB:
Dim R As Range, D
Private Sub UserForm_Initialize()
  Set D = CreateObject("scripting.dictionary")
  For Each R In [BD[N°]]: D(R.Value) = "": Next
  ComboBox1.List = D.keys
End Sub
Private Sub ComboBox1_click()
  If ComboBox1.ListIndex > -1 Then TextBox1 = [BD[N°]].Find(ComboBox1)(1, 9)
End Sub

En plus, comme depuis un bon moment tu te bats avec un projet, voici un exemple* de méthodes (Filtre, Dico, Module de Classes, création de formulaire sans doublons inutiles …) appliquées à ta gestion des factures (demande sur un autre fil).
* ce n'est pas la création qui est programmée mais des modifications (d'ailleurs lesquelles ?) !
 

Pièces jointes

  • Combo_Textbox_Dictionary.xlsm
    27.9 KB · Affichages: 34
  • Gestion Facture.xlsm
    161.6 KB · Affichages: 36

cathodique

XLDnaute Barbatruc
Bonsoir

Tiré de mon chapeau...;)
Avec un Tableau, on a simplement :
VB:
Dim R As Range, D
Private Sub UserForm_Initialize()
  Set D = CreateObject("scripting.dictionary")
  For Each R In [BD[N°]]: D(R.Value) = "": Next
  ComboBox1.List = D.keys
End Sub
Private Sub ComboBox1_click()
  If ComboBox1.ListIndex > -1 Then TextBox1 = [BD[N°]].Find(ComboBox1)(1, 9)
End Sub

En plus, comme depuis un bon moment tu te bats avec un projet, voici un exemple* de méthodes (Filtre, Dico, Module de Classes, création de formulaire sans doublons inutiles …) appliquées à ta gestion des factures (demande sur un autre fil).
* ce n'est pas la création qui est programmée mais des modifications (d'ailleurs lesquelles ?) !
Bonjour Si...:),

Je tire chapeau à ton chapeau, il est bien rempli:p. Je plaisante. Merci beaucoup pour ton aide.
J'ai téléchargé tes 2 fichiers que j'étudierai à tête reposée.
En effet, il y a un moment que je suis sur ce projet pour aider bénévolement et gracieusement une association.
J'arrive à la fin de ce projet, c'est le dernier formulaire de modification en cas d'erreur de saisie avec une contrainte:
Vérification du montant d'une facture avant modification des lignes correspondantes dans la base de données.
La colonne que j'ai rajouté (dépenses/recettes), c'est juste pour me faciliter le traitement des données.

Encore merci pour tes bonnes intentions, j'apprécie beaucoup.

Bonne semaine.;)
 

Discussions similaires

Réponses
6
Affichages
202