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 :

Retourner un tableau d'une fonction


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut Retourner un tableau d'une fonction
    Bonjour,

    Je voudrais créer une fonction qui initialise un tableau en 2 dimensions et qui retourne ce tableau.

    Du genre pour l'appel de la fonction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayChose = ArrayChoseInitD2(ArrayChose, iXEnd, iYEnd, iInitValue)
    ArrayChose est un tableau, iXEnd et iYEnd ses indexs, iInitValue la valeur à laquelle l'initialiser.

    Est-ce que l'on peut le faire ?
    Apparemment excel est pas trop d'accord, il retourne "Can't assign to array".

    Merci pour votre aide.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par thorg Voir le message

    ArrayChose est un tableau, iXEnd et iYEnd ses indexs, iInitValue la valeur à laquelle l'initialiser.
    salut

    peux-tu expliquer plus clairement cette partie, que je ne suis pas certain de comprendre parfaitement ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    ArrayChose est défini comme ceci :

    Dim ArrayChose(iXEnd, iYEnd) La fonction initialise toutes les valeurs du tableau à la valeur iInitValue.

    iXEnd, iYEnd ne sont donc pas ses indexs mais ses nombres d'éléments en précisant
    Option Base 1

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    bon
    au bout du compte, ce que tu appelles des "indexes" seraient les dimensions de ton tableau et tu voudrais donner une valeur identique à tous les éléments de ton tableau dynamique ?
    Je vois mal l'utilité, mais n'en discuterais pas (c'est ton affaire)

    Regarde donc ce que fait ceci (je m'y suis un peu amusé). Exemple a vec Option Base 0
    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
     
    Option Explicit
    Option Base 0
     
    Private Sub CommandButton1_Click()
      Dim i As Integer, j As Integer, tabresul
      Let tabresul = arraychoseinitD2(3, 2)
      For i = 0 To 3
        For j = 0 To 2
          MsgBox tabresul(i, j)
        Next
      Next
    End Sub
    Private Function arraychoseinitD2(iXend As Integer, iYend As Integer) As Variant()
      ReDim arraych(iXend, iYend)
      Dim i As Integer, j As Integer
      For i = 0 To iXend
        For j = 0 To iYend
         arraych(i, j) = "bonjour" & i & j
        Next
      Next
      Let arraychoseinitD2 = arraych
    End Function
    inspire toi de cet exemple de principe et adapte à tes besoins

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Merci babaothe, c'est un bon contournement qui parvient à un résultat fonctionel.
    C'est en effet fonctionnel sur mon environnement, j'avais raté que nous pouvons typer une fonction, le as variant dans ta définition de la fonction.

    Ce que je ne comprends pas vraiment, c'est que dans la fenêtre local je ne vois pas de différence entre une variable variant comme tu l'as définie et un tableau. Et cette variable tabresul a tout d'un tabelau.

    Mais excel ne veut strictement pas de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim ArrayStatDoc(3, 10), ArrayStatSi(3, 10)
    ArrayChose = ArrayChoseInitD2(ArrayChose, iXEnd, iYEnd, iInitValue)
    Ou bien pour reprendre ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Dim i As Integer, j As Integer, tabresul(3, 2)
    Dans les deux cas, il retourne "Can't assign to array".

    Dans d'autres fonctions, j'aurais tout de même besoin de passer un tableau par paramètre pour appliquer des procédures de modifications sur des tableaux différents.

    Dans ce fichier que l'on trouve sur le site, VB-excel2.pdf, en page 23 il est écrit "N'oubliez pas qu'une fonction peut modifier les paramètres passés ByRef et donc retourner des valeurs par ses arguments."
    C'est pas franchement limpide pour moi, surtout "retourner des valeurs par ses arguments".
    Si cela signifie que l'on peut modifier les variables passer en paramètres à la fonction sans les retourner explicitement; l'erreur de compilation m'aura compliquer la vie pour rien. Sauf qu'avec ton exemple j'ai mieux compris les fonctions, cette phrase resete tout du moins obscure.

    Pour finir,
    le besoin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim arraych(iXend, iYend)
    n'est pas clair pour moi ?
    tout est déclaré dans ton code, mais tu ne type pas la variable tabresul. Y-a-t-il une raison de pas mettre as Variant ?

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    re salut

    une variable non typée est typée en Variant

    pour le reste, les explications seraient trop longues à te fournir et je reste peu convaincu par l'utilité de passer par une telle fonction .

    EDIT :
    Maintenant : tu as voulu une fonction qui
    qui retourne ce tableau
    ne crois-tu pas qu'il sera plus facile (que ce que je t'ai montré) d'utiliser une simple routine ?
    Ainsi (exemple) :
    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
    Private Sub CommandButton2_Click()
      Dim tablo(3, 2) As Variant, i As Integer, ju As Integer
      routineinittablo tablo(), UBound(tablo, 1), UBound(tablo, 2)
      For i = LBound(tablo, 1) To UBound(tablo, 1)
        For j = LBound(tablo, 2) To UBound(tablo, 2)
          MsgBox tablo(i, j)
        Next
      Next
    End Sub
     
    Private Sub routineinittablo(tablo(), ixend As Integer, iyend As Integer)
     Dim i As Integer, ju As Integer
      For i = 0 To ixend
        For j = 0 To iyend
         tablo(i, j) = "bonjour" & i & j
        Next
      Next
      End Sub
    (et encore ! ne serait intéressante que si ta routine devait être appliquée, à la demande, à plusieurs tableaux différents ! Dans le cas d'une seule utilisation, il vaudra bien mieux écrire directement dans ton tableau).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Salut Babaothe,

    Désolé pour cette réponse tardive, j'étais absent.

    - "une variable non typée est typée en Variant"
    Oui je sais, j'essaie de programmer proprement d'où ma question sur pourquoi tu n'aurais pas déclaré celle-ci alors que ton code est tout explicite, tu utilises des Let ...

    - Pour ce qui est trop long à expliquer si tu as une référence de préférence sur internet en français ou en anglais je suis preneur ! Ou par défaut une référence livresque.

    - Si je comprends bien ton exemple est plus simple car il montre l'utilisation d'une sub et non d'une fonction puisque l'on peut modifier un paramètre passé. C'est fonctionnel et c'est finalement la solution que j'ai employée. Merci.

    - Pour ce que je cherchais à faire et les raisons.
    D'une table excel sont générés deux tables avec des utilisations différentes. La feuille de statistique du fichier original est recopié mais doit être mise à jour dans chacun des deux fichiers générés.
    Il y a en premier une fonction d'initialisation appelée une fois pour chaque fichier (elle n'est je pense aussi pas très utile, c'est celle dont il est question ici).
    Il y a ensuite une fonction qui charge un tableau initialisé avec les statistiques du fichier et recalcul les bonnes statistiques. Elle est appelée à maintes reprises, une pour chaque statistique.
    Pour être plus précis, dans une boucle les 2 fichiers sont générés ligne par ligne en même temps que les statisques sont mis à jours dans un tableau. A la fin lchaque tableau met à jour le fichier spécifique.

    Et la ligne de code de mon message initial indique exactement mes difficultés. Assigné à un tableau les résultats d'une fonction qui prend ce tableau comme entrée et le modifie. C'est ce dont j'ai besoin dans la structure du code pour la suite et il me semble intéressant coté apprentissage de VBA d'y arriver. Je ne souhaite pas de code à plat dans la sub principale mais apprendre à faire une telle fonction sans variable globale.

    - Je n'ai pas réussi à faire fonctionner le code avec la fonction
    J'ai essayé plusieurs choses mais rien n'y fait, quelque chose m'échappe.
    Mais avec les sub cela marche, c'est le principal mais c'est tout de même frustrant.

Discussions similaires

  1. [MySQL] Retourner un tableau par une fonction
    Par te-san dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/11/2009, 16h26
  2. [Tableau] Créer une fonction qui retourne un tableau
    Par Imageek dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/01/2009, 16h54
  3. Retourner un tableau dans une fonction
    Par oranoutan dans le forum Débuter
    Réponses: 14
    Dernier message: 05/10/2007, 13h39
  4. retourner un tableau d'une fonction
    Par nixonne dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/06/2006, 11h02
  5. Retourner un tableau depuis une fonction
    Par obalais dans le forum C++
    Réponses: 2
    Dernier message: 20/10/2005, 16h49

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