XL 2016 Remplir Combobox vitesse grand v [RESOLU]

  • Initiateur de la discussion Compte Supprimé 979
  • Date de début
C

Compte Supprimé 979

Guest
Bonjour à toutes et à tous ;)

Qui saura répondre à ma problématique...
J'ai un fichier ".xlsx" contenant les 36.000 communes françaises et leur code postal
J'aimerai à partir d'un autre fichier contenant un USF, venir alimenter les 2 colonnes de la combobox

Je pensais le faire via la méthode ADO, mais avec mon code, le remplissage est "long"
VB:
Private Sub UserForm_Activate()
  Dim sPathBdD As String, sTable As String, FlgErrCon As Boolean
  Dim sSQL As String, sField As String, IdField As Integer
  ' Initialiser les variables
  sTable = "Liste"
  sPathBdD = VParam("DossierBdD")
  If Right(sPathBdD, 1) <> "\" Then sPathBdD = sPathBdD & "\"
  sPathBdD = sPathBdD & "BdD Villes.xlsx"
  ' Tester si le fichier se trouve bien à l'endroit prévu
  If Not ExisteFichier(sPathBdD) Then
    sPathBdD = Application.GetOpenFilename(FileFilter:="BdD Villes (*.xls*), *.xls*", _
        Title:="Merci de sélectionner le fichier des viles")
  End If

  ' En cas d'erreur
  On Error GoTo Erreur_Proc
  ' Vider la combobox en question et initialiser la chaine de connexion
  If Me.Cbx_Choix.ListCount > 0 Then Me.Cbx_Choix.Clear
  FlgErrCon = False: sConn = ""
  ' Créer une nouvelle instance ADO
  Set Cnn = CreateObject("ADODB.Connection")
  ' Créer la connexion vers le fichier Excel
  With Cnn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
           & sPathBdD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    .Open
  End With
  ' En cas d'erreur message d'information à l'utilisateur
  If FlgErrCon = True Then
    MsgBox "Impossible de se connecter à la base de données !", vbCritical, "OUPS..."
    GoTo FermetureCnn
  End If
  ' Préparer la requête
  If InStr(1, sTable, " ") > 0 Then
    sSQL = "SELECT * FROM ['" & sTable & "$']"
  Else
    sSQL = "SELECT * FROM [" & sTable & "$]"
  End If
  ' Créer un nouveau Recordset et l'ouvrir
  Set Rs = CreateObject("ADODB.Recordset")
  ' Avec le Recordset, récupérer les enregistrements
  With Rs
    ' Ouvrir le recordset
    .Open sSQL, Cnn, CursorType
    ' En cas d'erreur
    If FlgErrCon = True Then GoTo FermetureRs
    ' Sinon
    Do While Not .EOF
      Me.Cbx_Choix.AddItem Rs.Fields(0)
      Me.Cbx_Choix.List(Me.Cbx_Choix.ListCount - 1, 1) = Rs.Fields(1)
      ' Enregistrement suivant
      .MoveNext
    Loop
  End With
  ' Fermeture du Recordset
FermetureRs:
  Rs.Close
  Set Rs = Nothing

  ' Fermeture de la connexion
FermetureCnn:
  Cnn.Close: Set Cnn = Nothing
  On Error GoTo 0
  Me.Caption = "CHOIX de la VILLE du CHANTIER"
  Exit Sub

Erreur_Proc:
  FlgErrCon = True  ' Mettre le FLAG d'erreur de connexion à vrai
  Resume Next
End Sub

Qui saurait me raccourcir le temps d'exécution :p
Chose importante, je ne veux pas intégrer la liste des villes dans mon fichier principal.

A+
 

Pièces jointes

  • BdD Villes.xlsx
    796.5 KB · Affichages: 41
  • UsfVille.xlsm
    22.7 KB · Affichages: 36
Dernière modification par un modérateur:
C

Compte Supprimé 979

Guest
Coucou Miss ;) ravi de te croiser

Le problème, est qu'il s'agit de chantiers qui peuvent se faire n'importe où ou presque
Et donc l'utilisateur ne va pas savoir dans quel département la ville se trouve :p

Ceci dit le choix ne doit se faire qu'une fois et le temps d'affichage est < 3s

C'était au cas où.... :D

A+
 
C

Compte Supprimé 979

Guest
Bonjour Nicole, Viard ;)

Merci pour vos réponses, mais j'ai omis une chose importante que je pensais être explicite de part mon énoncé :p je ne veux pas intégrer la liste des villes dans mon fichier principal :confused:

A+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Tout d'abord ton chargement est rapide chez moi.
Mais ceci peut être légèrement plus, avec 2 ComboBox, une pour la ville l'autre le code postal :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées

Private Sub UserForm_Initialize()
Set CL = CBxL.Création.ComboBoxLiées
CL.Plage Workbooks("BdD Villes.xlsx").Worksheets("Liste").[A2:B2]
CL.Add CBxVille, 1
CL.Add CBxCodePostal, 2, "00000"
CL.Actualiser
End Sub
Private Sub CL_SujFltChg(ByVal CBM As CBxL.ComboBoxMmbr, ByVal Filtré As Boolean)
If Not CBM.CBx Is Me.ActiveControl Then Exit Sub
If Not CBM.CBx Is Me.CBxVille Then Exit Sub
If CBM.CBx.MatchFound Or CBM.CBx.Text = "" Then Exit Sub
Dim S ' Sujet temporaire pour recherche intuitive
S = CBxL.SujCBxLike(CBM.SujetFlt, "*" & CBM.CBx.Text & "*")
If IsEmpty(S) Then Exit Sub
CBM.SujetFlt = S ' Affectation du sujet temporaire.
CBM.CBx.DropDown ' Affichage de la liste
End Sub
 

Pièces jointes

  • CBxL.xlsm
    112.1 KB · Affichages: 44
C

Compte Supprimé 979

Guest
Salut l'ami ;)

Tout d'abord ton chargement est rapide chez moi.
Perso moi aussi : 2,07 secondes, mais le challenge était de savoir si on pouvait encore l'accélérer :p

Comme dit précédemment, je ne veux pas mettre la liste des communes dans le même fichier (voir mes fichiers joints)
Je pensais pourvoir attribuer un "Recordset" à la propriété "List" de ma combobox, mais comme c'est sur 2 colonnes (impératif) je pense que ce n'est pas possible :rolleyes:

Au plaisir ;)
 
C

Compte Supprimé 979

Guest
YEEEEESSSS and the Winner is... Nicole
applo2.gif
yaisse1.gif


Avec ADO, il suffit d'alimenter le ComboBox par .Column

Code:
Private Sub UserForm_Initialize()
  Set cnn = New ADODB.Connection
  répertoire = ThisWorkbook.Path & "\"
  fichier = "BDCommunesCP.xls"
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & répertoire & fichier
  Set rs = cnn.Execute("[BD$A2:B36000]")
  Me.ComboVille.Column = rs.GetRows
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
End Sub
BISSON
Mais oui voilà... il faut mette dans les 2 colonnes les lignes du Recordset... mais c'est bien sur
king.gif


Ultra super nickel... un GRAND MERCI
kiss.gif
chin.gif
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous ;),

Une version V2 avec la recherche qui est opérationnelle.

On détecte automatiquement si on veut rechercher une commune ou un code postal.

Les codes postaux des départements 01 à 09 doivent être saisis avec le zéro en début de code postal.

nota : le temps de chargement est un poil plus long car je fais du traitement de texte des données pendant l’initialisation.
 

Pièces jointes

  • BrunoM45- UsfVille- v2.xlsm
    32.2 KB · Affichages: 46
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 069
Messages
2 085 042
Membres
102 765
dernier inscrit
richdi