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 :

Récupérer une var de type table d'une Fonction [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é
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Par défaut Récupérer une var de type table d'une Fonction
    Bonjour,

    Il y a quelque chose que je n'ai pas compris dans le passage de variable dans une fonction, je pensais pouvoir faire cela et ça ne marche pas!
    Pour être précis, passer des arguments et récupérer une valeur, c'est OK, mais récupérer une table, là je sèche!!!

    Ici un exemple simplifié, et si on peut m'aider à comprendre là où je fait faux...

    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
    sub principale
    Dim nom1 as String, nom2 as String, nom3 as String
    Dim table1(2) as String
     
    'divers traitement... et ensuite
    	table1 () = maFonction (nom1, nom2, nom3)
     
    'et ensuite utiliser valeurs contenue dans la table 
    	si table1(0) = etc... then
    	si table1(1) = etc... then
    etc...
    end sub
     
    sub maFonction (arg1 as String, arg2 as string, arg3 as string) as String
    Dim argTableA(2) as String
     
    'divers traitement... et ensuite
     
    	argTableA(0) = arg1
    	argTableA(1) = arg2
    	argTableA(2) = arg3
     
    	maFonction = argTableA()
     
    end function
    Merci à vous ;-)

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    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
    29
    30
    Sub principale()
    Dim nom1 As String, nom2 As String, nom3 As String
    Dim table1 As Variant 'le type est Variant
    Dim i&
    '---
    'divers traitement... et ensuite
    nom1 = "toto"
    nom2 = "kiki"
    nom3 = "zaza"
     
    table1 = maFonction(nom1, nom2, nom3)
     
    'et ensuite utiliser valeurs contenue dans la table
    For i& = LBound(table1) To UBound(table1)
      MsgBox table1(i&)
    Next i&
    End Sub
     
    Function maFonction(arg1 As String, arg2 As String, arg3 As String) As Variant 'le type du retour est Variant
    Dim argTableA(2) As String
    '---
    'divers traitement... et ensuite
     
     argTableA(0) = arg1
     argTableA(1) = arg2
     argTableA(2) = arg3
     
     maFonction = argTableA
     
    End Function

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Par défaut
    OK PMO2017, je commence à voir!
    En fait, tu utilises un type Variant et tu ne spécifies pas la taille et donc pas de parenthèse.
    Ensuite, reste plus qu'à piocher dans la table (en restant dans les limites), c'est génial

    Merci à toi !!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    petite variante du poste de PMO2017!

    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
    29
    30
    31
    32
    33
    34
    35
     
    Sub principale()
    Dim table1 As Variant 'le type est Variant, i&
    '---
    'divers traitement... et ensuite
    table1 = maFonction("toto", "kiki", "zaza")
     'et ensuite utiliser valeurs contenue dans la table
    For i& = LBound(table1) To UBound(table1)
      MsgBox table1(i&)
    Next i&
    table1 = maFonction("Moi")
    For i& = LBound(table1) To UBound(table1)
      MsgBox table1(i&)
    Next i&
    table1 = maFonction("Moi", "Toi")
    For i& = LBound(table1) To UBound(table1)
      MsgBox table1(i&)
    Next i&
    table1 = maFonction("Moi", "Toi", "lui", "nous", "eux", "autre", "Bof", "Truc", "Machin")
    For i& = LBound(table1) To UBound(table1)
      MsgBox table1(i&)
    Next i&
    End Sub
     
    Function maFonction(ParamArray Plage()) As Variant 'le type du retour est Variant
    Dim argTableA() As String, i As Long
    '---
    'divers traitement... et ensuite
    For i = 0 To UBound(Plage)
        ReDim Preserve argTableA(i)
        argTableA(i) = Plage(i)
    Next
      maFonction = argTableA
     
    End Function

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Par défaut
    Intéressant aussi, merci dysorthographie!
    Par contre si je connais les Arrays, je ne connais pas : ParamArray, tu peux me dire quelques mots dessus stp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function maFonction(ParamArray Plage()) As Variant

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour
    perso je comprends pas tres bien le besoins de passer par une fonction détachée puisque qu'au finale table1 est un simple tableau a 1 dim

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    table1 = array(nom1, nom2, nom3)
    for i= 0 to ubound(table1)
    msgbox table1(i)
    next
    si on veut faire de table1 un tableau a 2 dim(ligne/colonne) en l'occurrence 3 lignes et 1 colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    table1 = application.transpose(array(nom1, nom2, nom3))
    for i= 0 to ubound(table1)
    msgbox table1(i,1)
    next
    non je ne vois pas
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Les tenants et aboutissants n'étant pas vraiment détaillés, je vais me contenter de parler de la manière finalement la plus simple (et confortable) de traiter un array ou une matrice dans une procédure distincte de celle d'appel.
    En lieu et place d'une fonction, utiliser une sous-routine (une procédure "sub") en lui passant par référence (ByRef) l'array ou la matrice à traiter.

  8. #8
    Invité
    Invité(e)
    Par défaut
    ParamArray Tableau()

    ParamArray permet de passer en paramétré un tableau don on ne connais pas la dimension!

    on le dimensionne en lui donnant autant de variable qu'il y a d'items dans le tableau()

    ce qui revient à faire ce que PMO2017 proposait! mais là on dimensionne le tableau dynamiquement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table1 = maFonction("toto", "kiki", "zaza")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau=maFonction(var1,var2,etc...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table1 = maFonction("Moi")
    table1 = maFonction("Moi", "Toi", "lui", "nous", "eux", "autre", "Bof", "Truc", "Machin",Var10,Etc...)
    c'est plus complique si on passe une plage de cellule mais çamarche!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table1 = maFonction(range("A1:B2"), range("D1:E2"))
    http://www.developpez.net/forums/d15...s/#post8560044

    En lieu et place d'une fonction, utiliser une sous-routine (une procédure "sub") en lui passant par référence (ByRef) l'array ou la matrice à traiter.
    ceci implique de connaitre la taille de la matrice, d'ou mon exemple, si non Patrick a fortement raison!
    Dernière modification par Invité ; 25/10/2016 à 11h19.

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

Discussions similaires

  1. Gérer et créer une variable de type TABLE dans une fenetre
    Par bigbossjohn95 dans le forum MATLAB
    Réponses: 5
    Dernier message: 26/01/2016, 11h37
  2. Récupérer chaque ligne de type enregistrement dans une table
    Par atporfi dans le forum Administration
    Réponses: 2
    Dernier message: 02/04/2008, 19h12
  3. Réponses: 3
    Dernier message: 22/10/2006, 23h15
  4. Réponses: 3
    Dernier message: 01/02/2006, 23h17
  5. Affectation d'un champs blob dans une var de type TStrings
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/03/2005, 18h26

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