none
Conversion VBA en une Appli WindowsForm C# RRS feed

  • Question

  • J'ai une application VBA (sous excel) conséquente que j'aimerais convertir en Application native avec Visual Studio C#.
    le code pas trop de problème j'ai commencé à écrire une application qui converti l'essensiel d'un Code VBA en C#.
    Mais pour les UserForm c'est plus compliqué ou du moins plus long car je n'ai pas trouvé d'outils.
    J'ai donc imaginé de crer (en VBA) un fichier (au format XML si possible) pour chaque UserForm contenant les caractéristiques de chaque Control du UserForm et du UserForm lui même.
    J'ai imaginé dans une appli C#, récupérer pour chaque UserForm ces caractéristiques et construire  un Windows form avec tous ces Controls.
    Je voudrais ensuite enregister ce Windows Form ainsi construit.

    Mais comment ??????????
    riri
    • Déplacé Alex Petrescu mardi 2 mars 2010 13:20 C# (Origine :Visual Basic)
    lundi 1 mars 2010 12:27

Réponses

  • Bonjour,

    Est-ce que en VBA vous pouvez parcourir les contrôles de manière récursif ?
    Si oui, votre programme VBA devrait généré du code C# afin de construire votre form en C#, vous pouvez placer ce code (non bogué !) dans la méthode InitializeComponent() des fenêtres C# crée, ainsi le Designer de Visual Studio se charge de charger la fenêtre et de générer un code tout propre.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse BRI_67 mardi 2 mars 2010 14:20
    lundi 1 mars 2010 21:01
    Modérateur
  • bonjour à tous (gilles, fred, Alex).

    Désolé pour le choix de section mais je ne savais pas trop ou poser ma question.

    Pour répondre à la question de Gilles TOURREAU dans sa dernière réponse, oui en VBA on peut parcourir tout les contrôles d'un UserForm et d'ailleurs tous les composants d'un projet.
    j'ai même imaginé de créer en VBA un fichier XML descriptif des "UserForm" d'un projet comme par exemple :
    <?xml version="1.0" encoding="utf-8" ?>
    <USF>
      <UserForm Nom= "UserForm_Test_Couleur">
        <UsfSize >
          <Height> 251,25</Height>
          <Width> 440,25</Width>
        </UsfSize>
        <Control Nom= "Label1">
          <Height> 251,25</Height>
          <Width> 440,25</Width>
          <Left> 251,25</Left>
          <Top> 440,25</Top>
        </Control>
        <Control Nom= "TextBoxMsg1">
          <Height> 17,95</Height>
          <Width> 312</Width>
          <Left> 114</Left>
          <Top> 12</Top>
        </Control>
      </UserForm>
      <UserForm Nom= "UserForm_Test_Couleur">
        <UsfSize >
          <Height> 251,25</Height>
          <Width> 440,25</Width>
        </UsfSize>
        <Control Nom= "Label1">
          <Height> 251,25</Height>
          <Width> 440,25</Width>
          <Left> 251,25</Left>
          <Top> 440,25</Top>
        </Control>
        <Control Nom= "TextBoxMsg1">
          <Height> 17,95</Height>
          <Width> 312</Width>
          <Left> 114</Left>
          <Top> 12</Top>
        </Control>
      </UserForm>
    </USF>
    On peut aussi exporter le code d'un UserForm, Module, Classe etc...
    On peut d'ailleurs exporter un UserForm mais le résultat est binaire et je ne sais pas le décortiquer.

    J'ai imaginé ensuite dans une appli Windows Form écrite en C# à partir du fichier XML de construire par programme pour chaque Form les différents Controls du Form et je cherchais une méthode pour passer du Form obtenu à la création de chaque Formx.Designer.cs 

    MAIS si j'ai bien compris la proposition de Gilles TOURREAU, il s'agit tous simplement de générer, SANS bug !, le Code de la méthode InitializeComponent() pour chaque Form (dans le fichier Formx.Désigner.cs).

    Y a t-il une autre solution plus automatique ?

    Pour le code c'est pas trés compliqué c'est du travail d'éditeur et avec un bon programme C#, je pense pouvoir y arriver.


    merci à tous.

    riri
    • Marqué comme réponse BRI_67 mardi 2 mars 2010 14:20
    mardi 2 mars 2010 14:13
  • Bonjour,

    Bien évidemment, vous pouvez lire le document XML et créer vos contrôles dynamiquement... L'inconvénient de cette solution et que vous ne pouvez pas utiliser le designer de visual studio pour modifier les propriétés ou associer le code des différents événements des contrôles.

    La solution que j'envisagerai est d'utiliser celle que j'ai évoqué précédemment, c'est à dire de générer du code dans InitializeComponent() (le plus simplement possible), de charger la fenêtre dans Visual Studio afin que le Designer puisse réecrire le code à sa manière.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    mercredi 3 mars 2010 22:22
    Modérateur

Toutes les réponses

  • Bonjour,

    Ne serait-il pas plus facile de créer une appli en VB plutot que C sharp ?

    Microsoft explique comment faire

    http://msdn.microsoft.com/en-us/library/aa192490%28office.11%29.aspx


    une autre référence intéressante

    http://blogs.msdn.com/pstubbs/archive/2004/01/15/59049.aspx


    fred
    lundi 1 mars 2010 12:37

  • Le premier je connais et j'ai déjà regardé.
    Le deuxième lien non.
    A priori d'aprés ce que j'ai vu jusqu'à présent on parle dans ces articles de la conversion du code, mais pas des UserForm.
    Donc pour moi le fait de convertir en VB plutôt que C# ne résouds pas le pb des UserForm.
    A moins que j'ai loupé quelques chose !
    riri
    lundi 1 mars 2010 12:54
  • Bonjour,

    Est-ce que en VBA vous pouvez parcourir les contrôles de manière récursif ?
    Si oui, votre programme VBA devrait généré du code C# afin de construire votre form en C#, vous pouvez placer ce code (non bogué !) dans la méthode InitializeComponent() des fenêtres C# crée, ainsi le Designer de Visual Studio se charge de charger la fenêtre et de générer un code tout propre.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse BRI_67 mardi 2 mars 2010 14:20
    lundi 1 mars 2010 21:01
    Modérateur
  • Bonjour,

     

    Merci Fred et Gilles pour vos réponses. Je vais déplacer ce thread dans la section C#, car VBA et C# ne sont pas convenables pour cette section, Visual Basic.NET

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse BRI_67 mardi 2 mars 2010 14:20
    • Non marqué comme réponse Alex Petrescu mercredi 3 mars 2010 12:05
    mardi 2 mars 2010 13:19
  • bonjour à tous (gilles, fred, Alex).

    Désolé pour le choix de section mais je ne savais pas trop ou poser ma question.

    Pour répondre à la question de Gilles TOURREAU dans sa dernière réponse, oui en VBA on peut parcourir tout les contrôles d'un UserForm et d'ailleurs tous les composants d'un projet.
    j'ai même imaginé de créer en VBA un fichier XML descriptif des "UserForm" d'un projet comme par exemple :
    <?xml version="1.0" encoding="utf-8" ?>
    <USF>
      <UserForm Nom= "UserForm_Test_Couleur">
        <UsfSize >
          <Height> 251,25</Height>
          <Width> 440,25</Width>
        </UsfSize>
        <Control Nom= "Label1">
          <Height> 251,25</Height>
          <Width> 440,25</Width>
          <Left> 251,25</Left>
          <Top> 440,25</Top>
        </Control>
        <Control Nom= "TextBoxMsg1">
          <Height> 17,95</Height>
          <Width> 312</Width>
          <Left> 114</Left>
          <Top> 12</Top>
        </Control>
      </UserForm>
      <UserForm Nom= "UserForm_Test_Couleur">
        <UsfSize >
          <Height> 251,25</Height>
          <Width> 440,25</Width>
        </UsfSize>
        <Control Nom= "Label1">
          <Height> 251,25</Height>
          <Width> 440,25</Width>
          <Left> 251,25</Left>
          <Top> 440,25</Top>
        </Control>
        <Control Nom= "TextBoxMsg1">
          <Height> 17,95</Height>
          <Width> 312</Width>
          <Left> 114</Left>
          <Top> 12</Top>
        </Control>
      </UserForm>
    </USF>
    On peut aussi exporter le code d'un UserForm, Module, Classe etc...
    On peut d'ailleurs exporter un UserForm mais le résultat est binaire et je ne sais pas le décortiquer.

    J'ai imaginé ensuite dans une appli Windows Form écrite en C# à partir du fichier XML de construire par programme pour chaque Form les différents Controls du Form et je cherchais une méthode pour passer du Form obtenu à la création de chaque Formx.Designer.cs 

    MAIS si j'ai bien compris la proposition de Gilles TOURREAU, il s'agit tous simplement de générer, SANS bug !, le Code de la méthode InitializeComponent() pour chaque Form (dans le fichier Formx.Désigner.cs).

    Y a t-il une autre solution plus automatique ?

    Pour le code c'est pas trés compliqué c'est du travail d'éditeur et avec un bon programme C#, je pense pouvoir y arriver.


    merci à tous.

    riri
    • Marqué comme réponse BRI_67 mardi 2 mars 2010 14:20
    mardi 2 mars 2010 14:13
  • Bonjour,

    Bien évidemment, vous pouvez lire le document XML et créer vos contrôles dynamiquement... L'inconvénient de cette solution et que vous ne pouvez pas utiliser le designer de visual studio pour modifier les propriétés ou associer le code des différents événements des contrôles.

    La solution que j'envisagerai est d'utiliser celle que j'ai évoqué précédemment, c'est à dire de générer du code dans InitializeComponent() (le plus simplement possible), de charger la fenêtre dans Visual Studio afin que le Designer puisse réecrire le code à sa manière.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    mercredi 3 mars 2010 22:22
    Modérateur
  • Bonjour,

    J'ai bien compris que générer dynamiquement les contrôles n'était pas la bonne solution.
    Comme dit dans mon dernier message j'ai bien compris qu'il faut que je génère le code habituellement contenu dans la méthode InitializeComponent.
    Jusque là pas de pb.
    J'ai terminé les développements VBA et génère un fichier XML pour un ou plusieurs UserForm.

    Mais je ne comprends pas le reste de votre phrase
    "charger la fenêtre dans Visual Studio afin que le Designer puisse réecrire le code à sa manière."

    Je vais dans la Méthode InitializeComponent() de Form1.Designer.cs générer le code adéquate à partir de mon fichier xml  dans une solution créée au préalable avec visual studio 2005.

    A l'ouverture de la solution je verrais bien le résultat et j'aurais certainement l'occasion de revenir vers vous.

    Merci pour votre aide.
    riri
    mardi 9 mars 2010 12:51