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 :

Utilisation de matrices en argument de fonctions [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut Utilisation de matrices en argument de fonctions
    Bonjour, mon problème est double.

    J'ai une Sub appelant une fonction. Dans cette fonction l'argument est une matrice.

    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
    Sub test()
     
    Dim mat(4, 4) 
    Dim toto(4, 4)
     
    Randomize
     
     
    For i = 1 To 4
    For j = 1 To 4
     
    mat(i, j) = Int(5 * Rnd) - 2
    Cells(9 + i, j) = mat(i, j)
    Next
    Cells(9 + i, 6) = Int(20 * Rnd) - 10
    Next
     
    toto = InverseMatrice(mat)
    End Sub

    Avec cette sub j'appelle la fonction InverseMatrice


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Private Function InverseMatrice(ByRef Matrice()) 
     
    'Calcul de l'inverse d'une matrice par pivot de Gauss
     
    Dim i As Integer, j As Integer, k As Integer 'variable de boucle
    Dim n As Integer 'dimension de la matrice à inverser
    Dim M() As Double
    Dim MInv() As Double 'matrice inverse
    Dim Temp As Double
     
     
     
        n = UBound(Matrice, 1)
     
        ' vérifie que la matrice est une matrice carrée
        If UBound(Matrice, 2) <> n Then MsgErrBox "La matrice n'est pas carrée !"
     
        ' crée la matrice n x 2n, composée par M et la matrice identité
        ReDim M(n, 2 * n)
        For i = 1 To n
            For j = 1 To n
                M(i, j) = Matrice(i, j)
                M(i, j + n) = 1 - Sgn(Abs(i - j))
            Next
        Next
     
        ' échelonne la matrice M()
        For i = 1 To n
            ' trouve le pivot (1er élément <> 0)
            j = i
            While M(j, i) = 0
                j = j + 1
                If j > n Then MsgErrBox "La matrice n'est pas inversible !"
            Wend
            ' échange les 2 lignes si elles sont différentes
            ' commence à partir de l'élément i, car tous les précédents sont nuls
            If i <> j Then
                For k = i To 2 * n
                    Temp = M(i, k)
                    M(i, k) = M(j, k)
                    M(j, k) = Temp
                Next
            End If
            ' le pivot devient égal à 1
            If M(i, i) <> 1 Then
                Temp = M(i, i)
                For j = i To 2 * n
                    M(i, j) = M(i, j) / Temp
                Next
            End If
            ' sous le pivot, tous les éléments deviennent nuls
            For j = i + 1 To n
                If M(j, i) <> 0 Then
                    Temp = M(j, i)
                    For k = i To 2 * n
                        M(j, k) = M(j, k) - M(i, k) * Temp
                    Next
                End If
            Next
        Next
     
        ' réduit la matrice M()
        For i = n To 2 Step -1
            For j = 1 To i - 1
                If M(j, i) <> 0 Then
                    Temp = M(j, i)
                    For k = i To 2 * n
                        M(j, k) = M(j, k) - M(i, k) * Temp
                    Next
                End If
            Next
        Next
     
        ' retourne le résultat : la deuxième partie de la matrice M()
        ReDim MInv(n, n) 
        For i = 1 To n
            For j = 1 To n
                MInv(i, j) = M(i, j + n)
            Next
        Next
        InverseMatrice = MInv
     
        For i = 1 To 4
        For j = 1 To 4
        Cells(9 + i, j + 11) = MInv(i, j)
        Next
        Next
     
    End Function

    Lorsque j'utilise Call InverseMatrice ttout compile mais avec toto j'ai une erreur de compilation "impossible d'affecter à un tableau"
    Quelqu'un aurait une solution à proposer ?
    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Je dirais de ne pas dimensionner toto ou du moins le mettre As Variant
    Et à ta function, retourne un Variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Function InverseMatrice(Matrice)  As Variant

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut
    Citation Envoyé par parmi Voir le message
    Bonjour,

    Je dirais de ne pas dimensionner toto ou du moins le mettre As Variant
    Et à ta function, retourne un Variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Function InverseMatrice(Matrice)  As Variant
    Je te dois beaucoup, il fallait que je ne dimensionne pas la matrice toto. Merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Bien que ce soit noté résolu je relève cette anomalie au cas ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For i = 1 To 4
        For j = 1 To 4
        Cells(9 + i, j + 11) = MInv(i, j)
        Next
        Next
    Une fonction retourne un résultat et ne peut pas écrire dans des cellules.
    eric

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    Bien que ce soit noté résolu je relève cette anomalie au cas ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For i = 1 To 4
        For j = 1 To 4
        Cells(9 + i, j + 11) = MInv(i, j)
        Next
        Next
    Une fonction retourne un résultat et ne peut pas écrire dans des cellules.
    eric
    C'est dans ma procédure que ma fonction retourne ces valeurs.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Ah.
    Je vois ces lignes avant le End Function

  7. #7
    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
    bonsoir

    oui en effet la fonction est sensée devenir un tableau
    manque de pot en fin de code de la fonction elle devient la valeur d'un seul élément est donc un string
    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

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    bonsoir

    oui en effet la fonction est sensée devenir un tableau
    manque de pot en fin de code de la fonction elle devient la valeur d'un seul élément est donc un string
    bonjour,

    Les dernières lignes sont la que pour vérifier le calcul de l'inverse.
    Du coup je comprend pas ou vous voulez en venir

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    nulle part ailleurs que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For i = 1 To 4
        For j = 1 To 4
        Cells(9 + i, j + 11) = MInv(i, j)
        Next
        Next
    ne peut fonctionner dans une fonction, c'est juste ça.
    Depuis tu l'as peut-être déplacé dans le sub, mais ce n'est pas le cas dans ta question du 1er post.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut
    Citation Envoyé par eriiic Voir le message
    nulle part ailleurs que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For i = 1 To 4
        For j = 1 To 4
        Cells(9 + i, j + 11) = MInv(i, j)
        Next
        Next
    ne peut fonctionner dans une fonction, c'est juste ça.
    Depuis tu l'as peut-être déplacé dans le sub, mais ce n'est pas le cas dans ta question du 1er post.
    Oui effectivement parce qu'à la base j'ai testé ma fonction en sub pour vérifier le résultat. Merci

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

Discussions similaires

  1. Utiliser une structure comme argument d'une fonction
    Par guilermo dans le forum Débuter
    Réponses: 7
    Dernier message: 15/10/2009, 10h05
  2. [Débutant] Utiliser des listes en argument d'une fonction
    Par erkenbrand dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/05/2008, 12h56
  3. Matrices en arguments de fonction
    Par azertylr dans le forum C
    Réponses: 6
    Dernier message: 20/05/2008, 21h46
  4. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41
  5. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03

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