Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Collection des formules matricielles

8 réponses
Avatar
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.

8 réponses

Avatar
isabelle
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.
Avatar
isabelle
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.
Avatar
isabelle
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.
Avatar
GL
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.
Avatar
isabelle
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
Avatar
GL
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.
Avatar
MichD
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
'---------------------------------------

;-))
Avatar
GL
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...