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

10 réponses

1 2
Avatar
Francis SLAWNY
Ctrl Shift Entrer


"j-pascal" a écrit dans le message de news:

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
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
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
ps/ il y a des commandes vba bien plus simple pour retrouver cette
adresse que d'utiliser une formule matricielle,

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
ps /
pour l'adresse d'une plage nommée remplacer:
x = Range("Import").Addresse
par
x = Names("Import").RefersTo

isabelle

isabelle a écrit :
ps/ il y a des commandes vba bien plus simple pour retrouver cette
adresse que d'utiliser une formule matricielle,

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