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 confirm�
    Inscrit en
    Novembre 2010
    Messages
    176
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    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 �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    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 : 618
    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 confirm�
    Inscrit en
    Novembre 2010
    Messages
    176
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par d�faut
    merci pyros. je regarde ceci, illico !
    je vous tiens au courant ....

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    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 confirm�
    Inscrit en
    Novembre 2010
    Messages
    176
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par d�faut
    merci pour toutes ces sources d'info !
    je dig�re et je vous dis ...

  6. #6
    Membre confirm�
    Inscrit en
    Novembre 2010
    Messages
    176
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    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 confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 537
    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 537
    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 confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 537
    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 537
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    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