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

Traduire formule "simple" en "matricielle"

13 réponses
Avatar
j-pascal
Bonjour,

La formule suivante fonctionne :

{=ADRESSE(LIGNE(INDIRECT(ADRESSE(MAX((Import="N°
cde")*LIGNE(Import)+1);MAX((Import="N°
cde")*COLONNE(Import)))));1)&":"&ADRESSE(MAX(NON(ESTVIDE(Col_Import))*LIGNE(Col_Import));7)}

[Elle me renvoit dans le cas présent : $A$16:$G$308] (ce qui est le bon
résultat)

L'équivalent (?) en vba :

x = Range("Import").Find("N° cde", Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
y = Range("Col_Import").SpecialCells(xlCellTypeBlanks).Row

MsgBox Range(Cells(x, 1), Cells(y, 7)).Address

[Me renvoit : $A$1:$G$16] ce qui ne correspond pas au résultat attendu.


Je ne me souviens plus comment on peut "traduire" une formule "simple"
en "matricielle", en passant pas le "debug.print" de la fenêtre
"exécution" !

Merci d'avance pour votre aide,

JP

3 réponses

1 2
Avatar
isabelle
bonjour Jp,

voilà :
http://cjoint.com/?etkTEy15lW

dit moi si c'est mieux,

isabelle

j-pascal a écrit :
Re,

"Col_Import" est une zone nommée (qui se trouve sur ma Feuille 1) et
qui correspond à : Feuil1!$A$1:$A$1000

Import correspond à : Feuil1!$A$1:$H$1000

En fait, Import devrait suffire, mais je recherche le nombre de
valeurs maxi sur la première colonne, par sécurité ...

JP

bonjour Jp,

peut tu me reppeler à quoi correspond Col_Import et est ce que c'est
une référence glissante ?

isabelle

j-pascal a écrit :
Je guettais ta réponse ;-)

AdrPlageImport = la plage définie par :

'-----------
"­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x & ")))))" &
",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"
'------------

sachant que x = Range("Import").Addresse

En fait, dans la feuille 1 de mon classeur, j'importe le contenu
d'une autre feuille (ie Feuille "toto")

Dans feuille "toto", les données sont organisées d'une façon que
j'ignore. Dans mon classeur (feuille 1), je réserve une plage
"A1:Z1000" que je nomme "Import" (cf. ton "x"). La formule ci-dessus
me renvoit la position de "N° Cde" (qui est censé être le point
"haut / gauche" de mon tableau. Cette même formule me définie la
plage que je dois copier (ayant pour référence en haut à gauche :
"N° Cde" et pour réf. en bas à droite, la colonne "G" et le nombre
de valeurs contenues dans la dite colonne.

Pour l'intant, ma zone nommée fonctionne (ce n'est pas le plus
compliqué ;-) ) et il ne me reste plus qu'à (!) mettre en pratique
la formule ci-dessus pour copier la plage.

D'où ma question :

Comment associer "The big formule" à "AdrPlageImport" ? Pour avoir :

"Range(AdrPlageImport).select" (ou copy)

Pourvu que je sois clair ...

A bientôt ?

JP


bonjour Jp,

par exemple si la variable AdrPlageImport = "B1:B10" ou
AdrPlageImport = "$B$1:$B$10"

Range(AdrPlageImport).Select
'ou
Application.GoTo Sheets("Feuil1").Range(AdrPlageImport)

si tu peut mettre le fichier en ligne, je trouverai d'autre méthode
pour alimiter la variable AdrPlageImport autre qu'une formule
matricielle

isabelle

j-pascal a écrit :
Bonjour Isabelle,

Désolé, je suis de plus en plus perdu.
Je ne devrais poser qu'une seule question à la fois ;-)

A partir de :

'----------
x = Range("Import").Addresse

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x &
")))))" &

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"
'----------

Si "AdrPlageImport" correspond à l'adresse récupérée par la
formule ci-dessus, comment dois-je compléter ce qui suit :

AdrPlageImport = [???]

pour avoir au bout du compte :

.Range(AdrPlageImport).select

En résumé, je désire sélectionner la plage définie par la formule
ci-dessus. Il est possible que je m'emmèle un peu dans les doubles
guillemets ...

@+ ?

JP

bonjour Jp,

normalement on mets =Evaluate(mafonction) et c'est tout, mais les
variables ou les plage nommée doivent être transformer sous la forme
" & variable & " et " & Range("A1").Addresse & "
par exemple si import est une plage nommée

x = Range("Import").Addresse

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x &
")))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"

isabelle

j-pascal a écrit :
Bonjour,

Désolé, je ne comprends pas.
Si je copie la présente formule dans un module et que (comme tu
sembles le proposer) je saisie : Debug.Print Evaluate(F) dans la
fenêtre d'exécution, j'obtiens "Erreur 2015"

Outre ce pb, je ne souhaite pas que la dite formule soit copiée
dans une feuille. Par contre j'aimerais qu'une variable
"AdrPlageImport" (ie) recueille l'adresse en question. Le but
étant d'avoir :

.Range(AdrPlageImport).Copy

En fait, j'ai essayé de resaisir "ma" formule "simple" dans une
feuille, en lançant l'enregistreur de macro, j'ai terminé par
CTRL MAJ ENTER, puis je suis allé voir le résultat dans le
module de code. Le résultat ressemble à ta proposition à
l'exception près de 2 " & _ " qui correspondent aux retour à la
ligne.
Le pb, c'est que si la formule est copiée dans une cellule, elle
l'est sous la forme "Formula-Array" qui doit correspondre une
conversion en matricielle.

En résumé (!), que dois-je ajouter à la formule suivante pour
qu'elle soit une formule matricielle dans la module de code :

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX((Import=""N° cde"")*" & _
" ROW(Import)+1),MAX((Import=""N° cde"")*COLUMN(Import)))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"


Merci pour ton aide,

JP

Bonjour J-Pascal,

Dans la fenêtre de l'éditeur de code, ta formule devrait
ressembler à ceci :

Dim F As String

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX((Import=""N° cde"")*" & _
" ROW(Import)+1),MAX((Import=""N° cde"")*COLUMN(Import)))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"


'Si tu veux copier ta formule vers une cellule d'une feuille de
calcul
Range("A5").FormulaArray = F

'Si tu veux afficher le résultat de ta formule dans la fenêtre
"Exécution" de la fenêtre VBE

Debug.Print Evaluate(F)





"j-pascal" a écrit dans le message de
groupe de discussion :
Bonjour,

La formule suivante fonctionne :

{­RESSE(LIGNE(INDIRECT(ADRESSE(MAX((Import="N°
cde")*LIGNE(Import)+1);MAX((Import="N°
cde")*COLONNE(Import)))));1)&":"&ADRESSE(MAX(NON(ESTVIDE(Col_Import))*LIGNE(Col_Import));7)}





[Elle me renvoit dans le cas présent : $A$16:$G$308] (ce qui
est le bon résultat)

L'équivalent (?) en vba :

x = Range("Import").Find("N° cde", Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
y = Range("Col_Import").SpecialCells(xlCellTypeBlanks).Row

MsgBox Range(Cells(x, 1), Cells(y, 7)).Address

[Me renvoit : $A$1:$G$16] ce qui ne correspond pas au résultat
attendu.


Je ne me souviens plus comment on peut "traduire" une formule
"simple" en "matricielle", en passant pas le "debug.print" de
la fenêtre "exécution" !

Merci d'avance pour votre aide,

JP


















Avatar
j-pascal
Bonsoir Isabelle,

C'est parfait !
Merci +++

En fait, maintenant j'ai ceci :
'----------
x = Range("Import").Find("N° cde", Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

AdrPlageImport = Range(Cells(x, 1), Cells(y, 7)).Address
'----------
etc.

Je ne veux pas inscrire le résultat de la formule dans la feuille,
sinon ta formule suivante aurait été suffisante :

{­RESSE(LIGNE(INDIRECT(ADRESSE(MAX((Import="N°
cde")*LIGNE(Import)+1);MAX((Import="N°
cde")*COLONNE(Import)))));1)&":"&ADRESSE(MAX(NON(ESTVIDE(Col_Import))*LIGNE(Col_Import));7)}

En vba, c'est parfait !
En fait, c'est la petite erreur qu'il y avait dans le code pour "y" qui
m'a un peu éloigné de la solution qui finalement n'était pas bien loin.

Initialement "y" était égale à :

y = Range("Col_Import").SpecialCells(xlCellTypeBlanks).Row

au lieu de :

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row


Comme c'était censé être la traduction en vba de la formule en
matricielle ci-dessus, je me suis dit que je devais mal appliquer la
dernière formule ...

Un (très) grand merci pour ta patience.

Je vais essayer de remettre tout ça en odre dans ma tête et dans "mon"
classeur ...

A bientôt,

JP

bonjour Jp,

voilà :
http://cjoint.com/?etkTEy15lW

dit moi si c'est mieux,

isabelle

j-pascal a écrit :
Re,

"Col_Import" est une zone nommée (qui se trouve sur ma Feuille 1) et qui
correspond à : Feuil1!$A$1:$A$1000

Import correspond à : Feuil1!$A$1:$H$1000

En fait, Import devrait suffire, mais je recherche le nombre de valeurs
maxi sur la première colonne, par sécurité ...

JP

bonjour Jp,

peut tu me reppeler à quoi correspond Col_Import et est ce que c'est une
référence glissante ?

isabelle

j-pascal a écrit :
Je guettais ta réponse ;-)

AdrPlageImport = la plage définie par :

'-----------
"­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x & ")))))" &
",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"
'------------

sachant que x = Range("Import").Addresse

En fait, dans la feuille 1 de mon classeur, j'importe le contenu d'une
autre feuille (ie Feuille "toto")

Dans feuille "toto", les données sont organisées d'une façon que
j'ignore. Dans mon classeur (feuille 1), je réserve une plage "A1:Z1000"
que je nomme "Import" (cf. ton "x"). La formule ci-dessus me renvoit la
position de "N° Cde" (qui est censé être le point "haut / gauche" de mon
tableau. Cette même formule me définie la plage que je dois copier (ayant
pour référence en haut à gauche : "N° Cde" et pour réf. en bas à droite,
la colonne "G" et le nombre de valeurs contenues dans la dite colonne.

Pour l'intant, ma zone nommée fonctionne (ce n'est pas le plus compliqué
;-) ) et il ne me reste plus qu'à (!) mettre en pratique la formule
ci-dessus pour copier la plage.

D'où ma question :

Comment associer "The big formule" à "AdrPlageImport" ? Pour avoir :

"Range(AdrPlageImport).select" (ou copy)

Pourvu que je sois clair ...

A bientôt ?

JP


bonjour Jp,

par exemple si la variable AdrPlageImport = "B1:B10" ou AdrPlageImport
= "$B$1:$B$10"

Range(AdrPlageImport).Select
'ou
Application.GoTo Sheets("Feuil1").Range(AdrPlageImport)

si tu peut mettre le fichier en ligne, je trouverai d'autre méthode pour
alimiter la variable AdrPlageImport autre qu'une formule matricielle

isabelle

j-pascal a écrit :
Bonjour Isabelle,

Désolé, je suis de plus en plus perdu.
Je ne devrais poser qu'une seule question à la fois ;-)

A partir de :

'----------
x = Range("Import").Addresse

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x & ")))))" &
",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"
'----------

Si "AdrPlageImport" correspond à l'adresse récupérée par la formule
ci-dessus, comment dois-je compléter ce qui suit :

AdrPlageImport = [???]

pour avoir au bout du compte :

.Range(AdrPlageImport).select

En résumé, je désire sélectionner la plage définie par la formule
ci-dessus. Il est possible que je m'emmèle un peu dans les doubles
guillemets ...

@+ ?

JP

bonjour Jp,

normalement on mets =Evaluate(mafonction) et c'est tout, mais les
variables ou les plage nommée doivent être transformer sous la forme
" & variable & " et " & Range("A1").Addresse & "
par exemple si import est une plage nommée

x = Range("Import").Addresse

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x & ")))))" &
_
",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"

isabelle

j-pascal a écrit :
Bonjour,

Désolé, je ne comprends pas.
Si je copie la présente formule dans un module et que (comme tu
sembles le proposer) je saisie : Debug.Print Evaluate(F) dans la
fenêtre d'exécution, j'obtiens "Erreur 2015"

Outre ce pb, je ne souhaite pas que la dite formule soit copiée dans
une feuille. Par contre j'aimerais qu'une variable "AdrPlageImport"
(ie) recueille l'adresse en question. Le but étant d'avoir :

.Range(AdrPlageImport).Copy

En fait, j'ai essayé de resaisir "ma" formule "simple" dans une
feuille, en lançant l'enregistreur de macro, j'ai terminé par CTRL
MAJ ENTER, puis je suis allé voir le résultat dans le module de code.
Le résultat ressemble à ta proposition à l'exception près de 2 " & _
" qui correspondent aux retour à la ligne.
Le pb, c'est que si la formule est copiée dans une cellule, elle
l'est sous la forme "Formula-Array" qui doit correspondre une
conversion en matricielle.

En résumé (!), que dois-je ajouter à la formule suivante pour qu'elle
soit une formule matricielle dans la module de code :

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX((Import=""N° cde"")*" & _
" ROW(Import)+1),MAX((Import=""N° cde"")*COLUMN(Import)))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"


Merci pour ton aide,

JP

Bonjour J-Pascal,

Dans la fenêtre de l'éditeur de code, ta formule devrait ressembler
à ceci :

Dim F As String

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX((Import=""N° cde"")*" & _
" ROW(Import)+1),MAX((Import=""N° cde"")*COLUMN(Import)))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"


'Si tu veux copier ta formule vers une cellule d'une feuille de
calcul
Range("A5").FormulaArray = F

'Si tu veux afficher le résultat de ta formule dans la fenêtre
"Exécution" de la fenêtre VBE

Debug.Print Evaluate(F)





"j-pascal" a écrit dans le message de groupe de
discussion : Bonjour,

La formule suivante fonctionne :

{­RESSE(LIGNE(INDIRECT(ADRESSE(MAX((Import="N°
cde")*LIGNE(Import)+1);MAX((Import="N°
cde")*COLONNE(Import)))));1)&":"&ADRESSE(MAX(NON(ESTVIDE(Col_Import))*LIGNE(Col_Import));7)}





[Elle me renvoit dans le cas présent : $A$16:$G$308] (ce qui est le
bon résultat)

L'équivalent (?) en vba :

x = Range("Import").Find("N° cde", Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
y = Range("Col_Import").SpecialCells(xlCellTypeBlanks).Row

MsgBox Range(Cells(x, 1), Cells(y, 7)).Address

[Me renvoit : $A$1:$G$16] ce qui ne correspond pas au résultat
attendu.


Je ne me souviens plus comment on peut "traduire" une formule
"simple" en "matricielle", en passant pas le "debug.print" de la
fenêtre "exécution" !

Merci d'avance pour votre aide,

JP


















Avatar
isabelle
Ha! contente que tout fonctionne, bonne continution,
a+
isabelle

j-pascal a écrit :
Bonsoir Isabelle,

C'est parfait !
Merci +++

En fait, maintenant j'ai ceci :
'----------
x = Range("Import").Find("N° cde", Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

AdrPlageImport = Range(Cells(x, 1), Cells(y, 7)).Address
'----------
etc.

Je ne veux pas inscrire le résultat de la formule dans la feuille,
sinon ta formule suivante aurait été suffisante :

{­RESSE(LIGNE(INDIRECT(ADRESSE(MAX((Import="N°
cde")*LIGNE(Import)+1);MAX((Import="N°
cde")*COLONNE(Import)))));1)&":"&ADRESSE(MAX(NON(ESTVIDE(Col_Import))*LIGNE(Col_Import));7)}


En vba, c'est parfait !
En fait, c'est la petite erreur qu'il y avait dans le code pour "y"
qui m'a un peu éloigné de la solution qui finalement n'était pas bien
loin.

Initialement "y" était égale à :

y = Range("Col_Import").SpecialCells(xlCellTypeBlanks).Row

au lieu de :

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row


Comme c'était censé être la traduction en vba de la formule en
matricielle ci-dessus, je me suis dit que je devais mal appliquer la
dernière formule ...

Un (très) grand merci pour ta patience.

Je vais essayer de remettre tout ça en odre dans ma tête et dans "mon"
classeur ...

A bientôt,

JP

bonjour Jp,

voilà :
http://cjoint.com/?etkTEy15lW

dit moi si c'est mieux,

isabelle

j-pascal a écrit :
Re,

"Col_Import" est une zone nommée (qui se trouve sur ma Feuille 1) et
qui correspond à : Feuil1!$A$1:$A$1000

Import correspond à : Feuil1!$A$1:$H$1000

En fait, Import devrait suffire, mais je recherche le nombre de
valeurs maxi sur la première colonne, par sécurité ...

JP

bonjour Jp,

peut tu me reppeler à quoi correspond Col_Import et est ce que
c'est une référence glissante ?

isabelle

j-pascal a écrit :
Je guettais ta réponse ;-)

AdrPlageImport = la plage définie par :

'-----------
"­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x &
")))))" &

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"
'------------

sachant que x = Range("Import").Addresse

En fait, dans la feuille 1 de mon classeur, j'importe le contenu
d'une autre feuille (ie Feuille "toto")

Dans feuille "toto", les données sont organisées d'une façon que
j'ignore. Dans mon classeur (feuille 1), je réserve une plage
"A1:Z1000" que je nomme "Import" (cf. ton "x"). La formule
ci-dessus me renvoit la position de "N° Cde" (qui est censé être
le point "haut / gauche" de mon tableau. Cette même formule me
définie la plage que je dois copier (ayant pour référence en haut
à gauche : "N° Cde" et pour réf. en bas à droite, la colonne "G"
et le nombre de valeurs contenues dans la dite colonne.

Pour l'intant, ma zone nommée fonctionne (ce n'est pas le plus
compliqué ;-) ) et il ne me reste plus qu'à (!) mettre en pratique
la formule ci-dessus pour copier la plage.

D'où ma question :

Comment associer "The big formule" à "AdrPlageImport" ? Pour avoir :

"Range(AdrPlageImport).select" (ou copy)

Pourvu que je sois clair ...

A bientôt ?

JP


bonjour Jp,

par exemple si la variable AdrPlageImport = "B1:B10" ou
AdrPlageImport = "$B$1:$B$10"

Range(AdrPlageImport).Select
'ou
Application.GoTo Sheets("Feuil1").Range(AdrPlageImport)

si tu peut mettre le fichier en ligne, je trouverai d'autre
méthode pour alimiter la variable AdrPlageImport autre qu'une
formule matricielle

isabelle

j-pascal a écrit :
Bonjour Isabelle,

Désolé, je suis de plus en plus perdu.
Je ne devrais poser qu'une seule question à la fois ;-)

A partir de :

'----------
x = Range("Import").Addresse

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x &
")))))" &

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"

'----------

Si "AdrPlageImport" correspond à l'adresse récupérée par la
formule ci-dessus, comment dois-je compléter ce qui suit :

AdrPlageImport = [???]

pour avoir au bout du compte :

.Range(AdrPlageImport).select

En résumé, je désire sélectionner la plage définie par la
formule ci-dessus. Il est possible que je m'emmèle un peu dans
les doubles guillemets ...

@+ ?

JP

bonjour Jp,

normalement on mets =Evaluate(mafonction) et c'est tout, mais
les variables ou les plage nommée doivent être transformer sous
la forme
" & variable & " et " & Range("A1").Addresse & "
par exemple si import est une plage nommée

x = Range("Import").Addresse

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX(("& x & "=""N° cde"")*" & _
" ROW("& x & ")+1),MAX(("& x & "=""N° cde"")*COLUMN("& x &
")))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"


isabelle

j-pascal a écrit :
Bonjour,

Désolé, je ne comprends pas.
Si je copie la présente formule dans un module et que (comme
tu sembles le proposer) je saisie : Debug.Print Evaluate(F)
dans la fenêtre d'exécution, j'obtiens "Erreur 2015"

Outre ce pb, je ne souhaite pas que la dite formule soit
copiée dans une feuille. Par contre j'aimerais qu'une variable
"AdrPlageImport" (ie) recueille l'adresse en question. Le but
étant d'avoir :

.Range(AdrPlageImport).Copy

En fait, j'ai essayé de resaisir "ma" formule "simple" dans
une feuille, en lançant l'enregistreur de macro, j'ai terminé
par CTRL MAJ ENTER, puis je suis allé voir le résultat dans le
module de code. Le résultat ressemble à ta proposition à
l'exception près de 2 " & _ " qui correspondent aux retour à
la ligne.
Le pb, c'est que si la formule est copiée dans une cellule,
elle l'est sous la forme "Formula-Array" qui doit correspondre
une conversion en matricielle.

En résumé (!), que dois-je ajouter à la formule suivante pour
qu'elle soit une formule matricielle dans la module de code :

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX((Import=""N° cde"")*" & _
" ROW(Import)+1),MAX((Import=""N° cde"")*COLUMN(Import)))))"
& _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"



Merci pour ton aide,

JP

Bonjour J-Pascal,

Dans la fenêtre de l'éditeur de code, ta formule devrait
ressembler à ceci :

Dim F As String

F = "­DRESS(ROW(INDIRECT(ADDRESS(MAX((Import=""N° cde"")*" & _
" ROW(Import)+1),MAX((Import=""N°
cde"")*COLUMN(Import)))))" & _

",1)&"":""&ADDRESS(MAX(NOT(ISBLANK(Col_Import))*ROW(Col_Import)),7)"



'Si tu veux copier ta formule vers une cellule d'une feuille
de calcul
Range("A5").FormulaArray = F

'Si tu veux afficher le résultat de ta formule dans la
fenêtre "Exécution" de la fenêtre VBE

Debug.Print Evaluate(F)





"j-pascal" a écrit dans le message de
groupe de discussion :
Bonjour,

La formule suivante fonctionne :

{­RESSE(LIGNE(INDIRECT(ADRESSE(MAX((Import="N°
cde")*LIGNE(Import)+1);MAX((Import="N°
cde")*COLONNE(Import)))));1)&":"&ADRESSE(MAX(NON(ESTVIDE(Col_Import))*LIGNE(Col_Import));7)}






[Elle me renvoit dans le cas présent : $A$16:$G$308] (ce qui
est le bon résultat)

L'équivalent (?) en vba :

x = Range("Import").Find("N° cde", Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
y = Range("Col_Import").SpecialCells(xlCellTypeBlanks).Row

MsgBox Range(Cells(x, 1), Cells(y, 7)).Address

[Me renvoit : $A$1:$G$16] ce qui ne correspond pas au
résultat attendu.


Je ne me souviens plus comment on peut "traduire" une formule
"simple" en "matricielle", en passant pas le "debug.print" de
la fenêtre "exécution" !

Merci d'avance pour votre aide,

JP






















1 2