Comment alimenter une Listbox ou ComboBox dans un UserForm Inventor (appelé via iLogic ou VB.NET) avec des données provenant d’un fichier Excel externe et fermé, par exemple une liste d’auteurs ?
Pour alimenter une Listbox ou ComboBox dans un UserForm Inventor à partir d’un fichier Excel fermé, la méthode la plus robuste et performante consiste à utiliser ADO.NET (ActiveX Data Objects) pour lire les données du fichier Excel comme s’il s’agissait d’une base de données. Cela évite d’ouvrir Excel en arrière-plan, ce qui est plus rapide et moins sujet aux erreurs.
Voici la démarche experte, étape par étape, pour y parvenir avec VB.NET dans le cadre d’iLogic ou d’un add-in Inventor :
-
Vérification Préliminaire (Diagnostic)
- Assurez-vous que le fichier Excel (
Info Inventor.xlsx) est accessible et que le chemin d’accès est correct. - Vérifiez le nom exact de la feuille (
Auteurs) et la plage de cellules (C2:C4ouC2:Cpour une plage dynamique) contenant les données.
- Assurez-vous que le fichier Excel (
-
Établir la Connexion au Fichier Excel (ADO.NET)
- Utilisez un
OleDbConnectionpour vous connecter au fichier Excel. Le fournisseur de données dépend de la version d’Excel. Pour les fichiers.xlsx(Excel 2007 et plus), utilisez le fournisseurMicrosoft.ACE.OLEDB.12.0. Pour les fichiers.xls(Excel 97-2003), utilisezMicrosoft.Jet.OLEDB.4.0. - La chaîne de connexion doit spécifier le chemin du fichier et indiquer que la première ligne contient des en-têtes si c’est le cas (
HDR=YesouHDR=No).
- Utilisez un
-
Lire les Données de la Feuille Excel
- Créez une commande
OleDbCommandavec une requête SQL simple pour sélectionner les données de la feuille. Par exemple,SELECT [NomColonne] FROM [NomFeuille$]. Si vous avez une plage spécifique, vous pouvez utiliserSELECT * FROM [NomFeuille$C2:C4]. - Utilisez un
OleDbDataReaderpour lire les résultats ligne par ligne.
- Créez une commande
-
Alimenter la Listbox/Combobox du UserForm
- Avant d’ouvrir le UserForm, ou dans l’événement
Form_Loadde votre UserForm, itérez sur les résultats duDataReader. - Pour chaque ligne lue, ajoutez la valeur de la colonne désirée à la propriété
Itemsde votre Listbox ou Combobox.
- Avant d’ouvrir le UserForm, ou dans l’événement
-
Gérer les Erreurs et Fermer la Connexion
- Utilisez des blocs
Try...Catch...Finallypour gérer les erreurs potentielles (fichier non trouvé, problème de connexion, etc.) et assurez-vous de toujours fermer la connexion ADO.NET (conn.Close()) et de libérer les ressources (conn.Dispose(),reader.Close(),reader.Dispose()).
- Utilisez des blocs
Exemple de Pseudo-Code VB.NET pour un UserForm (à adapter) :
Imports System.Data.OleDb ' Nécessaire pour ADO.NET
Public Class MonUserForm
Private Sub MonUserForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim excelFilePath As String = "C:\Chemin\Vers\Votre\Info Inventor.xlsx" ' Adaptez le chemin
Dim sheetName As String = "Auteurs" ' Nom de votre feuille
Dim connectionString As String = ""
Dim conn As OleDbConnection = Nothing
Dim cmd As OleDbCommand = Nothing
Dim reader As OleDbDataReader = Nothing
Try
' Chaîne de connexion pour Excel 2007+ (.xlsx)
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & excelFilePath & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1""" ' HDR=NO si C1 est un en-tête à ignorer, IMEX=1 pour forcer le texte
conn = New OleDbConnection(connectionString)
conn.Open()
' Requête SQL pour la plage C2:C4. Si la colonne n'a pas de nom, elle sera F1, F2, etc.
' Si C1 est un en-tête et que vous voulez C2:C4, la requête pourrait être "SELECT F1 FROM [Auteurs$C2:C4]"
' Ou si vous voulez toute la colonne C à partir de C2: "SELECT F3 FROM [Auteurs$]" et filtrer après
' Pour une colonne C nommée "Auteur" (si HDR=Yes), ce serait "SELECT Auteur FROM [Auteurs$]"
' Ici, nous partons du principe que C1 est un en-tête et que les données sont en C2, C3, C4.
' Si HDR=NO, la colonne C sera "F3" (F1=A, F2=B, F3=C)
cmd = New OleDbCommand("SELECT F3 FROM [" & sheetName & "$C2:C4]", conn) ' Adaptez F3 si votre colonne est différente
reader = cmd.ExecuteReader()
' Alimenter la Listbox
Me.ListBox1.Items.Clear() ' Vider la listbox avant de la remplir
While reader.Read()
If Not reader.IsDBNull(0) Then ' Vérifier si la valeur n'est pas nulle
Me.ListBox1.Items.Add(reader.GetString(0)) ' Ajouter la valeur de la première colonne lue
End If
End While
Catch ex As Exception
MessageBox.Show("Erreur lors de l'alimentation de la Listbox : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
If reader IsNot Nothing Then reader.Close()
If conn IsNot Nothing Then conn.Close()
End Try
End Sub
End Class
Bonnes Pratiques et Conseils Supplémentaires :
- Gestion des Chemins : Évitez les chemins absolus codés en dur. Utilisez des chemins relatifs ou stockez le chemin du fichier Excel dans un paramètre Inventor ou une propriété de document pour faciliter la maintenance.
- Performance : Pour de très grandes listes, il peut être plus rapide de charger toutes les données dans un
DataTableou unList(Of String)d’abord, puis d’assigner ce tableau à la propriétéDataSourcede la Listbox, plutôt que d’ajouter les éléments un par un. - Dynamisme : Si la liste des auteurs est amenée à évoluer, assurez-vous que votre requête SQL ne se limite pas à une plage fixe (ex:
C2:C4). Vous pouvez lire toute la colonne et filtrer les en-têtes si nécessaire, ou utiliser des plages nommées dans Excel. - Sécurité : Soyez conscient des implications de sécurité si le fichier Excel peut être modifié par des utilisateurs non autorisés.
- Alternative (moins recommandée pour fichier fermé) :
Microsoft.Office.Interop.Excelpermet un contrôle plus fin mais nécessite qu’Excel soit installé et ouvre une instance d’Excel en arrière-plan, ce qui est plus lourd.