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

Visual C++ Discussion :

passer une string Excel VBA vers C++


Sujet :

Visual C++

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Points : 119
    Points
    119
    Par défaut passer une string Excel VBA vers C++
    bonjour.

    j'écris des petites fonctions en C++ que je wrappe dans des DLLs pour les utiliser avec excel.

    avec des variables C++ (int, double, long, ...) et Excel (Double, Integer, .. ) [avec des 'chiffres', quoi!], je code sans problème.

    en revanche, je ne parviens pas à utiliser une String de VBA vers C++ , je choisis de la passer ByVal.

    le livre de steve dalton donne la réponse à ma question, mais je ne sais pas quoi faire avec les explications du bonhomme !

    Quand elle est passée BYVal vers C++, la String de VBA arrive comme une BSTR ... vous pouvez déclarer votre argument comme un char* , ce qui a pour effet de caster le pointeur directement vers l'espace-mémoire alloué à la BSTR
    un petit code d'illustration, en-dessous. si quelqu'un a la gentillesse de corriger. je ne sais que faire des BSTR ? char* ? reférencement et dé-férencement ??


    code C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    double __stdcall maFonction(BSTR couleur)
    {
    	double resultat;
    	if ('rouge' == couleur)
    		resultat = 3.7999;
    	else
    		resultat = 5.455;
    	return resultat;
    }
    Appel de fonction en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Declare Function maFonction Lib "C:\ .... majoliefonction.dll" _
    (ByVal couleur As String) As Double
    merci de votre aide.
    édouard

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 578
    Points : 1 537
    Points
    1 537
    Par défaut
    Salut,

    Je ne connais pas du tout VBA mais apparemment un BSTR peut se caster en char*. Mais, pour comparer 2 char* en C il faut utiliser strcmp (et pas == qui ferait juste une comparaison du pointeur, et nom de la chaine). Enfin, ça donnerait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    double __stdcall maFonction(BSTR couleur)
    {
    	double resultat;
    	if ( strcmp("rouge",  (char*)couleur) == 0)
    		resultat = 3.7999;
    	else
    		resultat = 5.455;
    	return resultat;
    }
    Petit piège, strcmp ne revois pas vrai ou faux, mais la "différence" entre les 2 chaînes (donc différence = 0 <=> 2 chaînes sont égales).
    Juste une chose, c'est peut être juste une erreur de frappe de ta part, mais une chaine s'écrit entre " (double quote) et non entre ' (simple quote).

    En espérant que ça t'aidera.

    A+

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Points : 119
    Points
    119
    Par défaut
    merci pyros. je regarde ceci, illico !
    je vous tiens au courant ....

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 157
    Points : 12 271
    Points
    12 271
    Par défaut
    Petite précision, le B de BSTR, c'est pour Basic.
    Donc l'intégration d'une chaîne VBA via BSTR est ce qu'il y a de plus "naturel".
    http://msdn.microsoft.com/en-us/library/ms221069.aspx

    Mais, il y a quelques "petites" embrouilles inhérentes au format.

    Primo, les chaînes VBA sont toutes en UNICODE, donc votre comparaison avec une chaîne "rouge" avec la fonction "strcmp", elle n'est pas prête de retourner 0.

    Il faut utiliser des chaînes et des fonctions UNICODE type L"rouge" à la place de "rouge" et les fonctions qui vont avec.
    Voici quelques exemples de manipulations de chaînes BSTR en C/C++. (Attention, il est plus prudent d'utiliser la MACRO "L" que "_T" de leurs exemples):
    http://www.codeproject.com/KB/string/bstrsproject1.aspx

    Et utiliser la classe _bstr, qui simplifie grandement le triturage de chaîne au format BSTR.
    http://msdn.microsoft.com/en-us/libr...d6(VS.71).aspx

    Dont les comparaisons :
    http://msdn.microsoft.com/en-us/libr...(v=VS.71).aspx

    Secondo, comme le montre ce lien :
    http://msdn.microsoft.com/en-us/library/ms221069.aspx
    Une chaîne BSTR a une représentation en mémoire bien plus complexe qu'une chaîne C (mais bien moins qu'une chaîne std:string du C++ ).
    Donc
    ce qui a pour effet de caster le pointeur directement vers l'espace-mémoire alloué à la BSTR
    c'est que le pointeur sera sur le "Length prefix" d'un BSTR et pas sur le début de la chaîne UNICODE contenue dans la BSTR.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Points : 119
    Points
    119
    Par défaut
    merci pour toutes ces sources d'info !
    je digère et je vous dis ...

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Points : 119
    Points
    119
    Par défaut
    en fait, je me suis laissé aller à lire le tout et d'autres choses WideCharToMultiByte et j'avoue que je ne vois toujours pas comment m'en sortir avec mon petit example de code.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 157
    Points : 12 271
    Points
    12 271
    Par défaut
    A l'arrache donc pas du tout testé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    _bstr_t rouge = _bstr_t(L"rouge");
     
    double __stdcall maFonction(BSTR couleur)
    {
    	double resultat;
    	if ( _bstr_t(couleur,false) == rouge)
    		resultat = 3.7999;
    	else
    		resultat = 5.455;
    	return resultat;
    }

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Salut c'est se casser la tête pour pas grand chose il existe
    _com_util::ConvertBSTRToString

    http://msdn.microsoft.com/en-us/library/ewezf1f6.aspx


    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
    // ConvertBSTRToString.cpp
    #include <comutil.h>
    #include <stdio.h>
     
    #pragma comment(lib, "comsuppw.lib")
     
    int main() {
       BSTR bstrText = ::SysAllocString(L"Test");
       wprintf_s(L"BSTR text: %s\n", bstrText);
     
       char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
       printf_s("char * text: %s\n", lpszText2);
     
       SysFreeString(bstrText);
       delete[] lpszText2;
    }

    Au besoin utiliser également SysAllocSting et SysFreeString
    http://msdn.microsoft.com/en-us/library/ms221458.aspx


    Ou alors comme avec l'exemple du MSDN un simple wprintf_s suffit et pour regarder si tu as une chaine de caractêre tu peux prendre wcscmp
    http://msdn.microsoft.com/en-us/libr...1(v=vs.80).asp

    Regarder aussi avec la classe MFC CString.


    Mais perso les chaines de caractères je préfère gérer cela avec des std::string c'est vraiment plus souple..
    si tu as un BSTR donc tu le convertis en wchar_t et ensuite avec une simple affectation tu peux initialiser un std::wstring de la STL

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Donc voilà ta fonction...
    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
     
    #include <string>
     
     
    double __stdcall maFonction(BSTR couleur)
    {
     
    char* lpszText = _com_util::ConvertBSTRToString(couleur);
     
    double resultat;
    if(strcmp(lpszText,"rouge")) resultat = 3.7999; else resultat = 5.455;
    /// avec un std::string
    std::string strCouleur=lpszText	;
    if (strCouleur=="rouge") resultat = 3.7999; else resultat = 5.455;
     
    SysFreeString(bstrText);
    	return resultat;
    }

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 157
    Points : 12 271
    Points
    12 271
    Par défaut
    Je trouve que mon exemple avec la classe _bstr_t est bien plus simple et bien plus lisible.

    Pas de tripatouillage avec des chaines de caractère en ASCII, pas de pointeur de chaîne, de gestion mémoire, etc.

    Keep It Simple and Stupid

Discussions similaires

  1. passer une variable excel à access en vba
    Par fafaf dans le forum Access
    Réponses: 2
    Dernier message: 22/07/2015, 15h16
  2. passer une feuille excel dans un fonction
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/12/2006, 00h08
  3. [VB Project] Excel Vba vers Microsoft Project
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/10/2006, 12h06
  4. passer une String en paramètre
    Par fabhxc dans le forum Langage
    Réponses: 11
    Dernier message: 28/12/2005, 15h46
  5. Réponses: 1
    Dernier message: 15/04/2005, 11h30

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