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 :

dll VB.NET pour VBA [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut dll VB.NET pour VBA
    Bonjour,

    J'ai tenté de créer une dll en VB.NET afin de pouvoir l'utiliser sous VBA (Excel)
    Tout se passe bien jusqu'à l'appel d'une méthode de mon objet : Erreur VBA = Argument ou appel de procédure incorrect. C'est la première fois que je touche au .NET et aux DLL donc j'ai certainement omis certaines choses, mais je ne trouve pas.
    La classe VB.NET permet simplement le calcul de médiane sur des tableaux à 1 ou 2 dimensions. (Le code fonctionne en VB.NET).
    Je sais bien que la fonction mediane existe sous VBA mais c'est un premier code de test.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Public Class Stats
     
        Public Function Mediane(ByRef tabValue() As Double) As Double
            Dim tabSize As Long
            Mediane = 0
            If Not IsNothing(tabValue) AndAlso tabValue.Length > 0 Then
                Array.Sort(tabValue)
                tabSize = tabValue.Length
                If tabSize Mod 2 = 0 Then
                    Mediane = (tabValue(tabSize / 2 - 1) + tabValue(tabSize / 2)) / 2
                Else
                    Mediane = tabValue((tabSize + 1) / 2 - 1)
                End If
            End If
        End Function
     
     
        'TabCriteria et TabValue doivent être de même taille
        Public Function Mediane(ByRef tabValue(,) As Double) As Double
     
            Dim tabCalcul() As Double
            Dim i As Long, j As Long, k As Long, n As Long, m As Long
     
            Mediane = 0
     
            ' - Test vacuité tabCriteria
            If IsNothing(tabValue) Then Exit Function
     
            ' - Construction tableau 1D
            n = UBound(tabValue, 1) + 1
            m = UBound(tabValue, 2) + 1
            ReDim tabCalcul(m * n - 1)
            k = 0
            For i = 0 To n - 1
                For j = 0 To m - 1
                    tabCalcul(k) = tabValue(i, j)
                    k = k + 1
                Next j
            Next i
     
            ' - Calcul
            Mediane = Mediane(tabCalcul)
     
        End Function
     
        Public Sub TestMediane()
            Debug.Print(Mediane({{1, 2, 3, 4}, {1, 2, 3, 4}}))
            Debug.Print(Mediane({1, 2, 3, 4, 5}))
        End Sub
     
    End Class
    et voici le code VBA qui plante à mon grand désespoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TestMediane()
     
        Dim oStats As New Stats.Stats
        Dim i As Integer, mediane As Double
        Dim tabTest(1 To 4) As Double
     
        For i = 1 To 4
            tabTest(i) = i
        Next i
        mediane = oStats.mediane(tabTest)  'plante ici
        Debug.Print mediane
     
    End Sub
    J'espère que vous pourrez m'aider car je n'ai pas trouvé grand chose sur le net.
    Merci d'avance.

  2. #2
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Yep,

    Logiquement si c'est comme en VB6 (ce que je pense être le cas) tu dois créer un composant COM en .net, l'enregistrer et ensuite tu pourrais l'utiliser en VB(A).

    Voir cet articleque j'ai écris il y a quelques temps.

  3. #3
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Merci pour la réponse,

    J'ai suivi ce tutoriel qui est différent du tien mais qui dans les grandes lignes semble faire la même chose.
    Je vois bien ma classe dans les refs VBA, et j’arrive bien à instancier un objet. Le problème surgit à l'appel de la méthode. Est ce la surcharge de la fonction Médiane qu'il n’apprécie pas???

  4. #4
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Je connais le tuto que tu as utilisé, je m'en suis servis (parmi d'autres) pour comprendre la techno avant de faire le mien ;-)

    J'aurais tendance à te proposer un simple test : Crée une méthode dans ton objet .net et donne lui un nom dont tu es sur qu'il n’existe pas. Affiche une simple boite de dialogue et cela permettra déjà de cibler un peu le problème.

    Au sinon au minimum une trace (messagebox, log , en debug) pour voir s'il plante à l'appel de la méthode ou dans celle-ci.

    Il faudrait que je relise un peu mes notes mais il me semble qu'il y a une subtilité pour le passage d'arguments autres que des types primitifs ...

    Peut-être une piste ?

  5. #5
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Alors effectivement j'ai pu tracer les problèmes et arriver à faire marcher ma fonction Mediane.

    En fait il y' avait deux problèmes:
    1 - A priori la surcharge de fonctions n'est pas "appréciée" par VBA, j'ai l'impression qu'il prend la première définition qu'il trouve. => Renommage de la 2eme fonction Mediane en Mediane2D.
    Je ne suis pas non plus certain de ce que j'avance, alors si quelqu'un peut infirmer ou confirmer cette gestion des surcharges....
    2 - Mes tableaux VBA commençaient à l'indice 1 alors qu'en VB.NET c'est toujours 0.

    J'en profite pour poser une autre question : est t-il possible de rendre "visibles" les membres et méthodes de ma classe dans VBA? Pour l'auto-complétion par exemple?

    Par avance merci.

  6. #6
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    - Pour la surcharge cela ne m'étonne pas de trop vu que le VB comme le VBA (je pense) n'est pas orienté objet. Donc je suppose qu'il donne la priorité aux fonctions définies par le langage qu'à celle des composants COM. Enfin à vérifier effectivement.
    - Pour les tableaux ca oui c'est connu c'était une des "grosses" différences entre le VB6 et .net (dans tous les tutos pour la migration des projets).

    Pour ta dernière question je ne saurais te répondre comme cela, il doit y avoir moyen en creusant un peu dans le développement d'Objet COM. Pour preuve j'écris un article sur l'utilisation de l'objet d'Acrobat Reader et effectivement j'ai l'auto complétion

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Citation Envoyé par issoram Voir le message
    J'en profite pour poser une autre question : est t-il possible de rendre "visibles" les membres et méthodes de ma classe dans VBA? Pour l'auto-complétion par exemple?
    Avec VB6, j'avais trouvé en utilisant une interface au niveau de la dll .NET. (dll en vb.net ; exe en vb6) Note, il existe peut être d'autres solutions.
    Le message descriptif. Espérant que cela fonctionne aussi pour VBA.

    Sinon une remarque, il faut faire attention aux types, ils ne correspondent pas forcement.
    Exemple : integer en .net correspond à long en vb6, si mes souvenir sont bon. (je ne retrouve plus les corresondances pour tous les types, désolé).

  8. #8
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Sinon une remarque, il faut faire attention aux types, ils ne correspondent pas forcement.
    Exemple : integer en .net correspond à long en vb6, si mes souvenir sont bon. (je ne retrouve plus les corresondances pour tous les types, désolé).
    Tout à fait, c'est la même remarque que pour celle que j'ai faite au niveau des objets

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

Discussions similaires

  1. C# dll ou .net pour labview
    Par mick-67 dans le forum C#
    Réponses: 1
    Dernier message: 17/03/2011, 17h17
  2. DLL .NET pour vb6 : Tableau de chaine
    Par BacChusx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/10/2007, 11h32
  3. Réutilisation d'une DLL .NET pour du web ?
    Par RiiiDD dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 06/09/2007, 17h10
  4. Réponses: 1
    Dernier message: 18/07/2006, 16h44
  5. dll C++ pour VBA : erreur 49 et 453
    Par EL0807 dans le forum C++
    Réponses: 2
    Dernier message: 18/03/2006, 23h01

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