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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 57
    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 Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    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 confirmé
    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

  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 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    hello,
    un autre tuto sur les Array
    http://didier-gonard.developpez.com/...s-tableau-vba/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 57
    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 confirmé
    Inscrit en
    Mai 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 57
    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