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 :

Comment prendre en compte un tableau (Array) dans une fonction vba? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 57
    Points : 45
    Points
    45
    Par défaut Comment prendre en compte un tableau (Array) dans une fonction vba?
    Bonjour,
    J'ai un petit souci sur une fonction.

    J'ai un tableau qui n'a pas été déclaré mais a été créé par une fonction (appelons cette fonction Fonction_1 pour clarifier).

    Dans la Fonction_1, j'ai d'abord déclaré un tableau comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim LeTableau (0 To 1000, 0 To 1000) As Variant
    Puis à la fin de la fonction j'ai fait Donc dans une procédure j'ai créé un tableau, appelons le "Tableau_dans_Procédure", sans le déclarer, juste en faisant appel à la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau_dans_Procédure=Fonction_1(...arguments...)
    ça marche puisque par exemple, lorsque je fais (dans la procédure qui a appelé la fonction):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox(ubound(Tableau_dans_Procédure))
    --> J'obtiens bien "1000" en message

    Par contre j'ai besoin d'entrer ce tableau ("Tableau_dans_Procédure") en argument dans une deuxième fonction, appelons la "Fonction_2", et c'est là ou est le problème.

    Dans Fonction_2, j'ai déclaré le tableau-argument en dernier argument avec ParamArray:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function Fonction_2(...arguments..., ParamArray Tableau_Dans_Fonction_2() As Variant
    Or quand dans la procédure principale je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Blabla=Fonction_2(...arguments..., Tableau_Dans_Procédure)
    et bien dans la fonction_2 rien ne marche et il y avait plein d'erreurs qui m'ont fait pensé que le tableau en paramètre de fonction_2 était vide (alors que ça devait être le tableau créé par Fonction_1). Je l'ai vérifié en faisant à l'intérieur du code de la Fonction_2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(ubound(Tableau_dans_Fonction_2))
    et le message donne 0 (alors que c'était bien 1000 quand je faisais ce message dans la procédure).

    Je ne sais pas à quel niveau se produit l'erreur, mais visiblement il y a un problème avec un souci.

    Avez vous une idée?
    Merci d'avance

    (édit: désolée mais je n'arrive pas à sauter les lignes après les balises de code)

  2. #2
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,
    ton appel à ta première fonction doit te retourner ton tableau via un type variant.

    Donc ta fonction doit être du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public function F1(parm1, parm2, parm3, ...) as variant
    L'appel du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Res_f1 as variant
    res_f1 = f1(parm1, parm2, ...)
    Ensuite tu appelles ta fonction 2 en passant simplement le résultat de F1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res_f2 = f2(...., res_f1,...)
    Et dans F2, en déclarant le tableau comme suit cela devrait marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function F2(parm1, ...., Res_F1() as variant,....) as variant
    En tout cas, avec 1 tableau à une dimension, ça fonctionne impec.

    Exemple sous Access, mais identique au niveau VBA, avec une procédure :
    La procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub Export_Excelsheet(From_Table As String, to_file As String, Specific() As Variant)
    L'appel
    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
    Public Specific_Parm(20) As Variant
    Private Sub Export_Registrations_Click()
    Clear_Specific
    'Store Formation Nr in Specific parm 0
    'Store Contact Info in Specific parm 1
    Specific_Parm(0) = Me![Reporting_GAR_RefID]
    Specific_Parm(1) = Me![Reporting_Contact_Info]
    'Store GAR Model Folder in Specific parm 2
    'Store GAR Model Filename in Specific parm 3
    'Store GAR Model Sheetname in Specific parm 4
    Specific_Parm(2) = Me![Reporting_Model_Folder]
    Specific_Parm(3) = Me![Reporting_Model_Attest_File]
    Specific_Parm(4) = Me![Reporting_Model_Sheet_Name]
    'Store GAR Declarant in Specific parm 5
    Specific_Parm(5) = Me![Reporting_Declare_Name]
    'Store GAR Results Place in Specific parm 6
    Specific_Parm(6) = Me![Reporting_Result_Place]
     
    Call Export_Excelsheet(Me!Reporting_Category_Sql_Selection_Registration, Me!Reporting_Category_Name, Specific_Parm())
    End Sub
    j'espère que cela répond en partie à ta question.

  3. #3
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 642
    Points : 34 354
    Points
    34 354
    Par défaut
    hello,
    un autre tuto sur les Array
    http://didier-gonard.developpez.com/...s-tableau-vba/

  5. #5
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 57
    Points : 45
    Points
    45
    Par défaut
    Merci pour vos réponses.

    J'ai fait les déclarations exactement comme préconisé par Godzestla, mais malheureusement ça crée une erreur de débogage: "Erreur de compilation. Incompatiblité de type: Tableau ou type défini par l'utilisateur attendu".

    La ligne qui crée l'erreur est (en reprenant les notations de Godzestla):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res_f2 = f2(...., res_f1,...)
    sachant que j'ai bien mis dans la déclaration de f2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function F2(parm1, ...., Res_F1() as variant,....) as variant

    Je vais aussi regarder les tutoriaux merci.


    --------------édit:
    je ne comprends vraiment pas car j'ai rajouté une ligne juste avant celle qui crée l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(IsArray(Res_F1))
    et le message renvoyé est "Vrai", ce qui prouve que Res_F1 est bien un tableau, et pourtant le débogage semble dire que Res_1 n'est pas considéré comme un tableau et que c'est ce qui fait une erreur de type.
    J'ai aussi essayé de mettre des parenthèses "Res_F1()" au lieu de "Res_F1", mais ça me fait la même erreur.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 57
    Points : 45
    Points
    45
    Par défaut
    C'est bon, ça marche enfin.

    En fin de compte c'est cette ligne: qui créait l'incompatibilité de type, mais en écrivant à la place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Res_f1() as variant
    avec simplement les parenthèses en plus, le code marche enfin, merci pour l'aide.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/11/2011, 14h18
  2. Réponses: 6
    Dernier message: 24/11/2007, 18h48
  3. Réponses: 4
    Dernier message: 15/08/2007, 22h05
  4. récupérer un tableau PHP dans une fonction javascript
    Par aztec dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/05/2007, 22h11
  5. Réponses: 12
    Dernier message: 22/11/2005, 13h17

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