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 :

Fonctions VBA renvoyant des tableaux dans Excel


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Fonctions VBA renvoyant des tableaux dans Excel
    Bonjour

    J'ai essayé de chercher sur le forum la réponse à la question suivante, sans succès : j'aimerais créer des fonctions VBA qui renvoient des tableaux dans les feuilles excel et remplissent des plages de cellules.

    Un exemple : si j'ai une matrice 2*2 dans la plage A1:B2, j'aimerais créer une fonction par exemple MonInverse en VBA, et j'écris quelque chose comme '{=MonInverse(A1:B2)}' dans la plage A4:B5 et magie, l'inverse de la matrice s'affiche. Peut-être même mieux : j'écris dans la case A4 '=MonInverse(A1:B2)' et la plage A4:B5 reçoit l'inverse de la matrice.

    L'idée serait ensuite de faire des traitements plus personnalisés sur des tableaux, mais l'esprit restera le même...
    J'arrive déjà à effectuer ce genre d'opération via des sub's VBA, mais je trouve que c'est beaucoup moins souple que des formules à écrire directement dans Excel.

    Est ce que quelqu'un à une idée sur la question ? Est-ce possible ?

    Merci pour vos réponses.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    tu peux tester cette fonction, à placer dans la cellule F8

    =INVERSEPLAGE($B$2:$F$4;$F$8;F8)

    $B$2:$F$4 correspond à la plage cible à inverser

    $F$8 : tu y indiques la référence de la 1ere cellule qui correspond a l'angle supérieur gauche de la nouvelle plage de cellules, pour la transposition

    F8 est la cellule contenant cette fonction

    (attention à bien respecter les references absolues $ et relatives)


    Ensuite tu étires la fonction sur la droite, puis vers le bas




    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
    36
    '"Plage" est la plage de cellules à transposer
    '"Base" est la 1ere cellule dans l'angle supérieur gauche pour
    'la transposition de la plage
    '"Act" contient la reference de la cellule contenant cette fonction
    Public Function InversePlage(Plage As Range, Base As Range, Act As Range)
        Dim xB As Double, xA As Double
        Dim yB As Byte, yA As Byte
        Dim i As Integer, j As Integer
     
        xB = Base.Row
        yB = Base.Column
     
        xA = Act.Row
        yA = Act.Column
     
        If Intersect(Range(Cells(xB, yB), Cells(xB + Plage.Rows.Count, _
                    yB + Plage.Columns.Count)), Act) Is Nothing Then
     
            InversePlage = ""
            Exit Function
        End If
     
        i = Plage.Rows.Count - (xA - xB)
        If i = 0 Then
            InversePlage = ""
            Exit Function
        End If
     
        j = Plage.Columns.Count - (yA - yB)
        If j = 0 Then
            InversePlage = ""
            Exit Function
        End If
        InversePlage = Plage.Cells(i, j).Value
     
    End Function


    bonne soiree
    michel

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    C'est une bonne idée de faire ça, et clairement ça va marcher.

    Par contre, imaginons qu'on fasse des calculs sur une matrice un peu plus compliqués (genre diagonalisation, ou autre) il me semble que les calculs vont être faits autant de fois qu'il y a d'éléments non ? ça risque d'être lent...

    J'ai eu un collègue à une époque qui arrivait à pondre des fonctions pouvant s'appeler comme les fonctions Excel (avec les ctrl+shift+entrée & co), mais c'était à base de dll's écrites en C. Est-ce le seul moyen de faire, ou il y a une astuce VBA qui permet de faire une telle chose ?

    En tout cas merci beaucoup pour cette réponse, ça va m'être bien utile !

    Bonne soirée

    Philippe

Discussions similaires

  1. [XL-2007] Envoyer un mail avec outlook à partir d'excel avec des tableaux dans le corps du mail
    Par BarneyYagami dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/11/2014, 16h48
  2. Réponses: 2
    Dernier message: 25/02/2014, 14h08
  3. Fonction VBA: Recuperer des donnees stockees sous Access dans Excel
    Par dave_gt dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/07/2011, 23h22
  4. Fonction (ou macro) pour incorporer des images dans Excel
    Par metis dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2007, 13h34
  5. [VBA-E] Générer des combinaisons dans Excel
    Par JSOREL dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 07/03/2007, 17h23

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