XL 2010 Détecter la plage d'application d'une fonction

mécano41

XLDnaute Accro
Bonjour,

Je souhaite écrire une fonction (ici : Essai(P) dont le résultat, sur 3 cellules, doit pouvoir être placé, au choix, en ligne ou en colonne selon l'orientation de la plage sélectionnée pour écrire l'appel à la fonction.

Pour cela, je pensais demander le nombre de lignes et de colonnes du Variant Essai, afin de détecter cette orientation puis traiter en conséquence les valeurs.

Code:
Function Essai(P As Variant)
Dim NbLig As Long, NbCol As Long

NbLig = UBound(Essai, 1)
NbCol = UBound(Essai, 2)
MsgBox NbLig & "     " & NbCol

' traitement .....

End Function

Mais cela ne fonctionne pas. Je suppose que c'est parce que le Variant Essai est encore vide mais alors ... comment faire?

Cordialement
 

mécano41

XLDnaute Accro
Comme ça, c'est bon...Merci!

Cordialement

Code:
Option Explicit

Function Essai(P As Variant)
Dim NbLig As Long, NbCol As Long
NbLig = Range(Application.Caller.Address).Rows.Count
NbCol = Range(Application.Caller.Address).Columns.Count

MsgBox NbLig & "     " & NbCol

' traitement .....

End Function
 

mécano41

XLDnaute Accro
J'ai un autre souci...Après avoir traité les cellules sélectionnées, Excel va voir toutes les autres cellules utilisant la même fonction, Application.Caller évolue et mon test est faussé puisque ces cellules sont bonnes.
Je pourrais mettre un comptage pour ne traiter qu'au premier passage (sur le range sélectionné) mais cela impliquerait de mettre une variable Public dans le module principal et je ne veux pas car il y aura de nombreuses fonctions qui pourront être copiées...transmises...et je ne souhaite pas que l'ont ait à mettre cette variable.

Un simple double-clic dans une cellule déclenche tout!

Une idée?

Dans le fichier, ce sont les 4 lignes de "Vérification" des deux fonctions et le cadre rouge (si ça fonctionne là, ça fonctionnera ailleurs)

Cordialement
 

Pièces jointes

  • Essai Fonctions Vectorielles en VBA 01.xlsm
    41.6 KB · Affichages: 7
Dernière édition:

Dranreb

XLDnaute Barbatruc
Qu'est ce que vous racontez ? Application.Caller ne désigne que la plage où la fonction en cours d'évaluation est invoquée.
Êtes-vous sûr que vos calculs ne peuvent être effectuer avec les fonction standard d'Excel ?
SOMMEPROD, PRODUITMAT, INVERSEMAT …
Il y a déjà ça au lieu de NormeVec :
Code:
=RACINE(SOMME.CARRES(E5:E7))
 
Dernière édition:

mécano41

XLDnaute Accro
Ce que je veux dire :

J'ai ceci

Code:
' ======== Calcule la norme d'un vecteur de dimension 3 en ligne ou en colonne - Résultat dans cellule unique
Function NormeVec(Vec As Variant)
Application.Volatile
Dim V As Variant, Reponse As Variant
' ----- Vérification
MsgBox Application.Caller(2).Address & "      " & Application.Caller(2).Rows.Count & "    " & Application.Caller(2).Columns.Count
If Application.Caller.Rows.Count > 1 Or Application.Caller.Columns.Count > 1 Then
    Reponse = MsgBox("La plage de résultat doit être une cellule unique!", vbOKOnly & vbCritical, "Erreur")
    Exit Function
End If
' ----- Traitement etc...

End Function



' ========= Effectue le produit vectoriel de 2 vecteurs de dimension 3 en ligne ou en colonne - Résultat : en colonne ou en ligne
Function ProdVec3(Vec1 As Variant, Vec2 As Variant, Optional VraiSiResultEnLigne As Boolean)
Application.Volatile
Dim V1 As Variant, V2 As Variant, Reponse As Variant
Dim TabRes(3) As Double
' ----- Vérification
MsgBox Application.Caller.Address & "      " & Application.Caller.Rows.Count & "    " & Application.Caller(2).Columns.Count
If Application.Caller.Rows.Count <> 3 Or Application.Caller.Columns.Count <> 3 Then
    Reponse = MsgBox("La plage de résultat doit être une cellule unique!", vbOKOnly & vbCritical, "Erreur")
    Exit Function
End If
' ----- Traitement etc ....

End Function

et sur la feuille, j'ai :

- 2 appels de la fonction Norme depuis 1 cellule
- 2 appels de la fonction ProdVec3 depuis une plage de 3 lignes sur 1 colonne
- 2 appels de la fonction ProdVec3 depuis une plage de 1 ligne sur 3 colonnes

Lorsque j'écris un nouvel appel (ou que je sélectionne l'un des existants, le code fait le travail demandé mais la MsgBox continue d'afficher les adresses et Nb. de lignes et colonnes de toutes les zones d'appel de fonction y compris celles qui ne concernent pas la fonction que je viens d'utiliser...c'est à cela que je voudrais remédier.

Pour les produits vectoriels, je ne connais pas de fonctions EXCEL qui puissent calculer les 3 différences de produits croisés...et je voudrais pouvoir faire des vérifications et travailler avec des vecteurs ligne et des vecteurs colonne sans utiliser des Transpose... enfin, ce n'est pas le problème pour le moment.

Cordialement
 

Dranreb

XLDnaute Barbatruc
Je ne mets jamais de MsgBox dans les fonctions, mais s'il s'affiche c'est que la fonction est évaluée. C'est un peu normale vu qu'il y a un Application.Volatile … qu'il ne faudrait jamais utiliser. Sauf si la fonction utilise l'heure, parce qu'à part ça elle ne devrait jamais rien utiliser d'autre que ce qu'on lui spécifie en argument.
 

Discussions similaires

Réponses
8
Affichages
616

Statistiques des forums

Discussions
311 720
Messages
2 081 885
Membres
101 830
dernier inscrit
sonia poulaert