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 :

Fonction utilisant une plage de données et restituant une autre plage de données


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur R&d
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&d

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Par défaut Fonction utilisant une plage de données et restituant une autre plage de données
    Bonjour à tous,

    Je souhaite réaliser une fonction qui utilisera en argument une plage de cellule et qui donnera en résultat une autre plage de cellules.
    Après des recherches j'ai trouvé un exemple pour la deuxième partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function A_B(A As Double, B As Double) As Variant
     
    Dim TabTemp As Variant
          ReDim TabTemp(1 To 2, 1 To 1)
          TabTemp(1, 1) = A - B
          TabTemp(2, 1) = B - A
          A_B = TabTemp
    End Function
    En ayant sélectionné le nombre de cellules qui va bien en faisant ctrl + shit + enter, on obtient bien 2 résultats issus de la fonction.

    J'ai trouvé un exemple de fonction prenant une plage de cellule comme argument et donne comme résultat un double :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function myAdd(ParamArray Args2() As Variant) As Double
        Dim elem As Variant
        Dim i As Long
        For Each elem In Arg1
            myAdd = myAdd + elem.Value
        Next elem
        For i = LBound(Args2) To UBound(Args2)
            For Each elem In Args2(i)
                myAdd = myAdd + elem.Value
            Next elem
        Next i
    End Function
    Mais les choses se sont compliquées lorsque j'ai voulu associer les deux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function myAdd2(Args2() As Variant) As Variant
     
    Dim i As Long
     
    Dim TabTemp As Variant
     
    ReDim TabTemp(1 To 2, 1 To 1)
        For i = LBound(Args2) To UBound(Args2)
            TabTemp(i) = Args2(i) + 1
        Next i
     
    myAdd2 = TabTemp
     
    End Function
    Et là j'ai sur les 2 cases sélectionnées (n'ayant pris que 2 cellules en argument) #VALEUR

    J'ai eu beau bidouiller, rien n'y fait. J'ai même essayé de faire apparaître la valeur de UBound(Args2) en déclarant myAdd2 en Long, rien de marche.

    Quelqu'un peut-il m'expliquer les erreurs que je fais.

    Cordialement

  2. #2
    Membre du Club
    Femme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Rédacteur technique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Par défaut
    Bonjour Stef et bienvenue sur le forum.

    Je crois que tu confonds plage de cellule ("Range") et tableau de données ("Array").

    Une Array est un ensemble de variables simples (chaînes de caractères, nombres, booléens...) organisé sous forme de tableau/matrice.
    Un objet Range est une cellule, ou un ensemble de cellules contigües. Il a de nombreuses méthodes: Tu peux par exemple le supprimer de ta feuille, en fusionner les cellules, changer les couleurs de fonds ou les bordures, ou encore changer les valeurs contenues dans les cellules (entre autres - nombreuses - choses).

    Je crois que ta confusion viens du fait que la propriété par défaut de l'objet Range est la méthode "value", qui renvoie justement une array contenant les valeurs des cellules de ton Range.

    Exemples:
    Si tu écris: Range("A1") = "Coucou!", Excel interprète ça comme: Range("A1").Value = "Coucou!" et va t'écrire "Coucou!" dans la cellule A1.
    De même, si tu essaie d'associer un pointeur (donner un nom) à ton range mais que tu oublies l'instruction "Set" (obligatoire quand on manipule des objets et non des variables simples), Excel va te renvoyer les valeurs des cellules de ton Range... sous forme d'Array:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TrucMuche
     
    Dim Plage As Variant
     
    Set Plage = Range("A1:C6")     'Là, ton pointeur "Plage" renvoie un objet Range, que tu peux sélectionner, supprimer, dont tu peux fusionner les cellules...
     
    'Les deux lignes suivantes sont interprétées de la même façon par Excel:
    Plage = Range("A1:C6")
    Plage = Range("A1:C6").Value
    'Dans les deux cas, "Plage" renvoie à l'ensemble les valeurs contenue dans chacune des cellules du de la plage "A1:C6", sous forme d'array.
     
    End Sub
    Pour en revenir à ton cas spécifique, je n'ai pas compris ce que tu essaie de faire: Tu veux ajouter 1 à chaque valeur d'une plage de cellules?
    Tu veux "extraire" l'ensemble des valeurs contenues dans ta plage, y ajouter 1, et garder cet array en mémoire pour le réutiliser plus tard dans ta macro?

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur R&d
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&d

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Par défaut Fonction utilisant une plage de donnnées et restituant une autre plage de données
    Bonjour Kero87,

    Je te remercie pour le temps consacré à mon problème.
    Si j'utilise un argument Range, comme je fais pour assigner la plage correspondante à un tableau (soit Array, soit Variant) ?

    Pour ton info, le calcul que j'ai mis est purement pour test, la fonction finale doit me permettre de réaliser un calcul itératif, mais en lui-même le calcul n'a pas d'importance. Ce qui est vraiment problématique pour moi c'est la gestion des "interfaces" : la plage de cellules qui doit rentrer comme un argument de la fonction et le format du résultat afin d'apparaître sur la feuille de calcul.

    Si tu peux m'éclairer, merci par avance.

    Stéf

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2011, 13h00
  2. Réponses: 13
    Dernier message: 28/05/2010, 10h06
  3. [XL-2007] Fonction utilisant une autre feuille
    Par GymTonic dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/07/2009, 09h48
  4. affihage automatique d'une donnée en fonction d'une autre
    Par leclone dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2008, 14h20
  5. une Dll peut elle utiliser les fonctions d'une autre dll?
    Par kantelise dans le forum Windows
    Réponses: 7
    Dernier message: 18/05/2006, 03h45

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