Construit le contenu d'un contrôle List ou ComboBox à l'aide des données d'un fichier Access en triant les données à la volée (utilisation de l'algorithme modifié du tri par insertion)
J'ai dû pas mal me creuser la tête pour compléter une liste déroulante ComboBox d'un formulaire Outlook avec les donnée d'un fichier Access en les triant! Après avoir transpiré je me dis que cette source pourrait être utile à d'autres...
L'Idée:
Afficher la liste des utilisateurs triée par nom de famille dans un ComboBox.
Cette liste change régulièrement et est gérée par Access.
L'Obligation:
Utilisation d'un code VBScript pour se connecter à la BD.
Le Tri:
La méthode du tri par insertion est celle que vous utiliseriez si vous deviez classer des dossiers dans un classeur ou dossier suspendu, à savoir on recherche où on peut insérer le dossier entre ceux existant pour que le tout reste trié.
L'algorithme peut être légèrement adapté pour permettre le tri "à la volée". Comme ce tri reste rapide pour les petites listes (moins d'un millier d'enregistrement) nous l'utiliserons dans ce script.
Source / Exemple :
'**********************************************************************************
'** Type: SubRoutine
'** Name: BuildList
'** Arguments: Référence Objet
'** Return: Nothing
'**********************************************************************************
'** Developped by: David Thueler
'** Creation Date: 10 Oct. 2006
'** Last Modified: -
'** Purpose: Populate ComboBox object from MDB file and sort the list.
'** ADO Shared Component 3.6 MUST be registered or it will hangs!
'**
'** Usage: Set cboList = Item.GetInspector.ModifiedFormPages("OutlookPageName").Controls("ControlName")
'** BuildList(cboList)
'**********************************************************************************
Sub BuildList(objListe)
Dim rst 'Recordset
Dim dao 'Reference DAO
Dim wks 'Workspace
Dim dbs 'Database
Dim strAccessDir 'Chemin du fichier
Dim strDBName 'Nom de fichier
Dim EmployeeArray 'Enregistrement
Dim arrEmployee() 'Tableau des Employés
Dim indEmployee 'Indice du Tableau
Dim RecEmployee 'Enregistrement en traitement
Dim SortLoop 'Indice de boucle pour le tri par insertion
Dim intSeekPos 'Position de l'insertion
On Error Resume Next
'Définit le nom et emplacement de la base de donnée
strAccessDir = "R:\"
strDBName = strAccessDir & "phonelist.mdb"
'Set reference de la base Access. ADO36 doit être enregistré sinon le moteur doit être modifié en conséquence
Set dao = Application.CreateObject("DAO.DBEngine.36")
If Err > 0 Then
'on quitte le sub si la connexion a échouée
Exit Sub
End If
Set wks = dao.Workspaces(0)
Set dbs = wks.OpenDatabase(strDBName)
'Lien sur la table qui nous intéresse
Set rst = dbs.OpenRecordset("Employees")
'On parcours les enregistrements de la table
indEmployee = 0
With rst
.MoveFirst
While Not .EOF
EmployeeArray = rst.GetRows(1)
'On ajuste la dimension du tableau (très important dans le cas de ce script!)
ReDim Preserve arrEmployee(indEmployee)
'On construit la chaîne de caractère avec les enregistrements intéressants.
'Dans notre cas, [Nom de famille] [Prénom] ([Téléphone]) à l'aide des indices
RecEmployee = EmployeeArray(1,0) & " "
RecEmployee = RecEmployee & EmployeeArray(0,0) & " ("
RecEmployee = RecEmployee & Left(EmployeeArray(2,0),4) & ")"
'On insert l'enregistrement à la bonne place dans la liste
For SortLoop = 0 To indEmployee
If StrComp(RecEmployee, arrEmployee(SortLoop), vbTextCompare)<0 Then
intSeekPos = SortLoop
Exit For
End If
Next
For SortLoop=indEmployee To intSeekPos+1 step -1
arrEmployee(SortLoop)=arrEmployee(SortLoop-1)
Next
arrEmployee(intSeekPos)=RecEmployee
indEmployee = indEmployee + 1
Wend
.Close
End With
'On met à jour la ComboBox
objListe.List() = arrEmployee
End Sub
Conclusion :
Pas de bug connus.
Donnez-moi votre feed-back, je programme souvent ces temps en VBScript et j'aimerais beaucoups connaître vos critiques, remarques, félicitations et encouragements ;-)
Dites aussi si vous avez des suggestions, ça m'intéresse toujours!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.