Alimenter une Listbox Inventor depuis un fichier Excel fermé (iLogic/VB.NET)

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 :

  1. 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:C4 ou C2:C pour une plage dynamique) contenant les données.
  2. Établir la Connexion au Fichier Excel (ADO.NET)

    • Utilisez un OleDbConnection pour 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 fournisseur Microsoft.ACE.OLEDB.12.0. Pour les fichiers .xls (Excel 97-2003), utilisez Microsoft.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=Yes ou HDR=No).
  3. Lire les Données de la Feuille Excel

    • Créez une commande OleDbCommand avec 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 utiliser SELECT * FROM [NomFeuille$C2:C4].
    • Utilisez un OleDbDataReader pour lire les résultats ligne par ligne.
  4. Alimenter la Listbox/Combobox du UserForm

    • Avant d’ouvrir le UserForm, ou dans l’événement Form_Load de votre UserForm, itérez sur les résultats du DataReader.
    • Pour chaque ligne lue, ajoutez la valeur de la colonne désirée à la propriété Items de votre Listbox ou Combobox.
  5. Gérer les Erreurs et Fermer la Connexion

    • Utilisez des blocs Try...Catch...Finally pour 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()).

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 DataTable ou un List(Of String) d’abord, puis d’assigner ce tableau à la propriété DataSource de 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.Excel permet 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.