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

Génération en VBA de plages matricielles (ou TABLE()) - bis

5 réponses
Avatar
Pascal Engelmajer
Salut à tous,
J'ai déjà évoqué ce problème... une solution voire une idée de me rendrait
un grand service
j'ai une série de fichiers texte contenant les éléments de la plage
matricielle à créer, plage dont la dimension varie du simple au décuple de 5
lignes x 5 colonnes à 80 lignes x 20 colonnes.
ex.
"A2:A6";"B1:B4";"=A2:A6*B1:B4"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"
Ce qui doit donner une table de Pythagore 1x1, 1x2, ..., 5x4.
Pas de pb pour les entêtes de lignes et de colonnes FormulaArray mais
impossible d'activer le mode matriciel
Voici le test qui confirme mes soucis :
Sub copie()
Dim cell As Range
For Each cell In Sheets(1).UsedRange
ad = cell.Address
if cell.HasArray then Sheets(2).Range(ad).FormulaArray =
cell.FormulaArray
Next cell
End Sub
Cette procédure est simple. Elle montre que la copie de la plage matricielle
ne donne pas le résultat escompté...
et la fonction matricielle TABLE() provoque la célèbre erreur 1004...
Comment résoudre ce problème qui m'interdit cette façon simple de générer
des tables.
Merci
---
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel

5 réponses

Avatar
FxM
Bonjour Pascal,

Puisqu'il en faut en qui dise une bêtise, je me dévoue :o)

Une erreur de recopie dans le nom des feuilles [sheets(2) vs
sheets(1)] ? Ou comment Excel devine que le résultat en sheets(2) est
du aux données de sheets(1) ?

@+
FxM




Pascal Engelmajer wrote:
Salut à tous,
J'ai déjà évoqué ce problème... une solution voire une idée de me rendrait
un grand service
j'ai une série de fichiers texte contenant les éléments de la plage
matricielle à créer, plage dont la dimension varie du simple au décuple de 5
lignes x 5 colonnes à 80 lignes x 20 colonnes.
ex.
"A2:A6";"B1:B4";"¢:A6*B1:B4"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"
Ce qui doit donner une table de Pythagore 1x1, 1x2, ..., 5x4.
Pas de pb pour les entêtes de lignes et de colonnes FormulaArray mais
impossible d'activer le mode matriciel
Voici le test qui confirme mes soucis :
Sub copie()
Dim cell As Range
For Each cell In Sheets(1).UsedRange
ad = cell.Address
if cell.HasArray then Sheets(2).Range(ad).FormulaArray > cell.FormulaArray
Next cell
End Sub
Cette procédure est simple. Elle montre que la copie de la plage matricielle
ne donne pas le résultat escompté...
et la fonction matricielle TABLE() provoque la célèbre erreur 1004...
Comment résoudre ce problème qui m'interdit cette façon simple de générer
des tables.
Merci
---
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel




Avatar
Daniel.M
Salut Pascal,

Je ne comprends pas ton problème. :-(

Si tu veux comme résultat un tableau de 5lignes * 4colonnes, pourquoi
n'aurais-tu pas

"A2:A6";"B1:E1";"¢:A6*B1:E1"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"

Tu mets 1...5 en A2:A6 et 1...4 en B1:E1 (tu as déjà indiqué que ça, tu savais
faire)

Ensuite, en Range("B2").Resize(nLignes,nCol).FormulaArray = "¢:A6*B1:E1"

Si tu désires conserver B1:B4 (au lieu de B1:E1), il te faudra insérer un
TRANSPOSE() dans ta formule ==> "A2:A6*TRANSPOSE(B1:B4)"

Mais je n'ai probablement pas compris. :-) Si c'est le cas, indique le résultat
désiré en B2:E6.

Salutations,

Daniel M.

"Pascal Engelmajer" wrote in message
news:
Salut à tous,
J'ai déjà évoqué ce problème... une solution voire une idée de me rendrait
un grand service
j'ai une série de fichiers texte contenant les éléments de la plage
matricielle à créer, plage dont la dimension varie du simple au décuple de 5
lignes x 5 colonnes à 80 lignes x 20 colonnes.
ex.
"A2:A6";"B1:B4";"¢:A6*B1:B4"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"
Ce qui doit donner une table de Pythagore 1x1, 1x2, ..., 5x4.
Pas de pb pour les entêtes de lignes et de colonnes FormulaArray mais
impossible d'activer le mode matriciel
Voici le test qui confirme mes soucis :
Sub copie()
Dim cell As Range
For Each cell In Sheets(1).UsedRange
ad = cell.Address
if cell.HasArray then Sheets(2).Range(ad).FormulaArray > cell.FormulaArray
Next cell
End Sub
Cette procédure est simple. Elle montre que la copie de la plage matricielle
ne donne pas le résultat escompté...
et la fonction matricielle TABLE() provoque la célèbre erreur 1004...
Comment résoudre ce problème qui m'interdit cette façon simple de générer
des tables.
Merci
---
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel




Avatar
Pascal Engelmajer
Salut Daniel,
Merci beaucoup
Je ne comprends pas ton problème. :-(
peut-être, mais tu me fournis une solution.

en fait c'est le resize qui me manquait
voici ma procédure de test.
Option Explicit
Sub test()
Dim cell As Range
Dim f As String
Dim ad As String
Dim noLigD As Integer
Dim noLigF As Integer
Dim nocolD As Integer
Dim noColF As Integer
Dim flD As Boolean
For Each cell In Sheets(1).UsedRange
ad = cell.Address
If cell.HasArray Then
f = cell.FormulaArray
If Not flD Then
flD = True
noLigD = cell.Row
nocolD = cell.Column
Else
noLigF = cell.Row
noColF = cell.Column
End If
Else
Sheets(2).Range(ad).Value = cell.Value
End If
Next cell
Debug.Print noLigD & " " & noLigF & " " & nocolD & " " & noColF & " "
Sheets(2).Range("B2").Resize(noLigF - noLigD + 1, noColF - nocolD +
1).FormulaArray = f '"¢:A6*B1:F1"
End Sub
mais cela ne marche toujours pas pour {=TABLE(A7:A8)}

--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
"Daniel.M" a écrit dans le message de
news:
Salut Pascal,

Je ne comprends pas ton problème. :-(

Si tu veux comme résultat un tableau de 5lignes * 4colonnes, pourquoi
n'aurais-tu pas

"A2:A6";"B1:E1";"¢:A6*B1:E1"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"

Tu mets 1...5 en A2:A6 et 1...4 en B1:E1 (tu as déjà indiqué que ça, tu
savais

faire)

Ensuite, en Range("B2").Resize(nLignes,nCol).FormulaArray = "¢:A6*B1:E1"

Si tu désires conserver B1:B4 (au lieu de B1:E1), il te faudra insérer un
TRANSPOSE() dans ta formule ==> "A2:A6*TRANSPOSE(B1:B4)"

Mais je n'ai probablement pas compris. :-) Si c'est le cas, indique le
résultat

désiré en B2:E6.

Salutations,

Daniel M.

"Pascal Engelmajer" wrote in message
news:
Salut à tous,
J'ai déjà évoqué ce problème... une solution voire une idée de me
rendrait


un grand service
j'ai une série de fichiers texte contenant les éléments de la plage
matricielle à créer, plage dont la dimension varie du simple au décuple
de 5


lignes x 5 colonnes à 80 lignes x 20 colonnes.
ex.
"A2:A6";"B1:B4";"¢:A6*B1:B4"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"
Ce qui doit donner une table de Pythagore 1x1, 1x2, ..., 5x4.
Pas de pb pour les entêtes de lignes et de colonnes FormulaArray mais
impossible d'activer le mode matriciel
Voici le test qui confirme mes soucis :
Sub copie()
Dim cell As Range
For Each cell In Sheets(1).UsedRange
ad = cell.Address
if cell.HasArray then Sheets(2).Range(ad).FormulaArray > > cell.FormulaArray
Next cell
End Sub
Cette procédure est simple. Elle montre que la copie de la plage
matricielle


ne donne pas le résultat escompté...
et la fonction matricielle TABLE() provoque la célèbre erreur 1004...
Comment résoudre ce problème qui m'interdit cette façon simple de
générer


des tables.
Merci
---
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel








Avatar
Daniel.M
Pascal,

mais cela ne marche toujours pas pour {=TABLE(A7:A8)}



En effet car Excel ne la comprend pas comme une _vraie_ formule (une limitation
du logiciel).

Tu devras peut-être changer ton input pour indiquer qu'il s'agit d'une TABLE.
Par exemple, en rajoutant un terme sur la première ligne. Tu noteras que la
formule (j'ai mis =G1*H1 mais ça pourrait être quelquechose de plus compliqué,
et ça pourrait être d'autres cellules que G1, H1) retourne désormais un
scalaire, i.e. UNE valeur:

"A2:A6";"B1:B4";"=G1*H1";"TABLE"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"

Ton code vérifierait la présence du mot TABLE dans le dernier terme de la 1ère
ligne, auquel cas on fixe la valeur d'un flag IsTable à VRAI


Au lieu de :
Sheets(2).Range("B2").Resize(noLigF - noLigD + 1, noColF - nocolD +
1).FormulaArray = f '"¢:A6*B1:F1"

Tu aurais maintenant:

If IsTable then
Sheets(2).Range("B2")(0,0).Formula = f
Sheets(2).Range("B2")(0,0).Resize(noLigF-noLigD+2, noColF-nColD+2) _
.Table Range("G1"), Range("H1")
' note les +2 puisqu'on inclue 1 li et 1 col supplémentaire
' Table avec l'instruction
Else
Sheets(2).Range("B2").Resize(noLigF - noLigD + 1, _
noColF - nocolD + 1).FormulaArray = f
Endif

Bon, c'est pas très élégant mais à défaut d'avoir une vrai fonction TABLE
copiable, il faut invoquer la commande comme tel si tu veux conserver cette
fonctionnalité (sinon la copie bête des valeurs peut toujours être réalisée).

Salutations,

Daniel M.

Avatar
Pascal Engelmajer
Salut Daniel,
Merci beaucoup
Dès que j'ai un moment j'essaie d'adapter ma procédure (création à partir
d'un fichier texte)
--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
"Daniel.M" a écrit dans le message de
news: #
Pascal,

mais cela ne marche toujours pas pour {=TABLE(A7:A8)}



En effet car Excel ne la comprend pas comme une _vraie_ formule (une
limitation

du logiciel).

Tu devras peut-être changer ton input pour indiquer qu'il s'agit d'une
TABLE.

Par exemple, en rajoutant un terme sur la première ligne. Tu noteras que
la

formule (j'ai mis =G1*H1 mais ça pourrait être quelquechose de plus
compliqué,

et ça pourrait être d'autres cellules que G1, H1) retourne désormais un
scalaire, i.e. UNE valeur:

"A2:A6";"B1:B4";"=G1*H1";"TABLE"
"1";"2";"3";"4";"5"
"1";"2";"3";"4"

Ton code vérifierait la présence du mot TABLE dans le dernier terme de la
1ère

ligne, auquel cas on fixe la valeur d'un flag IsTable à VRAI


Au lieu de :
Sheets(2).Range("B2").Resize(noLigF - noLigD + 1, noColF - nocolD +
1).FormulaArray = f '"¢:A6*B1:F1"

Tu aurais maintenant:

If IsTable then
Sheets(2).Range("B2")(0,0).Formula = f
Sheets(2).Range("B2")(0,0).Resize(noLigF-noLigD+2, noColF-nColD+2) _
.Table Range("G1"), Range("H1")
' note les +2 puisqu'on inclue 1 li et 1 col supplémentaire
' Table avec l'instruction
Else
Sheets(2).Range("B2").Resize(noLigF - noLigD + 1, _
noColF - nocolD + 1).FormulaArray = f
Endif

Bon, c'est pas très élégant mais à défaut d'avoir une vrai fonction TABLE
copiable, il faut invoquer la commande comme tel si tu veux conserver
cette

fonctionnalité (sinon la copie bête des valeurs peut toujours être
réalisée).


Salutations,

Daniel M.