Matrice en VBA sous Excel

  • Initiateur de la discussion Merlin l'Enchanteur
  • Date de début
M

Merlin l'Enchanteur

Guest
Bonjour !

Je viens vous demader votre aide pour un cas qui me pose particulièrement soucis.

Je souhaiterais entrer sous Excel 3 matrices de taille n x m. En fait je dois choisir à l'aide d'une petite boîte de dialogue leurs dimensions.

Et selon ce qui est entré 3 plages de cellules sont créées. On entre ensuite les chiffres de la matrices et là je désirerais faire un calcul un peu complexe sur ces trois matrices.

En effet, je voudrais calculer l'inverse de la première soit A-1.
Ensuite je calcule l'inverse de la première multiplié par la deuxième soit A-1*B et enfin je calcule la dernière multiplié par notre dernier résultat soit C*A-1*B.

Le résultat est toujours un chiffre unique représentant le meilleur profit.

Il faut indiquer que pour la création des trois matrices de départ c'est par exemple A 3x3 donc B 1x3 et C 3x1 c'est à dire que le calcul souhaité est toujours possible.

Je souhaiterais donc juste avoir une petite explication sur ce point car je suis complètement bloqué.

Je vous remercie par avance et vous souhaite une agréable journée.

Merlin

PS : Je vous joint le fichier xls. Il suffit de remplacer les valeurs dans les matrices pour changer le résultat et le module2 ci-joins (visible dans l'éditeur VB) est le code de la matrice.

Le but est de trouver maintenant la généralisation de celui-ci pour réussir à réaliser le calcul quelque soit la valeur des coefficient de la matrice... et ca :( [file name=Matrice.zip size=6239]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Matrice.zip[/file]
 

Pièces jointes

  • Matrice.zip
    16.3 KB · Affichages: 136
  • Matrice.zip
    16.3 KB · Affichages: 133
  • Matrice.zip
    16.3 KB · Affichages: 138

Sylvain

XLDnaute Occasionnel
Bonjour,

Je crois que la première chose est de nommer tes matrices (tu sélectionnes la zone et tu mets un nom dans la zone sur la gauche de la barre de forule ou tu utilises le menu insertion / nom / définir).

Comme ça ta formule devient simplement :

=PRODUITMAT(MC;PRODUITMAT(INVERSEMAT(MA);MB))

Une petite macro ensuite pour augmenter ou diminuer la taille de la matrice par insertion de lignes et de colonnes :

Sub dim_plus()
 
'augmente la taille de la matrice
    Columns('C:C').Insert Shift:=xlToRight
    Rows('2:2').Insert Shift:=xlDown
End Sub
Sub dim_moins()
 
'diminue la taille de la matrice
 
Dim res
 
If Range('MA').Rows.Count > 2 Then
    res = MsgBox('Effacement d
'une ligne, risque de perte de données' & Chr(10) & 'Voulez-vous continuer ?', vbOKCancel + vbDefaultButton1 + vbExclamation, 'Diminution taille Matrice')
   
If res = 1 Then
        Rows('2:2').Delete Shift:=xlUp
        Columns('C:C').Delete Shift:=xlToLeft
   
End If
 
Else
    MsgBox 'La matrice doit avoir au moins 2*2'
 
End If
End Sub
[file name=Matrice_20050416145203.zip size=9239]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Matrice_20050416145203.zip[/file]
 

Pièces jointes

  • Matrice_20050416145203.zip
    9 KB · Affichages: 116
F

fudô

Guest
Ebauche d'interface

Bonjour,

J'ai commencé à adapter un user form avec un module de classe pour pouvoir saisir la taille et la valeur des chiffres de la matrice.

On peut déterminer sa taille en lançant le bouton, puis en cliquant dans la fenêtre on peut mettre les chiffres de la matrice.

Le problème, c'est que pour l'instant tous les chiffres arrives dans la même case (A1). Il faudrait modifier un peu le programme.

PS : le programme est assez balaise.
 
F

fudô

Guest
Re:Ebauche d'interface

Salut,

Puisque je n'arrive toujours pas à envoyer des pièces jointes, je vais faire des copier coller.

Voici le user form1, on ne met aucun bouton dans la fenètre et on met ce code :


Option Explicit

Dim MaListeDeLabel As New Collection
Dim ObjetClasse As New Classe1

Private Sub UserForm_Initialize() 'utilise le module de classe MaClasse1

Dim i, j, NombreDeLignes, NombreDeColonnes, NuméroLabel As Integer
Dim EspasseX, EspasseY, OrigineX, OrigineY As Integer 'défini l'origine du tableau et l'espace entre les différents Labels
Dim LabelLargeur, LabelHauteur, FenetreLargeur, FenetreHauteur As Integer
Dim LabelPlacementX, LabelPlacementY As Integer
Dim NomLabel As String
Dim Element As Object
Dim aa As Variant
'****** Initialisation des variables qui définissent les dimensions du Tableau ******
EspasseX = 20
EspasseY = 40
OrigineX = 5
OrigineY = 5
LabelLargeur = 40
LabelHauteur = 30
'*************************************************************************************

NombreDeLignes = InputBox('Nombre de lignes :')
NombreDeColonnes = InputBox('Nombre de colonnes :')

FenetreLargeur = 2 * OrigineX + LabelLargeur + (NombreDeColonnes - 1) * (LabelLargeur + EspasseX) 'defini la largeur de l'userform
UserForm1.Width = UserForm1.Width - UserForm1.InsideWidth + FenetreLargeur

FenetreHauteur = 2 * OrigineY + LabelHauteur + (NombreDeLignes - 1) * (LabelHauteur + EspasseY) 'defini la hauteur de l'userform
UserForm1.Height = UserForm1.Height - UserForm1.InsideHeight + FenetreHauteur


NuméroLabel = 0

For j = 1 To NombreDeLignes
For i = 1 To NombreDeColonnes

NomLabel = Str(NuméroLabel)

NuméroLabel = NuméroLabel + 1

MaListeDeLabel.Add Item:=ObjetClasse, key:=CStr(NuméroLabel)
Set ObjetClasse = Nothing 'cette ligne est obligatoire mais je n'ai pas bien compris sint fonctionnement

Set MaListeDeLabel.Item(NuméroLabel).Label_Prog = UserForm1.Controls.Add('Forms.Label.1', NomLabel)

LabelPlacementX = OrigineX + (i - 1) * (LabelLargeur + EspasseX)
LabelPlacementY = OrigineY + (j - 1) * (LabelHauteur + EspasseY)

With MaListeDeLabel.Item(NuméroLabel).Label_Prog
.Caption = NomLabel
.Top = LabelPlacementY
.Left = LabelPlacementX
.Width = LabelLargeur
.Height = LabelHauteur
.BackColor = &H8000000E 'blanc
End With

Next i
Next j

NuméroLabel = 0

end Sub


Maintenant, le module1 :


Sub Form1() 'lance un Userform sans l'utilisation du module de classe 'Classe1'

UserForm1.Show

End Sub


Et enfin le module de classe1


Option Explicit

Public WithEvents Label_Prog As MSForms.Label

Private Sub Label_Prog_Click()

Dim chiffre As Integer

chiffre = InputBox('valeur du chiffre :')

ActiveSheet.Cells(Label_Prog.Caption + 1, Label_Prog.Caption + 1) = chiffre

End Sub
 
M

Merlin l'Enchanteur

Guest
Re:Ebauche d'interface

Sylvain, fudô et vous tous qui avaient réfléchi à ce problème, je voulais vous adresser un grand coup de chapeau et toutes mes félicitations pour tout le travail effectué c'est vraiment remarquable.

Par contre fudô je n'ai pas tout compris dans ce que tu as fait ; cela me semble fort intéressant mais je ne vois pas trop le rapport avec module de classe. Je ne suis pas un expert, tu m'excuseras ;)

Pour ta question, pour joindre un fichier il y a une mention, juste en dessous du carré gris dans lequel tu écris : Selection du fichier à attacher. Donc tu zippes ton fichier. Tu le places par exemple sur ton bureau ; ensuite tu cliques sur la case où il est indiqué 'Parcourir... ' , tu cherches où tu as placé ton fichier, tu double cliques dessus et le tour est joué !

Il ne te reste plus qu'à cliquer sur soumettre et le tour est joué.

Voila j'espère avoir été clair, ainsi tu pourras essayé d'envoyer ton fichier si tu le désires.

En tout cas, TOUTES MES FELICITATIONS ET A+
 
M

Merlin l'Enchanteur

Guest
Re:Ebauche d'interface

Salut ! Je viens de comprendre ce que tu as fait fudô, c'est très ingénieux ma fois...

En fait je n'avais pas compris ce qu'était ce module de classe c'est en fait tout simple à définir! Mais bon quand on ne voit pas.... :(

Il reste maintenant comme tu me l'as dit à remettre en place la matrice pour qu'elle soit en diagonale et qu'elle fasse les calculs.

En attendant que je trouve, j'ai refait une archive avec les deux documents, celui de Sylvain et celui de fudô, comme ça si quelqu'un veut travailler dessus il est le bienvenu car c'est pour moi assez balèze.

Voila merci pour votre aide et a+ :) [file name=Matrice_20050501155518.zip size=22983]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Matrice_20050501155518.zip[/file]
 

Pièces jointes

  • Matrice_20050501155518.zip
    22.4 KB · Affichages: 97
F

fudô

Guest
Re:Ebauche d'interface

Salut à tous,

Pour réorganiser les chiffres, j'utilise ce programme :

Sub réorganisation_matrice()

Dim i, j, k, colonnes, lignes As Integer

colonnes = Cells(3, 1)
lignes = Cells(2, 1)

Cells(2, 1).Select
ActiveCell.FormulaR1C1 = ''

Cells(3, 1).Select
ActiveCell.FormulaR1C1 = ''

For i = 1 To colonnes
If 1 <= i And i <= colonnes Then
Cells(i, i).Select
Selection.Cut
Cells(1, i).Select
ActiveSheet.Paste
End If

Next i

For k = 2 To lignes

For i = (k - 1) * colonnes + 1 To k * colonnes

If (k - 1) * colonnes < i And i <= k * colonnes Then
Cells(i, i).Select
Selection.Cut
j = i - (k - 1) * colonnes
Cells(k, j).Select
ActiveSheet.Paste
End If

Next i

Next k

End Sub
 

Discussions similaires

Réponses
3
Affichages
202

Statistiques des forums

Discussions
312 413
Messages
2 088 199
Membres
103 764
dernier inscrit
nissassa