Voir le flux RSS

User

Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations

Noter ce billet
par , 25/04/2019 à 19h54 (154 Affichages)
Les fonctions VBA déclarées publiques dans un module Excel d'un fichier prenant en charge les macros (format xls ou xlsm), peuvent ensuite être utilisées, comme pour les fonctions natives, directement dans n'importe quelle cellule du classeur.

Prenons comme exemple la résolution d'un système d'équations :

4 + 3y + 4z = 50
3x + 5 y - 4z = 2
4x + 7 y - 2z = 31

Ce système peut s'écrire sous forme matricielle :

Nom : systeme_equations.jpg
Affichages : 950
Taille : 8,9 Ko

La partie de gauche (1er membre) représente la matrice des coefficients du système, la partie de droite, le second membre du système peut être vu comme un vecteur.

Par la suite on se limitera à une matrice carrée, et on utilisera la méthode du pivot de Gauss pour résoudre le système .

Un système d'équations peut avoir une unique solution, aucune solution ou une infinité de solutions.

Pour résoudre ce type de problème, on peut saisir la matrice et le vecteur dans des zones bien définies de cellules groupées, puis exécuter une macro affectée par exemple à un bouton de commande, pour mettre à jour une autre plage de cellules avec les solutions du système d'équations.

Cependant, cette méthode pourrait manquer de souplesse si on souhaite par exemple redimensionner la matrice ou la déplacer, la macro ne va peut-être plus fonctionner correctement.

On peut également utiliser les fonctions prédéfinies ProduitMat et InverseMat dans des formules matricielles :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
{=PRODUITMAT(INVERSEMAT(matrice);vecteur)}
où les arguments matrice et vecteur représentent des plages de cellules de type Range.

Mais la encore cette méthode non optimale ne propose pas de gestion d'erreur adaptée, ni la possibilité d'indiquer quand il n'y a pas de solution ou celle d'afficher l'ensemble des solutions quand il est infini.

Pour résoudre ces problèmes, on a recours à une fonction VBA personnalisée nommée SolutionsSysteme qui va renvoyer les solutions du système en fonction de la matrice carrée et du vecteur en utilisant la méthode du pivot de Gauss :

Arguments de la fonction SolutionsSysteme :

  • matrice : désigne la plage des cellules contenant les coefficients de la matrice.
  • vecteur : désigne la plage des cellules contenant les valeurs du vecteur à 1 dimension.


Partie déclarative de la fonction :

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
Public Function SolutionsSysteme(matrice As Range, vecteur As Range) As Variant

La fonction est déclarée publique pour pouvoir l'utiliser dans tout le classeur, et renvoie un type variant pour afficher dans les cellules aussi bien des valeurs numériques que du texte pour le type d'erreur.

Avec la formule matricielle {=SolutionSysteme(matrice;vecteur)}, la fonction renvoie une plage de cellules qui peut être vue comme un tableau à 2 dimensions :

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
SolutionsSysteme = tabSol ' On renvoie le tableau à 2 dimensions

On sélectionne la plage des cellules destinées à afficher les solutions puis on saisit la formule avant de valider par CTRL+MAJ+Entrée. :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
{=SolutionSysteme(J6:L8;N6:N8)}
  • J6:L8 : désigne la plage de cellules de la matrice.
  • N6:N8 : désigne la plage de cellules du vecteur.


Les accolades entourant la fonction indique que la formule est matricielle et concerne la plage de cellules sélectionnée.

1) - Le système admet une solution unique :

Nom : solution_unique.jpg
Affichages : 49
Taille : 79,8 Ko

2) - Le système n'a aucune solution (ensemble vide).

Nom : aucune_solution.jpg
Affichages : 48
Taille : 61,8 Ko

3) - Le système a une infinité de solutions écrites sous la forme d'expressions de variables (X1, X2..).

Nom : ensemble_solutions.jpg
Affichages : 48
Taille : 82,6 Ko


La fonction intègre donc une gestion d'erreur pour le cas par exemple où la matrice ne serait pas carrée ou ne correspondrait pas aux dimensions du vecteur :

Nom : erreur_dimension.jpg
Affichages : 48
Taille : 56,5 Ko

On remarque sur l'image que les dimensions de la matrice "I6:K9" ne sont pas carrées, d'ou le message d'erreur "#DIMENSION!" affichée dans les cellules "O6:O8"

Portion de code pour gérer le cas où la matrice n'est pas carrée :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
...
 
nbrLignes = matrice.Rows.Count ' renvoie le nombre de lignes de la matrice
nbrColonnes = matrice.Columns.Count ' renvoie le nombre de colonnes de la matrice
 
	If nbrLignes <> nbrColonnes Then ' Si la matrice n'est pas carrée
            SolutionSysteme = "#DIMENSION!" ' On affiche un message d'erreur relatif aux dimensions dans la cellule
            Exit Function ' Sortie de la fonction
        End If
 
 ...

Je tiens à remercier Daniel Roux pour son ouvrage "VBA POUR EXCEL - Bibliothèque mathématique avec applications pratiques" dans lequel j'ai pris quelques idées.
Miniatures attachées Fichiers attachés

Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Viadeo Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Twitter Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Google Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Facebook Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Digg Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Delicious Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog MySpace Envoyer le billet « Avantages des fonctions VBA personnalisées dans Excel : résolution de systèmes d'équations » dans le blog Yahoo

Mis à jour 25/04/2019 à 23h03 par User

Catégories
VBA , Excel

Commentaires