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 :
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 :
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.
PublicFunction SolutionsSysteme(matrice As Range, vecteur As Range)AsVariant
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 :
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 :
2) - Le système n'a aucune solution (ensemble vide).
3) - Le système a une infinité de solutions écrites sous la forme d'expressions de variables (X1, X2..).
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 :
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 :
...
nbrLignes = matrice.Rows.Count ' renvoie le nombre de lignes de la matrice
nbrColonnes = matrice.Columns.Count ' renvoie le nombre de colonnes de la matriceIf nbrLignes <> nbrColonnes Then' Si la matrice n'est pas carrée
SolutionSysteme = "#DIMENSION!"' On affiche un message d'erreur relatif aux dimensions dans la celluleExitFunction' Sortie de la fonctionEndIf
...
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.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité,
merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.