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

VB.NET Discussion :

Echanger des données de type "Décimal" (Variant ou Object) entre vba Excel et une dll en vb.net [Débutant]


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 34
    Points
    34
    Par défaut Echanger des données de type "Décimal" (Variant ou Object) entre vba Excel et une dll en vb.net
    Bonjour,

    J'ai un problème tout bête d'échanges de données décimales entre un développement dll effectué sous vb.net et Excel :
    Le format décimal en vba est "Variant"
    Normalement le format correspondant pour l'échange de données en vb.net est "Objet"

    Quand il s'agit de récupérer des données de la dll vers Excel aucun problèmes, en revanche impossible de faire l'échange ensens inverse (de VBA vers la dll) :

    Ci-joint un extrait du code vb.net :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <ClassInterface(ClassInterfaceType.AutoDual), Serializable(), ComVisible(True)> _
    Public Class Derive
        Public Property Saison As Integer
        Public Property DerPh1 As Object
        Public Property DerPh2 As Object
    End Class
    et le pendant côté VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim LesDerives As New Derives      ' Collection d'Objets "Derive" initialisées dans la dll
    Dim LaDerive As New Derive
     
    MsgBox LesDerives(2013).DerPh1      ' La valeur décimale est correctement affichée sous Excel : dll => vba OK
     
    LesDerives(2013).DerPh1 = -2.5      ' génrère un message d'erreur d'exécution '424' Objet requis : vba => dll NOK
     
    LaDerive.Saison = 2013      'Instruction fonctionnant correctement (type Integer)
    LaDerive.DerPh1 = -2.5      ' génrère un message d'erreur d'exécution '424' Objet requis
    J'ai bien essayer de passer par une variable déclarée en format Objet, d'ajouter Set devant l'affectation, de supprimer la déclaration de type dans la dll (As Object), de déclarer des sous fonctions Get et Set pour les propriétés mais j'avoue que je sêche !
    (Si cela peut aider, quand je décline la property avec les 2 fonctions Get et Set, LaDerive.Saison = 2013 redirige bien vers la sous fonction "Set" de la propriété, en revanche LaDerives.DerPh1 redirige le code vers la sous Fonction "Get" de la propriété avant d'envoyer le message d'erreur ???)

    Les mêmes lignes de codes intégrées dans la dll sous vb.net fonctionnent elles correctement ...



    Quelqu'un a-t-il la solution ?

    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 34
    Points
    34
    Par défaut
    Bon, j'ai trouvé un contournement (mais qui n'est pas très statisfaisant) : j'ai créé deux méthodes dans ma classe pour faire le Job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <ClassInterface(ClassInterfaceType.AutoDual), Serializable(), ComVisible(True)> _
    Public Class Derive
        Public Property Saison As Integer
        Public Property DerPh1 As Object
        Public Property DerPh2 As Object
     
        Public Sub SetPh1(ByVal _Ph1)
            DerPh1 = _Ph1
        End Sub
     
        Public Sub SetPh2(ByVal _Ph2)
            DerPh2 = _Ph2
        End Sub
    End Class

    Du coup pour modifier la propriété le code sous Excel devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim LaDerive As New Derive
     '  LaDerive.DerPh1 = -2.5      ' génère un message d'erreur d'exécution '424' Objet requis
    LaDerive.SetPh1 -2.5             ' En passant par une méthode, cela fonctionne
    Sur cette classe cela passe encore car je n'ai que 2 propriétés concernées, mais j'ai d'autres classes qui en contiennent beaucoup plus...

    Est-ce un bug de Visual Studio (j'utilise la version 2010 ?) ou un mauvaise utilisation de ma part ? J'avoue que je sèche

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par philoul Voir le message
    Bonjour,
    Le format décimal en vba est "Variant"
    Merci
    Faux. Decimal est disponible en VBA
    Comme ils disent dans l'aide de VBA Excel, on doit commencer par déclarer la variable en Variant, et ensuite on la convertit en Décimal.



    Decimal, type de données
    Type de données stockant des nombres décimaux avec un décalage exprimé en puissance de 10. Pour les nombres à décalage nul, c'est-à-dire qui ne comportent pas de décimales, la plage de valeurs est +/-79 228 162 514 264 337 593 543 950 335. Pour les nombres à 28 décimales, la plage est +/-7,9228162514264337593543950335. Le plus petit nombre différent de zéro pouvant être représenté dans le type Decimal est 0,0000000000000000000000000001.

    Notez que le type de données Decimal n'est pour le moment disponible qu'au sein d'une variable de type Variant. Il est impossible d'attribuer à une variable le type Decimal. Vous pouvez en revanche créer une variable de type Variant et de sous-type Decimal à l'aide de la fonction CDec.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    Faux. Decimal est disponible en VBA
    Comme ils disent dans l'aide de VBA Excel, on doit commencer par déclarer la variable en Variant, et ensuite on la convertit en Décimal.
    Effectivement la conversion en Decimal est possible en VBA en tant que sous type de Variant, mais toutes déclarations de variables (vb.net) en format Decimal sont refusées par VBA Excel... sous VB.Net, le format à utiliser pour la compatibilité avec VBA est le format "Object" pour la manipulation de données décimales...

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Je ne sais pas quelle patente tu veux faire, mais je pense que tu devrais (re)faire tes devoirs. Il n'y a pas de correspondance parfaite entre les types de données VB6-VBA et VB.net

    Par exemple:

    Description VBA VB.net
    Entier 16 bits Integer Short ou Int16
    Entier 32 bits Long Integer ou int32
    Entier 64 bbits Long
    Variant Object
    Decimal Currency
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 34
    Points
    34
    Par défaut
    C'est bien ce que j'utilisedans mon code vb.net : j'ai declare en Object les données de mes classes (decimales) que je veux manipuler ou echanger avec excel (format variant). (voir mes codes respectifs dans mon post d'origine).

    Mon problème est que je n'arrive pas depuis excel à affecter des propriétés en format variant/object (en pratique des valeur numeriques decimales).


    J'ai dans visual studio (2010) essayé de déclarer ma property de type Object avec get et set en mettant des points d'arrêts partout pour essayer de comprendre :

    la ligne vba excel : LaDerive.DerPh1 = -2.15
    qui correspond à l'affectation d'une valeur à la propriété de type object de ma classe Derive construite dans ma dll passe par la sous fonction "get" de la property DerPh1 et non par la sous fonction "set" ????

    Pour les autres type de variables utilisée cela fonctionne correctement (j'utilise des dates, string, integer)

    D'ou ma question sur un éventuel bug de visual studio (la seule façon que j'ai trouvée pour affecter une decimale depuis vba est de passer par une methode specifique... (contournement mais pas top ...)

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Le Framework .net n'a absolument rien de commun avec la technologie COM. De ce fait, la "compatibilité" entre le Framework .net est assurée par des wrappers qui sont soit fournis par les fabricants; (dans le cas d'Office, ce sont les Primary Interop Assemblies), soit déduits et construits par VisualStudio, au moment de l'établissement de la référence. Il n'y a rien de surprenant à ce VB.net considère l'ensemble d'Excel comme un objet, ou un conteneur d'objets.

    Ceci dit, créer une dll maison pour promener des données entre Excel et une application VB me semble quelque peu illogique. VB peut piloter Excel par automation et accéder à tous les objets d'Excel. VB contient également toutes les fonctions de VBA et peut mettre dans une cellule d'Excel toutes les fonctions intrinsèques d'Excel, lesquelles vont fonctionner de la même façon que si elles sont entrées à la mitaine dans Excel.

    Si tu veux d'éviter de programmer les calculs, il existe aussi un paquet de composants .net, et même des gratuits, pour du calcul numérique avancé genre Transformations de Fourier et calcul intégral et différentiel.

    MathNet.Numerics disponible sur http://www.codeplex.com
    IlNumerics disponible en Package NuGet



    Mais, sans connaître le but que tu poursuis, c'est bien difficile d'en dire plus.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Helas l'equivalent du Decimal de VB.Net est en VBA/VB6 le Currency mais à condition de :
    -de le marshaller comme UnmanagedType.Currency sans passer par des props get set car le set n'accepte pas l'attribut MarshalAs
    -soit d'utiliser - le converisseur Com -Decimal.ToOACurrency(vardecimal) et Decimal.FromOACurrency(varlong) (nb: long du vb6 )

    La methode du marshalling est la meilleure pour la conversion des types car elle "sure"(safe)...
    Evidemment elle necessite un sub SetValeur et un Function GetValeur comme tu l'as decouvert qui acceptent eux les attributs de marshalling....!!!!

    code .vb net du class DeriveCom:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Imports System.Runtime.InteropServices
     
    <ComClass(DeriveCom.ClassId, DeriveCom.InterfaceId, DeriveCom.EventsId)> _
    Public Class DeriveCom
     
    #Region "GUID COM"
        ' Ces GUID fournissent l'identité COM pour cette classe 
        ' et ses interfaces COM. Si vous les modifiez, les clients 
        ' existants ne pourront plus accéder à la classe.
        Public Const ClassId As String = "9A0B557A-2436-44B2-860E-C002C5BF632F"
        Public Const InterfaceId As String = "A5D158D1-A6D4-4C28-98D5-1BC6D6C946D0"
        Public Const EventsId As String = "81509D8C-1D2D-4B94-93BA-C30E7DDE4651"
    #End Region
     
        ' Une classe COM pouvant être créée doit avoir Public Sub New() 
        ' sans paramètre, sinon, la classe ne sera pas 
        ' inscrite dans le Registre COM et ne pourra pas être créée 
        ' via CreateObject.
        Public Sub New()
            MyBase.New()
        End Sub
        Private m_saison As Integer = 334455
        Public Property Saison As Integer
            Get
                Return m_saison
            End Get
            Set(ByVal value As Integer)
                m_saison = value
            End Set
        End Property
        <MarshalAs(UnmanagedType.Currency)>
        Private m_derph1 As Decimal = 3456.25
        Public Sub SetDerph1(<MarshalAs(UnmanagedType.Currency)> ByVal p As Decimal)
            m_derph1 = p
        End Sub
        Public Function GetDerph1() As <MarshalAs(UnmanagedType.Currency)> Decimal
     
            Return m_derph1
        End Function
    End Class
    code vba /vb6 :
    (un form ,2 buttons pour obtenir et setter les valeurs:
    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
     
     
    Dim LaDerive As LibraryDecimal.DeriveCom
     
     
     
    Private Sub UserForm_Initialize()
        Set LaDerive = New LibraryDecimal.DeriveCom
        cmdToCom.Enabled = False
        TextBox1.Text = 2050
        TextBox2.Text = 2.5
    End Sub
     
    'obtient les nouvelles valeurs
    Private Sub cmdFromCom_Click()
     
        Label1.Caption = LaDerive.Saison
        Label2.Caption = LaDerive.GetDerph1()
        cmdToCom.Enabled = True
     
    End Sub
    'sette les valeurs
    Private Sub cmdToCom_Click()
        'sette les valeurs
        LaDerive.Saison = CInt(TextBox1.Text)
        LaDerive.SetDerph1 (CCur(TextBox2.Text))
        cmdToCom.Enabled = False
     
    End Sub
    bon code......

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Merci à tous pour votre aide (notamment Mabrouki sur le détail de ses explications).

    Comme je ne suis pas "accroc" au format décimal, je pense conserver dans mon code VB.net mes variables décimales en format "Object" mais (compte tenu des limitations du set sur la convertion de type de données) les doubler d'une Sub pour permettre la saisie depuis excel (si cela marche je mettrais le set de la Property en "Friend" pour pouvoir continuer à l'utiliser depuis le reste de la dll...).

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

Discussions similaires

  1. Parsing XML gestion DB I/O sur des données de type CLOB
    Par stchitembo dans le forum Oracle
    Réponses: 5
    Dernier message: 22/03/2006, 11h14
  2. [Access] Enregistrer des données de type Texte RTF
    Par portu dans le forum Bases de données
    Réponses: 22
    Dernier message: 27/10/2005, 22h54
  3. Réponses: 5
    Dernier message: 13/07/2005, 10h03

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