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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    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 éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    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 ?
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    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 éminent

    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 : 55
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    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 éminent

    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 : 55
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    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 éminent

    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 : 55
    Localisation : France, Val d'Oise (Île de France)

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

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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    Par défaut
    Le voici :


    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
    Public Sub workbook_open()
    Sheets(1).Activate
    old_tb(0) = Range("C7").Value
    old_tb(1) = Range("C8").Value
    old_tb(2) = Range("C9").Value
    MsgBox affiche_tableau(old_tb)
    end sub
     
     
     
    Public old_tb(3) As Variant	 		‘var declare dans module
     
     
    Function affiche_tableau(ParamArray Valeur() As Variant) As String
    Dim i As Integer
    Dim line
     
        line = ""
        For i = 0 To 2
            line = line & Valeur(i) & Chr(13)
        Next i
     
       affiche_tableau = line
     
    End Function

  9. #9
    Expert éminent

    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 : 55
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    hello !

    Déjà, cette ligne là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public old_tb(3) As Variant	 		‘var declare dans module
    se doit d'être TOUT en haut du module. AVANT LA PREMIER PROCEDURE (dans ton exemple, le WorkBook_Open)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    En fait la déclaration du tableau a été faite dans le module principal, tout en haut avant la fonction et la procédure.

    Quand j'exécute le programme, cela ne marche pas et c'est indiqué qu'il y a une anomalie (problème de compatibilité de type) au niveau de la ligne suivante :
    line = line & Valeur(i) & Chr(13)

    Je ne connais toujours pas la raison.
    Merci de m'aider.

  11. #11
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    enléve ParamArray dans ta déclaration c'est inutile ici....

    Vu comment tu utilise ton code tu gagnerai à supprimer tous ces variants et à te limiter à l'utilisation de tableaux de string...
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  12. #12
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Je pense comme Jackouya que ici paramarray n'est pas trop bien vu.

    Il me semble que :
    1. Ta fonction ressemble à un simple join
    2. Si tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function affiche_tableau(ByVal Valeur() As Variant) As String
    cela devrait marcher
    3. avec la déclaration de fonction que tu as faite, cela devrait fonctionner si tu l'appelles ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox affiche_tableau(old_tb(0), old_tb(1),old_tb(2))
    4. A quoi sert de déclarer un paramètre en ParamArray si la fonction attend 3 valeur? 5. Si tu passes ton tableau old_tb en paramètre, il peut être une variable de portée limitée.

    COrdialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Si j'ai bien compris ce que tu cherches, voilà un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Command1_Click()
      Dim letableau(2) As Integer
      letableau(0) = 1
      letableau(1) = 8
      letableau(2) = 3
      MsgBox affiche_tableau(letableau())
    End Sub
    Function affiche_tableau(letableau() As Integer) As String
        Dim i As Integer
        For i = 0 To UBound(letableau)
            affiche_tableau = affiche_tableau & letableau(i) & Chr(13)
        Next i
    End Function

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    Par défaut
    Merci à tous. Le code fonctionne.

+ 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