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 :

passage d'un tableau en argument dans une procédure


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut passage d'un tableau en argument dans une procédure
    Bonjour,

    J'ai créé un tableau (de type variant) en variable globale dans un module.

    A l'ouverture du classeur, je définie les valeurs de ce tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public workbook_activate()
               tb_valeur(0)=1          tb_valeur(1)=10      ...
               affiche_tab(tb_valeur(nb))
        end sub

    Je souhaite afficher les valeurs de ce tableau dans le module via la fonction msgbox.

    Je ne sais pas la syntaxe pour passer le tableau en argument dans la procédure du module principal.

    public sub affiche_tab(tab_ref() as variant) ?

    Merci de m'aider.

  2. #2
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Bonjour,

    Tu ne nous as pas montré la ligne de déclaration de ton tableau !

    pourquoi veux-tu le passer en paramétre s'il est public, il est déjà accessible par toutes tes procédures ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut
    Bonjour,

    Il y a une procédure dans le module qui doit faire la différence de valeurs avant et après mise à jour.

    Avant mise à jour : ouverture du classeur ; les valeurs initiales d'une colonne de la feuille EXCEL sont stockées dans tb_old (10)

    Après mise à jour : clic sur le bouton ; les nouvelles valeurs sont stockées dans tb_new(10)

    Puis il y a une procédure qui fera tb_new(i) - tb_old(i)

    Penses-tu qu'il y a une autre méthode ?

    Merci pour ton aide.

  4. #4
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Voici comment re-créer une fonction telle la fonction SOMME d'Excel
    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
    Function mySomme(ParamArray Valeur() As Variant) As Long
        Dim vTemp   As Double
        Dim vVar    As Variant
        Dim lVar    As Long
        Dim rVar    As Range
        For Each vVar In Valeur
            If TypeName(vVar) = "Range" Then
                For Each rVar In vVar.Cells
                    If IsNumeric(rVar) Then
                        vTemp = vTemp + rVar.Value
                    End If
                Next
            Else
                For lVar = LBound(vVar) To UBound(vVar)
                    If IsNumeric(vVar(lVar)) Then
                        vTemp = vTemp + vVar(lVar)
                    End If
                Next
            End If
        Next
        mySomme = vTemp
    End Function
    Tu remarqueras que, dans la signature de la fonction, il est question du mot clé ParamArray
    Maintenant, comment appeler cette fonction ?
    Directement dans la feuille de calcul, en faisant plusieurs plages... c'est la première possibilité
    Mais, dans le code ?
    Tu pourrais, par exemple, faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Test()
        Dim t(3)
        t(0) = 1
        t(1) = 2
        t(2) = 3
        t(3) = 4
        MsgBox mySomme(t)
    End Sub
    ou encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test2()
        MsgBox mySomme(Array(1, 2, 3, 4, 5))
    End Sub
    Est-ce que cela répond à ta question ?

  5. #5
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    oups !
    On est passé du passage d'argument à la méthode pour maintenir des données dans le temps !!!

    Alors, une solution est effectivement ta variable publique.
    Tu pourrais d'ailleurs t'occuper d'une seule variable publique !, mais à Deux dimensions.

    Par exemple, tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public p_Data(1,10) as LeTypeQuiVaBien
    Ainsi, pour tes données "AVANT" tu pourrais remplir tout p_Data(0) , sur le WorkBook_Open
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    p_Data(0,0)=1
    p_Data(0,1)=22
    p_Data(0,2)=125
    p_Data(0,3)=215
    Et, au moment de la validation, ou en cours de saisie, remplir p_Data(1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    p_Data(1,0)=1
    p_Data(1,1)=22
    p_Data(1,2)=125
    p_Data(1,3)=215
    Ensuite, il ne te resterait plus qu'à comparer p_Data(0) à p_Data(1) par une simple boucle

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Par défaut
    Merci d'avoir accepter de m'aider.

    Je ne comprends pas pourquoi il y a une boîte de dialogue affichant un problème de compatibilité de données pour le passage d'un tableau en paramètre d'une fonction ici afficher via msgbox.

    Aurais-tu une idée ?

  7. #7
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Tu peux montrer ton code ?

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

Discussions similaires

  1. Passage d'un tableau en argument d'une fonction d'une dll
    Par _LBS_ dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 16/02/2010, 18h26
  2. passer un tableau en argument dans une fonction
    Par rogerio dans le forum Débuter
    Réponses: 6
    Dernier message: 30/10/2008, 12h15
  3. Réponses: 6
    Dernier message: 08/10/2007, 13h50
  4. Réponses: 6
    Dernier message: 24/07/2006, 15h22
  5. [JpGraph] Passage d'un tableau en paramètre dans une URL pour JPgraph
    Par crazydiver_e2 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 16/01/2006, 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