IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Appels de scripts python via VBA [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 627
    Par défaut Appels de scripts python via VBA
    Bonjour à tous,

    je suis en train de développer une série de fonctionnalités en VBA/python pour un client sous Excel.
    J'arrive très bien à appeler la fonction __main__ d'un script python, mais ça implique d'avoir un fichier python par fonction.
    Je me demande s'il est possible d'avoir un seul fichier python et d'appeler une fonction en particulier.

    La seule idée que j'ai pour l'instant c'est de créer un enum/chiffre/etc en paramètre du script pour savoir quelle fonction appeler et je voudrais savoir s'il existe une méthode plus propre.

    Merci pour votre aide
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 252
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    Bonjour à tous,

    je suis en train de développer une série de fonctionnalités en VBA/python pour un client sous Excel.
    J'arrive très bien à appeler la fonction __main__ d'un script python, mais ça implique d'avoir un fichier python par fonction.
    Je me d
    emande s'il est possible d'avoir un seul fichier python et d'appeler une fonction en particulier.

    La seule idée que j'ai pour l'instant c'est de créer un enum/chiffre/etc en paramètre du script pour savoir quelle fonction appeler et je voudrais savoir s'il existe une méthode plus propre.

    Merci pour votre aide
    Hello,
    je vois pas trop bien ce que tu veux faire en python à partir du VBA ? tu t'interfaces comment ? en lançant un shell ? tu récupères un résultat ? des fonctions ?
    sachant qu'avec LibreOffice Calc tu peux directement faire des macros en python.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Hello,

    Il n'y a pas 36 solutions:
    1) Version barbare: Ecrire un script python via VBA, qui lancera importera ton script et lancera la (ou les) fonction désirées via le shell (donc en gros, ecrire du code qui ecrit du code).
    2) Utiliser une bibliothèque externe, comme xlwings: https://www.xlwings.org/
    3) Ecrire une objet COM en python, que tu pourras appeler depuis VBA.

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 587
    Par défaut
    Bonsoir,
    Ton client t'impose d'utiliser des routines en python ?, c'est toi qui lui a proposé du python ?

    C'est toi ou le client qui ne veux pas de macro VBA sauf pour lancer du python ? Pourquoi ne pas faire tout en VBA ? Parce que tu ne connais pas VBA?

  5. #5
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 627
    Par défaut
    Merci pour les réponses.

    J'ai choisi le python car on trouve assez facilement des développeurs python donc si dans quelques années le client veut faire faire des modifications je pense qu'il trouvera plus facilement un dev python qu'un dev VBA.
    Je peux me débrouiller en VBA, j'ai déjà fait quelques scripts mais ça ne m'a pas laissé des souvenirs très positifs.

    J'appelle le script python via une macro, via ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub AppelerScriptPython()
        Dim cheminScriptPython As String
        Dim cheminFichierExcel As String
        Dim commandeShell As String
        Dim nomFeuille As String
     
        ' Obtenir le chemin du fichier Excel actuel
        cheminFichierExcel = ThisWorkbook.Path
        cheminFichierExcel = ThisWorkbook.FullName
     
     
        ' Obtenir le nom de la Feuille courante
        nomFeuille = ActiveSheet.Name
     
        ' Vérifier si le chemin est valide
        If cheminFichierExcel = "" Then
            MsgBox "Veuillez enregistrer le fichier Excel avant d'exécuter ce script.", vbExclamation
            Exit Sub
        End If
     
        ' Chemin vers le script Python (supposé être dans le même dossier que le fichier Excel)
        cheminScriptPython = "C:\blabla\bibExcel.py"
     
        ' Construire la commande Shell pour exécuter le script Python
        commandeShell = "python """ & cheminScriptPython & """ " & cheminFichierExcel & " " & param2
     
        ' Exécuter le script Python
        Shell commandeShell, vbNormalFocus
     
    End Sub
    Mon "soucis" avec ce code c'est qu'il appelle la fonction __main__ du fichier python, donc si j'ai 4 fonctions à coder, il me faut 4 fichiers.
    Ce n'est pas très grave en soi, mais je me demande s'il n'y a pas une méthode pour appeler une fonction en particulier d'un fichier python.
    La meilleure solution que je vois pour l'instant c'est de passer une chaîne de caractère en paramètre supplémentaire, et dans le __main__ d'appeler une fonction différente en fonction de la chaîne passée en paramètre.

    Connaissez-vous d'autres solutions ?
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 252
    Par défaut
    Hello,
    si ton python est du même type que ton Excel (Excel 64 bits -> Python 64 bits, Excel 32 bits -> Python 32 bits) et que tu as le module pywin32 installé
    ou que tu peux installer) ainsi que la postinstall de ce module, tu peux te faire un script python qui sera serveur COM et donc visible à partir du VBA.
    voici par exemple des fonctions qui sont définies dans mon script Python :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        def unique(self,arr):   #renvoie les valeurs uniques du tableau passé en paramètre
            return list(dict.fromkeys(arr)) 
     
        def random_int_list(self, n, min_val, max_val): #génère un tableau de n entiers de min_val à maxval)
            return [random.randint(min_val, max_val) for _ in range(n)]
     
        def  hello(self, name):  # renvoie un message de salut
            return f"Hello {name} from Python!"
     
        def readSheetNames(self, classeur): # renvoie le nom des feuilles du classeur en utilisant openpyxl
            wb = load_workbook(classeur, read_only=True, data_only=True)
            return wb.sheetnames
     
        def readUsedRangeData(self, classeur, feuille): # renvoie les data de la plage utilisée dans une feuille d'un classeur 
            wb = load_workbook(classeur)
            sheet = wb[feuille]
            max_row = sheet.max_row
            max_col = sheet.max_column
            data = []
            for row in sheet.iter_rows(min_row=1, max_row=max_row, min_col=1, max_col=max_col, values_only=True):
                data.append(list(row))
            return data

    Et voici comment on appelle cela à partir du VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub TestPythonServeurCOM()
        Dim obj As Object, res, data, i As Integer
        Dim arrInt, uniqueArr, arrColName, arrColW
        Const ClasseurXl = "D:\temp\classeur2.xlsx"
        On Error GoTo ErrorHandler
        Set obj = CreateObject("PythonXl.Server")
        res = obj.Hello("World")
        UsfLV.Message.Caption = res: UsfLV.Show
        arrInt = obj.random_int_list(500, 0, 99)
        Call FillLV(UsfLV.ListView1, Array("Valeurs"), Array(300), arrInt)
        UsfLV.Message.Caption = "Tableau de 500 entiers de 0 à 99 générés aléatoirement": UsfLV.Show
        uniqueArr = obj.Unique(arrInt)
        Call FillLV(UsfLV.ListView1, Array("Valeurs"), Array(350), arrInt)
        UsfLV.Message.Caption = "Valeurs uniques : " & CStr(UBound(uniqueArr)): UsfLV.Show
        res = obj.readSheetNames(ClasseurXl)
        Call FillLV(UsfLV.ListView1, Array("Feuilles"), Array(350), res)
        UsfLV.Message.Caption = "Feuilles du classeur " & ClasseurXl & " : " & CStr(UBound(res) + 1): UsfLV.Show
        data = obj.readUsedRangeData(ClasseurXl, res(0))
        ReDim arrColName(0 To UBound(data, 2) - 1): ReDim arrColW(0 To UBound(data, 2) - 1)
        For i = 0 To UBound(data, 2) - 1: arrColName(i) = data(0, i): arrColW(i) = 80: Next i
        Call FillLV2D(UsfLV.ListView1, arrColName, arrColW, data)
        UsfLV.Message.Caption = "Lecture UsedRangeData Feuille 1 du classeur " & ClasseurXl: UsfLV.Show
        Call obj.grapheDirect(Array(Array("U", "V"), Array("W", "X"), _
                              Array("Y", "Z"), Array("U", "Z"), Array("V", "Z")))
        Exit Sub
    ErrorHandler:
        Debug.Print Err.Description
    End Sub


    Et voici ce que cela donne :
    Nom : DemoComServerPython.gif
Affichages : 146
Taille : 412,7 Ko


    La création de l'objet est assez longue car il faut lancer le Python mais une fois cela fait cela est rapide . Par exemple pour générer les 500 entiers il faut 2 ms et pour lire les données de la plage utilisée d'une feuille 8 ms (en utilisant openpyxl)
    C'est stable : même en cas d'erreur il n' y a pas de plantage d'Excel.
    A noter que pour créer le serveur il faut lancer le script python avec un argument spécial, qu'il faut être administrateur pour pouvoir lancer cette commande et que des choses sont inscrites dans la base de registre. On pourra enlever complètement ces choses en lançant le script avec une option de désinscription.

    Si tu n'as pas la possibilité de faire cela , tu peux t'en sortir comme ceci par exemple .
    Script python avec 2 functions :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def addition(a, b):
        print(f"Résultat : {int(a) + int(b)}")
     
    def saluer(nom):
        print(f"Bonjour {nom} !")
     
    if __name__ == "__main__":
        import sys
        func_name = sys.argv[1]
        args = sys.argv[2:]
     
        if func_name == "addition":
            addition(*args)
        elif func_name == "saluer":
            saluer(*args)

    Appelé depuis le VBA comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub AppelerFonctionPython()
        Dim pythonExe As String, scriptPath As String, cmd As String
     
        pythonExe = "C:\Users\TonNom\AppData\Local\Programs\Python\Python312\python.exe"
        scriptPath = "C:\chemin\vers\monScript.py"
     
        'Exemple : appeler "saluer" avec un argument
        cmd = pythonExe & " " & scriptPath & " saluer Bob"
     
        ' ou bien : cmd = pythonExe & " " & scriptPath & " addition 4 5"
     
        'Exécution (pas de retour)
        Shell cmd, vbNormalFocus
    End Sub
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 329
    Par défaut
    Hello,

    Faudrait en savoir plus sur l'application... En terme de couplage que cela importe (même xlwings, et même si je trouve que c'est la meilleure solution proposée ici) j'en reviens à la conclusion de @Thumb down, pourquoi Python ? Alors comme vous le voyez j'aime bien python, mais ça n'empêche que sans explications qui tiennent plus la route que "on trouve assez facilement des développeurs python", la solution me semble pas très judicieuse.

    Mais on va peut-être pouvoir tout de même trouver une solution intéressante, surtout concernant l'architecture du projet (et c'est pour cela qu'il faut en dire plus)

    Créer une API (local ou sur un serveur web) en revanche permet un découplage total ! Le serveur Flask (ou FastAPI, ...) ne sait rien d'Excel ; il se contente de répondre à des requêtes HTTP. Cela signifie que le même backend Python pourrait être utilisé simultanément par plusieurs utilisateurs Excel, une application web, ou d'autres scripts sans aucune modification. Le serveur pourrait même être déplacé de localhost vers une machine dédiée avec un simple changement d'URL dans le code VBA. Bien qu'elle présente la complexité de mise en place initiale la plus élevée, cette architecture est la seule qui soit intrinsèquement évolutive et extensible au-delà des limites d'une application de bureau mono-utilisateur.

    Cette solution est totalement portable, car le moyen de communiquer sera de JSON (oui du texte) et qu'il sera simple de transmettre des données structurées (list, dictionnaire python) afin de recevoir un objet natif VBA.

    Mais bon, avant de prendre ce type de décision, il faudrait tout de même un peu plus de détails, car des solutions il y en a, mais pour savoir laquelle s'adapte le mieux à l'exercice, il faut avoir les tenants et les aboutissants.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 50
    Par défaut
    @jurassic pork

    Puisque tu es capable de créer des Addins Excel en C# pourquoi ne pas créer un qui interprète directement le code C# étant donné ce dernier peut s'autocompiler et son compilateur est présent sur tous les pc.

  9. #9
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 627
    Par défaut
    Pour donner plus d'infos mon client fait de la maitrise d'œuvre dans le BTP.
    Actuellement il fait son avant projet, ses suivis sur Excel, et il recopie à chaque étape le tout dans Word avant d'envoyer les documents Word aux artisans et aux clients.

    Il m'a demandé de regarder comment automatiser tout ça pour qu'il note les choses une fois et qu'ensuite tout se gère automatiquement.

    Donc mon idée c'est de partir d'un template Word avec les chapitres règlementaires (qu'il m'a fourni), d'un fichier Excel et de coller tout ce qui est dans le tableau Excel à la suite du fichier Word.
    Il veut aussi des fonctions pour copier des feuilles Excel (avec quelques modifications sur les feuilles) et selon le cas le fichier Word généré est un peu différent.

    Je vais regarder comment faire avec le serveur, une fois que j'aurais terminé de coder toutes les fonctionnalités.

    Merci beaucoup en tout cas pour les commentaires et l'aide.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  10. #10
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 587
    Par défaut
    bonjour,
    personnellement je me dis que ManusDei devrait s'intéresser au VBA il est natif dans excel et tout les cadors du C# que j'ai connu ont été capable de s'y adapter.

    en 20 ans en SSII j'ai rencontré des experts C, C++, C#, VB.NET, JAVA, PHP mais jamais en python mais je me fais vieux, de nos jours il est possible que ce soit le profile le plus recherché en ce moment.

  11. #11
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 50
    Par défaut
    Bonjour,

    L'idée est de pouvoir compiler dynamiquement du code C# comme on fait avec VBA pour offir toute la puissance du framwork .net au développeur ce petit compilateur peut être installé sous forme xll ou une ordinaire bibliothèque .

    Regarder dans ce vieux exemple:

    https://dotnet.developpez.com/telech...-compilateur-C

    Bien que le code compile et crée l'exe mais j'ai vu d'autres exemples ou on peut le faire et le lancer juste à partir de la mémoire.

  12. #12
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 587
    Par défaut
    Citation Envoyé par Mist2024 Voir le message
    Bonjour,

    L'idée est de pouvoir compiler dynamiquement du code C# comme on fait avec VBA pour offir toute la puissance du framwork .net au développeur ce petit compilateur peut être installé sous forme xll ou une ordinaire bibliothèque .

    Regarder dans ce vieux exemple:

    https://dotnet.developpez.com/telech...-compilateur-C

    Bien que le code compile et crée l'exe mais j'ai vu d'autres exemples ou on peut le faire et le lancer juste à partir de la mémoire.
    il existe scriptcs qui permet de compiler et d'exécuter du code C# au format texte, ça fonctionne un peut comme un fichier bat. ces fichier texte porte l'extension .csx et tu peux les ecrire avec Visual Studion Code.

    tu peux même créer des Form {formulaire} en C# qui s'afficheront à l'exécution du script.

    Nom : Sans titre.png
Affichages : 63
Taille : 24,3 Ko

    Code Formulaire.csx : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    usingSystem;using System.Windows.Forms;
    using System.Drawing;
    
    // Création du formulaire
    var form = new Form
    {
        Text = "Formulaire d'inscription",
        Width = 400,
        Height = 350,
        StartPosition = FormStartPosition.CenterScreen,
        FormBorderStyle = FormBorderStyle.FixedDialog,
        MaximizeBox = false,
        BackColor = Color.WhiteSmoke
    };
    
    // Label et TextBox pour Nom
    var lblNom = new Label
    {
        Text = "Nom :",
        Location = new Point(30, 30),
        AutoSize = true,
        Font = new Font("Segoe UI", 10, FontStyle.Bold)
    };
    
    var txtNom = new TextBox
    {
        Location = new Point(150, 27),
        Width = 200,
        Font = new Font("Segoe UI", 10)
    };
    
    // Label et TextBox pour Prénom
    var lblPrenom = new Label
    {
        Text = "Prénom :",
        Location = new Point(30, 70),
        AutoSize = true,
        Font = new Font("Segoe UI", 10, FontStyle.Bold)
    };
    
    var txtPrenom = new TextBox
    {
        Location = new Point(150, 67),
        Width = 200,
        Font = new Font("Segoe UI", 10)
    };
    
    // Label et TextBox pour Âge
    var lblAge = new Label
    {
        Text = "Âge :",
        Location = new Point(30, 110),
        AutoSize = true,
        Font = new Font("Segoe UI", 10, FontStyle.Bold)
    };
    
    var txtAge = new NumericUpDown
    {
        Location = new Point(150, 107),
        Width = 200,
        Font = new Font("Segoe UI", 10),
        Minimum = 1,
        Maximum = 120
    };
    
    // Label et TextBox pour Profession
    var lblProfession = new Label
    {
        Text = "Profession :",
        Location = new Point(30, 150),
        AutoSize = true,
        Font = new Font("Segoe UI", 10, FontStyle.Bold)
    };
    
    var txtProfession = new TextBox
    {
        Location = new Point(150, 147),
        Width = 200,
        Font = new Font("Segoe UI", 10)
    };
    
    // Bouton Soumettre
    var btnSoumettre = new Button
    {
        Text = "Soumettre",
        Location = new Point(150, 200),
        Width = 100,
        Height = 35,
        Font = new Font("Segoe UI", 10, FontStyle.Bold),
        BackColor = Color.FromArgb(102, 126, 234),
        ForeColor = Color.White,
        FlatStyle = FlatStyle.Flat,
        Cursor = Cursors.Hand
    };
    
    // Label pour afficher le résultat
    var lblResultat = new Label
    {
        Location = new Point(30, 250),
        Width = 340,
        Height = 50,
        Font = new Font("Segoe UI", 9),
        ForeColor = Color.DarkGreen,
        Text = ""
    };
    
    // Événement du bouton
    btnSoumettre.Click += (sender, e) =>
    {
        if (string.IsNullOrWhiteSpace(txtNom.Text) ||
            string.IsNullOrWhiteSpace(txtPrenom.Text) ||
            string.IsNullOrWhiteSpace(txtProfession.Text))
        {
            MessageBox.Show("Veuillez remplir tous les champs !", "Erreur", 
                            MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return;
        }
    
        string message = $"Nom : {txtNom.Text}\n" +
                         $"Prénom : {txtPrenom.Text}\n" +
                         $"Âge : {txtAge.Value} ans\n" +
                         $"Profession : {txtProfession.Text}";
    
        lblResultat.Text = $"✓ Enregistré: {txtPrenom.Text}{txtNom.Text}, " +
                           $"{txtAge.Value} ans, {txtProfession.Text}";
    
        MessageBox.Show(message, "Informations enregistrées", 
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
        
        Console.WriteLine("\n=== Données du formulaire ===");
        Console.WriteLine(message);
    };
    
    // Ajout des contrôles au formulaire
    form.Controls.Add(lblNom);
    form.Controls.Add(txtNom);
    form.Controls.Add(lblPrenom);
    form.Controls.Add(txtPrenom);
    form.Controls.Add(lblAge);
    form.Controls.Add(txtAge);
    form.Controls.Add(lblProfession);
    form.Controls.Add(txtProfession);
    form.Controls.Add(btnSoumettre);
    form.Controls.Add(lblResultat);
    
    // Affichage du formulaire
    Application.EnableVisualStyles();
    
    Application.Run(form);

  13. #13
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 50
    Par défaut
    On peut compiler votre exemple en plaçant le code dans une structure basique d'un programme C# une fonction main dans une classe et appeler la commande csc /target:winexe "formulaire.cs" donc sans installer quoi ce soit c'est-là tout l’intérêt puisque les compilateurs C# VB.net TypeScript font partie du Framework et sont disponibles sur tous les pc, la question c'est la création d'une encapsulation (une bibliothèque automation) pour pouvoir l’utiliser depuis un projet VBA et pour échanger les données.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel de code R/Python via VBA
    Par Compte temporaire dans le forum Général VBA
    Réponses: 2
    Dernier message: 27/03/2024, 08h15
  2. Réponses: 8
    Dernier message: 30/09/2009, 19h25
  3. Appel de fonction/script python via PHP
    Par rastalien dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 21/02/2008, 19h12
  4. Réponses: 8
    Dernier message: 08/06/2007, 22h39
  5. Réponses: 6
    Dernier message: 06/03/2006, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo