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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #26161892
bonjour GL,

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 :
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.
isabelle
Le #26162002
j'oubliais le "Precedents"

x1 = Range(Rng).Precedents.Address

isabelle

Le 2014-05-29 09:32, isabelle a écrit :
bonjour GL,

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 :
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.
isabelle
Le #26161992
un autre hic,

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 :
j'oubliais le "Precedents"

x1 = Range(Rng).Precedents.Address

isabelle

Le 2014-05-29 09:32, isabelle a écrit :
bonjour GL,

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.Direct

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 :
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.
GL
Le #26162092
Le 29/05/2014 15:32, isabelle a écrit :
bonjour GL,

pour savoir si une cellule contient une formule matricielle

If ActiveCell.HasArray Then MsgBox "cette cellule contient une formule
matricielle"



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)

par la suite tu pourrait utiliser une des propriétés
Range.Dependents
Range.DirectDependents
Range.DirectPrecedents



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...

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



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.
isabelle
Le #26162172
Le 2014-05-29 10:39, GL a écrit :

« 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.»



le mot "array" dans ce contexte est un objet ".ListObjects(xlSrcRange)"
aucun rapport avec une matrice d'une formule matricielle


Au passage, les méthodes .FillRight et .FillDown se moquent totalement
des formules matricielles...



je n'ai jamais eu de problème avec les méthodes .FillRight et .FillDown
si tu expliquait le problème rencontré...

isabelle
GL
Le #26162352
Le 29/05/2014 17:29, isabelle a écrit :


Le 2014-05-29 10:39, GL a écrit :

« 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.»



le mot "array" dans ce contexte est un objet ".ListObjects(xlSrcRange)"
aucun rapport avec une matrice d'une formule matricielle



Apparemment si puisque Cellule.CurrentArray renvoie bien l'objet Range
correspondant à la zone de validation de la formule matricielle dont
Cellule fait partie...

Au passage, les méthodes .FillRight et .FillDown se moquent totalement
des formules matricielles...



je n'ai jamais eu de problème avec les méthodes .FillRight et .FillDown
si tu expliquait le problème rencontré...



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.
MichD
Le #26162792
Bonjour,

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
'---------------------------------------

;-))
GL
Le #26162772
Le 29/05/2014 19:43, MichD a écrit :
Bonjour,

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?



Heu.. non ça n'a rien à voir. J'aurais voulu construire un objet Range
dont chaque .Area contient une et une seule formule matricielle.

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
'---------------------------------------



Clairement, cela ne répond pas à la question posée ci-dessus...
Publicité
Poster une réponse
Anonyme