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

Excel Discussion :

matrice de dimension variable


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut matrice de dimension variable
    Bonjour à tous
    Je dois développer un petit prog sous excel
    Ce prog comprend des calculs matriciels (en ce moment les matrices sont sélectionnées "à la main" sous excel)
    Ma problématique :
    Dans ce prog, en fonction des cas de figure, les matrices à manipuler peuvent avoir des tailles variables, or sous excel les matrices définies en saisie manuelle le sont une fois pour toute (entre accolades)
    Je voudrais par exemple pouvoir créer des matrices carrés (n colonnes et n lignes) en rentrant "n" comme variable et en sélectionnant automatiquement les plages concernées dans un tableau de données
    Ensuite je dois faire du calcul matriciel divers sur ces matrices (transpose, inverse, etc...)
    Le problème c'est que je suis très débutant en prog et je sens que cela passe vers une prog VBA ?
    Merci pour vos conseils

  2. #2
    Membre Expert Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Par défaut
    Salut,

    Si j'ai bien compris, tu veux utiliser des variable de type tableau.

    Pour les déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim mavariabletableau () as string
    c'est les () qui font tout. De cette manière tu créé un tableau sans dimension. Dans ta procedure tu peux modifier la dimention du tableau.

    Pour plus d'info:
    http://silkyroad.developpez.com/vba/tableaux/

  3. #3
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Bonjour Jérome

    Merci de prendre un peu de temps pour un néophite
    Je vais regarder tous ça en détail

    Si j'ai bien compris les infos dans le lien:
    - je mets Option base 1 (car excel commence à 0)
    - si mes variables dans mon tableau sont des nombres décimaux et non des caractères, je dois déclarer variable "currency" et non "string"
    - mon tableau a 2 dimensions (matrice ligne + colonne)
    - j'aurais "n" ligne et "n" colonne (matrice carrée)
    - je définis la taille de ma matrice à 2 dimensions par ReDim nomtableau (1 to n, 1 to n)

    Je vais faire des essais dans ce sens

    PS : comment faire pour insérer mes futurs extrait de code dans une fenêtre comme tu l'as fait

    A+

  4. #4
    Membre Expert Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Par défaut
    Salut,

    Par contre fait attention quant tu utilises le REDIM. il faut l'utiliser de la mnière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    redim preserve montableau(n,n)
    si tu ne mets pas le preserve, les données stockées dans la variable redimensionnée sont perdues ...

    cd :
    http://silkyroad.developpez.com/vba/tableaux/#LIII-B

  5. #5
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Bonjour

    Voilà ce que j'ai pu coder en m'inspirant des infos du net (mais pas encore testé sous excel)

    Pour le "preserve" de Redim, je ne suis pas sûr que ça me serve, car mes matrices ont une taille fixe dans mon prog pour chaque cas de calculs (mais je dois seulement pouvoir faire varier cette taille en fonction des hypothèses de calculs de chaque affaire)

    Par contre, une question me vient : si la plage de cellules qui sert à définir ma matrice "matvar" évolue (indépendemment du cas où je fais varier la taille de la matrice), est ce que les éléments stockés dans "matvar" suivront en dynamique ?

    Voilà où j'en suis, vu mon peu de connaisance en VBA, j'ai l'impression que je vais galérer à automatiser mon prog !!

    N'hésitez pas à me faire part de vos remarques
    Et encore merci pour votre temps

    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
    Sub matvarTableau()
     
       'Définit le type de données pour le tableau.
        Dim matvar() As Currency
        Dim n As Integer,i As Integer, j As Integer, x As Integer, y As Integer
     
        'Définit taille matrice depuis une cellule, valeur de "n" situé en cellule B37
        n= Range("B37").Value
     
        'Définit la taille du tableau
        ReDim matvar(1 to n, 1 to n)
     
     
        'Alimente les éléments du tableau, cellule départ B78 = Cells(78, 2)
        x=78
        y=2
        For i = 1 To n 'boucle sur la 1ere dimension
            For j = 1 To n 'boucle sur la 2eme dimension
                'Alimente les éléments du tableaux
                 matvar(i, j) = Cells.Value (x+i, y+j)
                'Lit les éléments du tableau
                 Debug.Print matvar(i, j)
            Next j
        Next i    
     
        'Imprime la matrice dans une plage de cellule dim n x n, cellule départ B92 = Cell(92, 2)
         Range(Cells(92, 2), Cells(UBound(matvar, 1), UBound(matvar, 2))) = matvar
     
    End Sub

  6. #6
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Rebonjour

    Voilà j'ai testé et modifié mon code qui fonctionne maintenant
    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
    Option Explicit
     
    Sub matvarTabl()
     
       'Définit le type de données pour le tableau.
        Dim matvar() As Currency
        Dim n As Integer, i As Integer, j As Integer, x As Integer, y As Integer
     
        'Définit taille matrice depuis une cellule, valeur de "n" situé en cellule C2
        n = Range("C2").Value
     
        'Définit la taille du tableau
        ReDim matvar(1 To n, 1 To n)
     
        'Alimente les éléments du tableau, cellule départ B5 = Cells(5, 2)
         x = 5 - 1
         y = 2 - 1
         For i = 1 To n 'boucle sur la 1ere dimension
             For j = 1 To n 'boucle sur la 2eme dimension
                'Alimente les éléments du tableaux
                  matvar(i, j) = Cells.Value(x + i, y + j)
                  'MsgBox matvar(i, j)
             Next j
         Next i
     
        'Imprime la matrice dans une plage de cellule dim n x n, cellule départ B36
         Range("B36").Resize(UBound(matvar, 1), UBound(matvar, 2)) = matvar
     
    End Sub
    Par contre :
    - cela met environ 30s pour exécuter la procédure !! (cela vient-il de mon vieux PC?)
    - comme je le craignais cela n'est pas "dynamique" comme avec les cellules excel (je voudrais que ma matrice matvar soit automatiquement modifiée lorsqu'une ou plusieurs des valeurs de la plage de référence sont modifiées)

    J'en reviens donc à ma problématique de base sachant que mon prog de base sous excel fonctionne très bien (avec un paquet de calculs matriciels) pour un cas unique de matrices 5 x 5 avec par exemple :
    {=INVERSEMAT(B78:F82)}
    {=TRANSPOSE(K141:O145)}
    {=PRODUITMAT(PRODUITMAT(K150:O154;B122:F126);K141:O145)}
    {=DIAGSYM(B181:F185;VRAI)} "extraction des valeurs propres de la matrice"
    etc....

    Je voudrais paramétrer tout cela pour des cas de matrice 1x1 à 10x10 maxi
    Y a t'il un moyen simple en modifiant ma feuille de base ? (et sans tout recoder en VBA)

    Merci de vos conseils

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    ...je passerais le post en "résolu" dès que j'aurais finalisé la mise à jour
    à tout hasard, profites-en pour cliquer sur sous les réponses de promethee
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Rebonjour à tous

    Grâce aux conseils de Prométhée25, j'ai quasiment terminé la modif de mon prog (avec sans doute des manip pas très élégantes mais bon ça fonctionne)

    Je bloque sur la dernière étape pour paramétrer la dernière opération mathématique (calcul moment)

    Je mets en fichier en PJ

    Si une âme charitable peut m'aider

    Merci d'avance

    TEST moment.xls

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 705
    Par défaut
    Bonjour,

    Cette formule matricielle marche sur ton cas avec dimension matrice à 5 mais ça reste à valider avec précaution pour les autres cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME(DECALER(B$74; MAX(1; LIGNE() - LIGNE(B$89)) - 1; ; MIN(DimensionMatrice - LIGNE() + LIGNE(B$89) + 1; DimensionMatrice)) * (DECALER($F$4; MIN(LIGNE()-LIGNE(B$89));0) - DECALER($F$4; MAX(1; LIGNE() - LIGNE(B$89)); ; MIN(DimensionMatrice - LIGNE() + LIGNE(B$89) + 1; DimensionMatrice))))

  10. #10
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Bonsoir Prométhée25
    Merci encore pour ton aide
    Je dois mal m'y prendre car quand je copie la formule matricielle, j'obtiens la même valeur dans toute la matrice 5x5
    Dans le fichier en PJ, la colonne B89:B94 devrait correspondre à la colonne P8994
    Cela vient peut être de ma version Excel ?
    TEST moment 2.xls

  11. #11
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Rebonsoir
    Après d'autres essais, ça à l'air de marcher si je copie la formule dans chaque cellule et je valide ensuite chaque cellule par F2/CTRL/SHIFT/ENTREE
    Il faut que je fasse cellule par cellule pour ma matrice 12x12 ?
    A+

  12. #12
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Avec des +1 je suis prêt à tout t'expliquer!
    eh oui!
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

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

Discussions similaires

  1. Affectation d'une matrice dans une variable
    Par sango85 dans le forum MATLAB
    Réponses: 3
    Dernier message: 29/03/2007, 10h20
  2. [TP] Matrice à deux dimensions
    Par bongo parfait dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/03/2007, 22h20
  3. matrice 3 dimensions autour de z
    Par aimad41 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/03/2007, 15h13
  4. [débutant] un tableau de dimension variable selon l'objet qui le contient
    Par Epistocles dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/01/2007, 18h07
  5. tableau à dimension variable
    Par Phoenix_Blue dans le forum C++
    Réponses: 17
    Dernier message: 18/11/2006, 14h17

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