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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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