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

VBA Discussion :

Fonction retournant un tableau


Sujet :

VBA

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    Bonjour à tous ! Je voudrais créer la fonction personnalisée suivante


    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
    Function MROD1(k, x)
    Dim i As Integer
     
      For i = 1 To 9
        MROD1(i) = 0
      Next i
      c = Cos(x)
      s = Sin(x)
      Select Case k
        Case Is = 1
          MROD1(1) = 1
          MROD1(5) = c
          MROD1(6) = -s
          MROD1(8) = s
          MROD1(9) = c
        Case Is = 2
          MROD1(1) = c
          MROD1(3) = s
          MROD1(5) = 1
          MROD1(7) = -s
          MROD1(9) = c
        Case Is = 3
          MROD1(1) = c
          MROD1(2) = -s
          MROD1(4) = s
          MROD1(5) = c
          MROD1(9) = 1
      End Select
    End Function
    Ca plante sur : MROD1(i) (Argument non falcutatif)
    Avez vous une idée ?
    Je veux vraiment faire une fonction car je veux m'en servir sous excel.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Dans ton tableau tu déclares k et x, or tu n'en renseignes qu'un i donc k, il attend autre chose.

    Starec

  3. #3
    Membre régulier
    Inscrit en
    Février 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2007
    Messages : 71
    Points : 76
    Points
    76
    Par défaut
    il te faudrait essayer ça :

    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
    Function MROD2(k, x) As String()
     
    Dim i As Integer
    Dim MROD1(9) As String
     
    For i = 1 To 9
        MROD1(i) = 0
    Next i
    c = Cos(x)
    s = Sin(x)
    Select Case k
        Case Is = 1
            MROD1(1) = 1
            MROD1(5) = c
            MROD1(6) = -s
            MROD1(8) = s
            MROD1(9) = c
        Case Is = 2
            MROD1(1) = c
            MROD1(3) = s
            MROD1(5) = 1
            MROD1(7) = -s
            MROD1(9) = c
        Case Is = 3
            MROD1(1) = c
            MROD1(2) = -s
            MROD1(4) = s
            MROD1(5) = c
            MROD1(9) = 1
    End Select
     
    MROD2 = MROD1
     
    End Function

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    et pour toi elle doit renvoyer quoi ta fonction ..? si tu la met dans une cellule elle ne peu renvoyer qu'une seule valeur...! .. soit un peu plus clair sur tes intentions...

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    J'ai fusionné les deux discussions.
    As-tu testé la solution de Speedrman ?
    Evite de poser plusieurs fois la même question.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    Tout d'abord , excusez moi d'avoir poster 2 fois ; c'est une erreur...

    Pour la solution de Speedrman , j'ai esssayé mais j'ai une erreur "incompatibilité de type".

    En fait ma fonction doit me renvoyer une matrice (tableau de 9 valeurs) exactement comme le fait par exemple la fonction PRODUITMAT ; donc je selectionne mes 9 cellules , j'insere ma fonction , je fait CTRL + SHIFT + OK
    et ça devrait me remplir mes 9 cellules.

    Merci pour vos reponses , je continue a chercher ......

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour l'incompatibilité, c'est normal. Tu déclares ta fonction as string et tu entres des valeurs
    c = Cos(x)
    s = Sin(x)
    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            MROD1(1) = "1"
            MROD1(5) = cstr(c)
            MROD1(6) = cstr(-s)
            MROD1(8) = cstr(s)
            '...
    A+

  8. #8
    Membre régulier
    Inscrit en
    Février 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2007
    Messages : 71
    Points : 76
    Points
    76
    Par défaut
    Désolé , hier soir dans l'empressement c'est moi qui est déclaré la fonction en String dans mon exemple.

    Il vaudrait mieux la déclarer en Currency, ainsi que le tableau.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    J'ai bien essayé de déclarer en Currency mais ce qui se passe mal , c'est l'égalité : MROD2 = MROD1 (incompatibilité de type) ; je cherche ....

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Montre ta ligne d'appel de la fonction et la déclaration de la variable qui récupère le tableau dans la macro qui appelle cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LaVar = MROD1(k, x) 'ou MROD2 si tu utilises la syntaxe de Speedrman (qui me paraît la bonne)
    Montre cette ligne et indique comment tu déclares "LaVar"
    A+

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    Bah en fait , j'aimerais utiliser cette fonction directement dans Excel ; donc pas d'appel par VBA .... (quand je selectionne 9 cellules et je tape MROD(1,2) les celuules contienent "#NOM?"

    Si j'essaie de l'appeler dans une autre subroutine (donc en VBA) style :

    Msgbox Mrod(1,2)

    Ca me met incompatibilité de Type

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Le code fourni par Speedrman n'a qu'une dimension, quand bien même tu lui passes deux paramètres. A la place de
    Msgbox Mrod(1,2)
    En fin de fonction, teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox MROD1(1) 'ou MROD2(1) selon ce que tu as déclaré comme tableau
    Et supprime "AS STRING" dans
    Function MROD2(k, x)

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    Voici mon appel a ma fonction ; ça marche bien à présent .... mon problème est que je voudrais l'utiliser cette fonction MROD2 directement dans Excel... mais il ne la reconnait pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub appel()
     
        Dim bid() As Double, i As Integer
        bid() = MROD2(1, 5)
        For i = 1 To 9
            Cells(i, 1) = bid(i)
        Next i
     
    End Sub

  14. #14
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par bbil
    et pour toi elle doit renvoyer quoi ta fonction ..? si tu la met dans une cellule elle ne peu renvoyer qu'une seule valeur...! .. soit un peu plus clair sur tes intentions...
    je crois que je t'avais déjà posé la question ... comment veux tu mettre un tableau dans une cellule ..?

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    En fait , c'est le principe des MATRICES ; je selectionne une plage de 9 celllules
    ; je tape MROD2(1;2) puis CTRL + SHIFT + OK et il me met les 9 valeurs....


    mais il me met toutes les valeurs à 0 ; peut être faut il faire une declaration speciale ?? ....

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 30
    Points : 9
    Points
    9
    Par défaut
    Pour que ma fonction soit directement utilisable sur Excel en selectionnant une plage de 9 cellules (3 lignes et 3 colonnes) , il fallait que je declare mon tableau MROD1 à 2 dimensions ; merci à tous pour votre aide ....

    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
    37
    38
    39
    40
    41
    42
    Function MROD2(k, x) As Double()
     
    Dim i As Integer, j As Integer
    Dim MROD1(3, 3) As Double
    Dim c As Double, s As Double
     
    For i = 1 To 3
        For j = 1 To 3
            MROD1(i, j) = 0
        Next j
    Next i
     
    c = Cos(x)
    s = Sin(x)
     
    Select Case k
     
    Case Is = 1
    MROD1(1, 1) = 1
    MROD1(2, 2) = c
    MROD1(2, 3) = -s
    MROD1(3, 2) = s
    MROD1(3, 3) = c
     
    Case Is = 2
    MROD1(1, 1) = c
    MROD1(1, 3) = s
    MROD1(2, 2) = 1
    MROD1(3, 2) = -s
    MROD1(3, 3) = c
     
    Case Is = 3
    MROD1(1, 1) = c
    MROD1(1, 2) = -s
    MROD1(2, 1) = s
    MROD1(2, 2) = c
    MROD1(3, 3) = 1
    End Select
     
    MROD2 = MROD1
     
    End Function

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 24/05/2006, 19h19
  2. Fonction retournant un tableau initialisé
    Par ero-sennin dans le forum Delphi
    Réponses: 6
    Dernier message: 13/05/2006, 16h05
  3. [TP] Fonction retournant un tableau
    Par molesqualeux dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 07/05/2006, 01h01
  4. PB avec fonction retournant un tableau
    Par T-B dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2006, 22h01
  5. fonction retournant un tableau
    Par Jero13 dans le forum C
    Réponses: 7
    Dernier message: 22/11/2005, 11h14

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