Collection des formules matricielles
Le
GL

Bonjour,
J'aimerais à partir d'une plage R donnée, obtenir la
collection des sous-plages (un peu comme R.Areas ou
R.SpecialCells donc) telle que chaque sous-plage est :
- soit la plage correspondant à une et une seule formule
matricielle (et dont au moins une cellule se trouve dans R)
- soit une cellule unique
Voyez-vous une méthode efficace pour y parvenir ?
Merci d'avance.
J'aimerais à partir d'une plage R donnée, obtenir la
collection des sous-plages (un peu comme R.Areas ou
R.SpecialCells donc) telle que chaque sous-plage est :
- soit la plage correspondant à une et une seule formule
matricielle (et dont au moins une cellule se trouve dans R)
- soit une cellule unique
Voyez-vous une méthode efficace pour y parvenir ?
Merci d'avance.
pour savoir si une cellule contient une formule matricielle
If ActiveCell.HasArray Then MsgBox "cette cellule contient une formule matricielle"
par la suite tu pourrait utiliser une des propriétés
Range.Dependents
Range.DirectDependents
Range.DirectPrecedents
par exemple:
x = ActiveCell.DirectPrecedents.Address
petit hic, cette propriété fonctionne uniquement sur la feuille active et ne
peut pas suivre des références distantes.
pour savoir si une cellule fait partie de plusieurs plages d'adresse
Set isect = Application.Intersect(Range("rg1"), Range("rg2"), Range("rg3")) '
jusqu'à Range("rg30")
If isect Is Nothing Then
isabelle
Le 2014-05-29 08:21, GL a écrit :
x1 = Range(Rng).Precedents.Address
isabelle
Le 2014-05-29 09:32, isabelle a écrit :
les proriétés Dependents et Precedents ne fonctionnent pas avec les formules
utilisant "INDIRECT"
=SOMME(INDIRECT(ADRESSE(1;1)&":"&ADRESSE(LIGNE()-1;1)))
isabelle
Le 2014-05-29 09:48, isabelle a écrit :
oui. Pour une plage on a :
Plage.HasArray signifie
VRAI il n'y a que des formules matricielles
(pas forcément la même formule ni la même matrice)
FAUX il n'y a aucune formule matricielle
NULL il y a des formules matricielles et d'autres
choses (constantes/formules non matricielles etc)
Il y a le problème de INDIRECT (bien vu d'ailleurs ! ce qui implique
qu'on ne devrait utiliser INDIRECT que quand c'est impossible de faire
autrement...) mais je ne vois pas que ça me permet de résoudre la
question.
J'ai trouvé : Cellule.CurrentArray
qui renvoie la plage de validation de la formule matricielle contenue
dans Cellule. L'aide pas très claire d'office dit :
« Si la cellule spécifiée fait partie d'un tableau, cette propriété
renvoie un objet Range qui représente l'ensemble du tableau.En
lecture seule. »
en anglais :
« If the specified cell is part of an array, returns a Range object
that represents the entire array.»
J'imagine qu'ici, "array" signifie "formula array"...
Donc on peut s'en sortir en parcourant les différentes cellules de
la collection .SpecialCells(xlCellTypeFormulas) et en regardant leur
.HasArray et le cas échéant leur .CurrentArray. Mais c'est un peu
technique...
oui j'ai fait cela :
For Each Cellule in .SpecialCells(xlCellTypeFormulas)
If Intersect(Cellule,<Cellules et CurrentArray déjà trouvés)=Nothing
Regarde Cellule.HasArray
et si VRAI ajoute Cellule.CurrentArray
à la collection.
Next Cellule
Au passage, les méthodes .FillRight et .FillDown se moquent totalement
des formules matricielles...
Merci,
Bonne journée.
le mot "array" dans ce contexte est un objet ".ListObjects(xlSrcRange)"
aucun rapport avec une matrice d'une formule matricielle
je n'ai jamais eu de problème avec les méthodes .FillRight et .FillDown
si tu expliquait le problème rencontré...
isabelle
Apparemment si puisque Cellule.CurrentArray renvoie bien l'objet Range
correspondant à la zone de validation de la formule matricielle dont
Cellule fait partie...
Exemple :
A B
1| 1 {=GRANDE.VALEUR($A$5;{1;2;3;4;5})}
2| 2 {...<matrice>...}
3| 3 {...<matrice>...}
4| 4 {...<matrice>...}
5| 5 {...<matrice>...}
Tu sélectionnes maintenant B3:C3 et copie vers la droite (CTRL+D)
il y a C3 affiche 5.
Je voudrais que dans ce cas la matrice complète soit recopiée vers
la droite (une matrice est un bloc : c'est une seule cellule qui
contient une matrice, mais qui a besoin de plusieurs cases pour
s'afficher).
Cdt.
As-tu vraiment un vrai problème à soumettre avec une formule particulière, à l'intérieur d'une application précise?
Alors, pourquoi ne pas le préciser dans ta question? Lorsque quelqu'un pose ce type de question à la queue leu leu,
je devins suspicieux quant à ses intentions.
Un petit exemple simple :
Tu sélectionnes la plage A1:A13 directement dans la feuille
A1 étant la cellule active, un clic sur la touche F2 et la cellule A1 passe en mode édition
tu insères cette grosse formule : =Ligne() et tu valides par Ctrl + Maj + Enter
A1:A13 affiche leur numéro de ligne et l'on vient de créer une matrice sur plusieurs lignes, impossible de supprimer le
contenu d'une cellule particulière de cette plage.
Ta question si j'ai bien compris, comment fait-on pour reproduire cela en VBA?
Après avoir passé des heures à chercher une solution, je te propose quelque chose de très complexe qui n'est pas à la portée
de tous...
'---------------------------------------
Sub test()
With Range("B1:B13")
.FormulaArray = "=Row()"
End With
End Sub
'---------------------------------------
;-))
Heu.. non ça n'a rien à voir. J'aurais voulu construire un objet Range
dont chaque .Area contient une et une seule formule matricielle.
Clairement, cela ne répond pas à la question posée ci-dessus...