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

Macros et VBA Excel Discussion :

Macro complémentaire & macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut Macro complémentaire & macro
    Bonjour,

    Dans le cadre de mon stage on m'a demandé de faire des Web Services avec un client Excel. Mais je n'y connait rien en vba.
    Voici mon problème :
    J'ai créé une bibliothèque de classe en C# faisant appelle à mon web service et je l'ai défini en tant que macro complémentaire pour Excel jusque la aucun problème
    J'ai ensuite créer une macro appelant les fonctions de cette macro tout va bien je peux recupérer un champ texte (par exemple) ou un tableau
    Cependant ce que j'aimerais c'est recupérer un objet (composé par exemple de 3 champ string et d'un champ string[]) mais je n'y arrive pas

    Cela est il possible ?

    Ah oui j'utilise visual studio 2005, excel 2003 et il faudrait que se soit compatible excel 2007

    Merci d'avance pour vos réponses

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Je ne sais pas si c'est ce que tu veux, mais en VBA tu peu aussi traiter des "objets"
    la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim MonChamp ' tu n'assigne pas c'est d'office un variant
        Set MonChamp = "ce que tu veux du moins je suppose"
    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Euh je ne suis pas sur que cela marche car je ne peux pas accéder au différents champ

    Avec des exemples de code ça sera peut être plus simple a comprendre :

    Voici la déclaration des champs de ma classe infoP :
    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
    public partial class infoP {        
            private string nomField;        
            private string prenomField;
            private absenceType[] absenceField;
            public string nom {
                get {
                    return this.nomField;
                }
                set {
                    this.nomField = value;
                }
            }
            public string prenom {
                get {
                    return this.prenomField;
                }
                set {
                    this.prenomField = value;
                }
            }
            public absenceType[] absence {
                get {
                    return this.absenceField;
                }
                set {
                    this.absenceField = value;
                }
            }
    Après j'ai une méthode qui fait appel au web service et renvoye un objet InfoP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public infoP getInfoP(String d, String m)
    Ce que j'aimerais c'est avec ma macro Excel récupérer cet objet InfoP et pouvoir accéder à ces différent champs

    Est ce possible ?

    J'ai déjà essayer ta méthode mais je n'arrive pas à accéder aux champs, j'ai aussi essayer de recréer une classe vba portant le même nom avec les mêmes champs mais cela n'a pas marché

    Merci d'avance pour vos réponses

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai ensuite créer une macro appelant les fonctions de cette macro tout va bien je peux recupérer un champ texte (par exemple) ou un tableau
    Comme le dit LeForestier, en déclarant une variant, tu peux récupérer un tableau et ce tableau, tu peux l'instancier.
    En basic, j'écrirais ce que l'homme des bois t'a indiqué et lui affecterais ce qui ressemble plus à une fonction qu'à une subroutine puisque la macro renvoie "quelque chose"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i as byte, MonChamp as variant 'je le précise toujours pour le lecteur ^^
        Set MonChamp = (l'appel à ta fonction avec ses paramètres)
        'Et pour connaître l'intérieur de MonChamp :
        For i = 0 to Ubound(MonChamp)
              Msgbox MonChamp(i)
        Next
    Enfin je suppose... d'après les éléments que tu nous fournis... selon ce que l'on a compris... et en fonction de ce que l'on est susceptible de comprendre

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour Ousk,
    Tu veux instancier un objet dans VBA avec un code qui vien du C#, là je pense que tu a un problème.
    Je pense que tu devrais ouvrir ta table en VBA,( il y a plusieur tuto à ce sujet)
    et à partir de là tu pourrais avoir des objet ou collection de classe. !
    pour info : ont traite aussi les classes en VBA !
    A+
    Edit: ouuppss, en relisant ta question je pense que je suis à coté de la plaque.
    Et je ne pense pas qu'il y ai moyen de récupérer une classe C# en VBA.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Bonjour,

    Merci à toi ouskel'n'or, j'ai pu avancer un peu

    Donc je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Dim i As Byte
        Dim infP As Variant
     
        Set infP = Application.Run("getInfoP", Range("D26").Text,  Range("E26").Text)
        Range("H26").Value = infP.Nom
        Range("H27").Value = infP.Prenom
    Ce qui marche très bien, cependant je n'arrive pas à récupérer le champ "absence" qui renvoye un tableau de "absenceType"

    J'ai essayer plusieurs chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Dim t As Variant
       Set t = infP.absence
       MsgBox UBound(t,1)
    Mais cela ne marche pas, il me renvoie, au niveau du Set, une erreur : "erreur d'execution '13' : Incompatibilité de type"

    Le même problème se pose si une fonction me renvoie un tableau de type.

    Par exemple la déclaration de fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prestaType[] getListPresta(String date, String nom, String prenom);
    Et la fonction vba qui y fait appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim lpresta As Variant
     
        Set lpresta = Application.Run("getListPresta", Range("B8").Text, Range("B9").Text, Range("B10").Text)
        For i = 0 To UBound(lpresta, 1)
                Cells(8 + i, 7).Value = lpresta(i).Matricule
                Cells(8 + i, 8).Value = lpresta(i).Nom
                Cells(8 + i, 9).Value = lpresta(i).Prenom
        Next i
    J'ai la même erreur au niveau du Set

    Est ce que quelqu'un aurait une idée ?

    Sinon je pense passer les tableaux d'objets en tableaux de String[,] mais j'aurais aimer éviter de devoir passer par cette étape

    Merci d'avance pour vos réponses

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Hop je reviens j'ai du nouveau alors si j'ajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Dim t
        t = infPresta.absence
        MsgBox UBound(t)
    J'obtiens la bonne taille de tableau mais après je n'arrive pas à manipuler correctement l'objet.
    A savoir que chaque objet de ce tableau est constitué de 2 champs (libelle et nbjour)

    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Range("H34").Value = t(0).Libelle
    J'obtiens : Erreur d'exécution '424' : Objet requis

    Après j'ai essayé

    J'obtiens : Erreur d'exécution '13' : Incompatibilité de type

    Voila si quelqu'un à une petite idée, merci d'avance

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Re,
    Je pense que les données contenue dans un objet doivent aussi êtres considérés comme des objets
    peut-être avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim t as 
    dim TS 
        t = infPresta.absence
        set TS = t(0)
        Range("H34") = TS
    Ont sait jamais,
    A+

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Re,

    Hopla tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Dim t
        Dim TS
        t = infPresta.absence
        Set TS = t(0)
        Range("H34") = TS
    Retour :
    Erreur d'exécution '1004' : Erreur définie par l'application ou l'objet
    J'ai supposé que le "as" apres le "Dim t" était en trop puisque ca retournait une erreur avec


    edit : J'ai bien sûr essayer des variantes du style considerer que TS etait un tableau, essayer d'obtenir le champ libelle de TS

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si ton tableau a deux dimensions, Ubound(LeTableau) est ok malgré tout et donne la bonne taille.
    Sous VBA, et dans le cas d'une plage de cellules convertie en tableau première dimension correspond à une colonne, la seconde à une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 0 to ubound(Tablo)
         Msgbox Tablo(i, 0)
         ou
         Msgbox Tablo(i, 1)
    Next
    Il te reste à tester
    Si tu as plusieurs lignes, s'il y a un moyen de connaitre la dernière ça ne me revient pas à l'instant... LeForestier ? Krovax ? Help !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Cela ne marche pas car dans chaque cellule du tableau t il y a un objet et non un autre tableau

    Erreur retourner :
    Erreur d'exécution '9' : L'indice n'appartient pas à la sélection

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Par contre, un tableau à deux dimensions est assimilable à un range (qui lui est un objet) et tu peux écrire tout ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
    Dim Tablo As Variant
        Tablo = Range("A1:D10").Value
        MsgBox UBound(Tablo)
        For lig = 1 To 10
            For col = 1 To 4
                MsgBox Tablo(lig, col)
            Next
        Next
        Worksheets("feuil2").Range("A1:D10") = Tablo
    End Sub

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Citation Envoyé par sangie Voir le message
    Re,

    Hopla tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Dim t
        Dim TS
        t = infPresta.absence
        Set TS = t(0)
        Range("H34") = TS
    Retour : Erreur d'exécution '1004' : Erreur définie par l'application ou l'objet

    J'ai supposé que le "as" apres le "Dim t" était en trop puisque ca retournait une erreur avec


    edit : J'ai bien sûr essayer des variantes du style considerer que TS etait un tableau, essayer d'obtenir le champ libelle de TS
    Je crois que tu avance, l'erreur n'est plus la même...
    essaye avec..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Dim t
        Dim TS
        set t = infPresta.absence 'si c'est un objet il faut l'instancier avec Set
        Set TS = t(0)
        Sheets("LeNomDeLaFeuille").Range("H34") = TS
    Après ont pourras toujours voir pour indexé.

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai une autre théorie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t2()
    Dim Tablo As Object
        Set Tablo = Worksheets
        For i = 1 To 3
            MsgBox Tablo(i).Name
        Next
    End Sub
    Je ne sais pas à quoi ça peut servir mais je n'ai pas de message d'erreur
    Désolé, sangie mais je n'ai pas pu m'en empêcher
    La nuit porte conseil alors bonne nuit

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Bonjour bonjour,

    Alors j'ai essayer plusieurs chose avec ce que vous m'avez indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim t
        Dim TS
        Set t = infPresta.absence
        Set TS = t(0)
        Sheets("Feuil1").Range("H34") = TS
    La il me dit : Erreur d'exécution '13' : Incompatibilité de type au niveau du "set t = infPresta.absence"

    Ce qui m'a emmené à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim t
        Dim TS
        t = infPresta.absence
        Set TS = t(0)
        Sheets("Feuil1").Range("H34") = TS
    Cette fois j'obtiens : Erreur d'exécution '1004' : Erreur définie par l'application ou l'objet au niveau de " Sheets("Feuil1").Range("H34") = TS"

    Essai suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim t
        Dim TS
        t = infPresta.absence
        Set TS = t(0)
        Sheets("Feuil1").Range("H34") = TS(0)
    J'obtiens : Erreur d'exécution '13' : Incompatibilité de type au niveau de " Sheets("Feuil1").Range("H34") = TS(0)"

    Bon ben cette fois je tente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       Dim t
        Dim TS
        t = infPresta.absence
        Set TS = t(0)
        Sheets("Feuil1").Range("H34") = TS.Libelle
    J'ai obtenu : Erreur d'exécution '424' : Objet requis au niveau de " Sheets("Feuil1").Range("H34") = TS.Libelle"

    J'ai aussi essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim t As Object
        Dim TS
        Set t = infPresta.absence
        Set TS = t(0)
        Sheets("Feuil1").Range("H34") = TS
    Ce qui m'a donné : Erreur d'exécution '424' : Objet requis au niveau de "Set t = infPresta.absence"
    De plus si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim t
        Dim TS As Object
        t = infPresta.absence
        Set TS = t(0)
        Sheets("Feuil1").Range("H34") = TS
    J'obtiens : Erreur d'exécution '424' : Objet requis au niveau de "Set TS = t(0)"

    Ce qui me me fait penser qu'il ne considère pas mon tableaux d'objet comme tel.

    Voila j'ai testé tout ce qui m'est passé par la tête en espérant que cela vous inspirera

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Re,
    Sheets("Feuil1").. c'est bien le nom de ta feuille ?
    test..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil1").Range("H34") = "Essai"
    Vaux mieux éliminé les problèmes un à un

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Bon j'ai essayé un truc pour voir ce que j'avais dans mes variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MsgBox VarType(t)
    MsgBox VarType(TS)
    Alors pour "t" il me dit que c'est un tableau de DataObject
    Et pour "TS" il me dit que c'est un DataObject

    J'ai cherché dans la doc d'excel ce que je pouvais faire avec ces DataObject et y a rien d'intéressant, je vais aller chercher un peu sur le net mais si vous avez une idée n'hésitez pas

    edit : Oui "Feuil1" est bien le nom de la feuille et ca marque bien "Essai" dans la case quand je teste ^^
    Mais le problème viens des DataObjects je pense puisque je cherche a manipuler des Object et non des DataObjects

  18. #18
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Wouaa, j'ai été sur ce lien de MSDN et ça me parai drôle de travailler avec le presse papier !!
    A+

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as vu ça dans l'aide Excel ?
    Citation Envoyé par l'aide en ligne
    DataObject, objet
    Zone de réserve pour les données texte formatées, utilisée dans les opérations de transfert. Cet objet contient aussi une liste des formats correspondants aux éléments texte enregistrés dans le DataObject.

    Remarques

    Un objet DataObject peut contenir un seul élément texte au format texte du Presse-papiers et un seul élément texte pour chaque format texte supplémentaire, comme par exemple les formats personnalisés et ceux définis par l'utilisateur.

    Un objet DataObject se distingue du Presse-papiers. Un objet DataObject supporte des commandes mettant en jeu le Presse-papiers et les actions glisser-déplacer dans un texte. Quand vous commencez une opération impliquant le Presse-papiers (GetText par exemple) ou une opération glisser-déplacer, les données participant à cette opération sont déplacées dans un DataObject.

    Le DataObject fonctionne comme le Presse-papiers. Si vous copiez une chaîne de texte dans un DataObject, celui-ci enregistre la chaîne. Si vous copiez une deuxième chaîne de format identique dans le DataObject, celui-ci efface la première chaîne et enregistre une copie de la seconde. Il enregistre un seul élément texte dans un format spécifié et conserve le texte provenant de l'opération la plus récente.
    A toutes fins utiles

    (on ne parle pas du tableau de DataObjects mais je suppose que ça doit fonctionner comme les listes dans le presse-papier de word)

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Bon après investigation, il a beau me dire que c'est un DataObject s'en est pas un car si j'essaye de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim TS As DataObject
    set TS = t(0)
    Ben ca marche pas il me dit que les types son incompatibles ^^

    Nouveau test, venant de découvrir la fonction TypeName :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox TypeName(t(0))
    Me renvoye : "absenceType" ce qui est le bon nom de classe !!
    Cependant faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox TypeName(t(0).libelle)
    NE marche pas il continue a me demander un objet :s

Discussions similaires

  1. [PPT-2010] Passage d'un macro "Normal" à une macro complémentaire
    Par sebast733 dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 11/10/2012, 15h49
  2. [XL-2007] Modifier une macro complémentaire par macro
    Par jpclabaux dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/07/2012, 11h30
  3. Manipulation des macros complémentaires par macro
    Par EvaristeGaloisBis dans le forum Général VBA
    Réponses: 2
    Dernier message: 25/08/2007, 18h40
  4. [VBA-E]-Appeler une macro complémentaire ?
    Par Régolo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/04/2007, 23h34
  5. [VBA-E] Utilisation macros complémentaire xla
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/04/2007, 16h15

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