VBA - Bug lors de la duplication d'une feuille avec formule matricielle
13 réponses
Iznogood1
Bonjour,
Exemple simpliste =E0 fin d'illustration :
Soit la formule matricielle =3D{SOMME(INDEX({1\2;4\5};0;{1\2}))}
sur 2 cellules adjacentes (valid=E9e par shift + entr=E9e)
qui renvoie la somme de chaque colonne, soit la matrice {5\7}
(1+4 =3D 5 et 2+5 =3D7).
Quand je duplique la feuille manuellement, tout est OK.
Si je la duplique par VBA (ActiveSheet.Copy After:=3DActiveSheet)
la formule n'est pas "calcul=E9e/mise =E0 jour" et renvoie {3\3} !
Voir la d=E9mo ci-jointe http://cjoint.com/?EABpczObRmH
sur excel 2010, j’obtiens le même résultat que toi, ça m'a l'air d'un un bug d'XL
isabelle
Le 2015-01-27 08:53, Iznogood1 a écrit :
Bonjour,
Exemple simpliste à fin d'illustration :
Soit la formule matricielle ={SOMME(INDEX({12;45};0;{12}))} sur 2 cellules adjacentes (validée par shift + entrée) qui renvoie la somme de chaque colonne, soit la matrice {57} (1+4 = 5 et 2+5 =7).
Quand je duplique la feuille manuellement, tout est OK. Si je la duplique par VBA (ActiveSheet.Copy After:¬tiveSheet) la formule n'est pas "calculée/mise à jour" et renvoie {33} !
sur excel 2010, j’obtiens le même résultat que toi,
ça m'a l'air d'un un bug d'XL
isabelle
Le 2015-01-27 08:53, Iznogood1 a écrit :
Bonjour,
Exemple simpliste à fin d'illustration :
Soit la formule matricielle ={SOMME(INDEX({12;45};0;{12}))}
sur 2 cellules adjacentes (validée par shift + entrée)
qui renvoie la somme de chaque colonne, soit la matrice {57}
(1+4 = 5 et 2+5 =7).
Quand je duplique la feuille manuellement, tout est OK.
Si je la duplique par VBA (ActiveSheet.Copy After:¬tiveSheet)
la formule n'est pas "calculée/mise à jour" et renvoie {33} !
Voir la démo ci-jointe http://cjoint.com/?EABpczObRmH
sur excel 2010, j’obtiens le même résultat que toi, ça m'a l'air d'un un bug d'XL
isabelle
Le 2015-01-27 08:53, Iznogood1 a écrit :
Bonjour,
Exemple simpliste à fin d'illustration :
Soit la formule matricielle ={SOMME(INDEX({12;45};0;{12}))} sur 2 cellules adjacentes (validée par shift + entrée) qui renvoie la somme de chaque colonne, soit la matrice {57} (1+4 = 5 et 2+5 =7).
Quand je duplique la feuille manuellement, tout est OK. Si je la duplique par VBA (ActiveSheet.Copy After:¬tiveSheet) la formule n'est pas "calculée/mise à jour" et renvoie {33} !
Je crois que la méthode "Calculate" ne s'applique pas, car la formule ne contient que des constantes, elle ne fait pas référence à une ou des plages de cellules.
Même après que la feuille est copiée, la commande par exemple : Range("A1").Calculate ne fonctionne pas!
Merci Isabelle.
Je crois que la méthode "Calculate" ne s'applique pas, car la formule ne
contient que des constantes, elle ne fait pas référence à une ou des plages
de cellules.
Même après que la feuille est copiée, la commande par exemple :
Range("A1").Calculate ne fonctionne pas!
Je crois que la méthode "Calculate" ne s'applique pas, car la formule ne contient que des constantes, elle ne fait pas référence à une ou des plages de cellules.
Même après que la feuille est copiée, la commande par exemple : Range("A1").Calculate ne fonctionne pas!
Iznogood1
Non seulement ActiveSheet.Calculate ou Application.CalculateFull ne fonctionne pas, mais provoque des résultats bizarre (matrice originale modifiée).
Pourtant Application.CalculateFull est le code retourné par l'enregistreu r de macro quand on fait CTRL+ALT+F9.
C'est vraiment surprenant.
Non seulement ActiveSheet.Calculate ou Application.CalculateFull
ne fonctionne pas, mais provoque des résultats bizarre (matrice originale modifiée).
Pourtant Application.CalculateFull est le code retourné par l'enregistreu r de macro quand on fait CTRL+ALT+F9.
--- L'absence de virus dans ce courrier electronique a ete verifiee par le logiciel antivirus Avast. http://www.avast.com
MichD
Les 2 formules matricielles sont dans une "plage matricielle" c'est-à-dire que l'on ne peut pas modifier le contenu d'une des cellules de la matrice A1:B1
Suppose par exemple que tu veuilles évaluer leur formule en vba, '------------------------------------------- Dim C As Range For Each C In Range("A1:b1") If C.HasArray Then 'Si la formule est matricielle x = Evaluate(C.FormulaArray) End If Next End Sub '-------------------------------------------
Dans la feuille de calcul, les cellules affichent 5 et 7. En VBA, le résultat de chacune des formules est évalué individuellement et retourne dans les 2 cas 5.
Un autre exemple suppose qu'en VBA tu veux recopier ces formules dans une autre plage de cellules '------------------------------------------- Sub test() Dim F As String F = Range("A1").FormulaArray Range("A3:B3").FormulaArray = F End Sub '-------------------------------------------
A3:B3 a les mêmes formules matricielles que la plage "A1:B1" et pourtant les 2 cellules affichent comme résultat 3 exactement après avoir fait une copie de la feuille dans le même classeur.
Lorsque les formules renferment des plages de cellules au lieu de constantes, les formules sont calculées correctement.
On peut en "conclure" que la commande "raccourci clavier" utilise un autre paradigme lorsqu'il s'agit de faire l'évaluation des formules contenues dans la feuille. Les créateurs (programmeurs) de la feuille et du code VBA ne sont pas les mêmes et je suppose qu'ils répondent à des prérogatives propres à leur environnement et qu'il y a des différences...
Les 2 formules matricielles sont dans une "plage matricielle" c'est-à-dire
que l'on ne peut pas modifier le contenu d'une des cellules de la matrice
A1:B1
Suppose par exemple que tu veuilles évaluer leur formule en vba,
'-------------------------------------------
Dim C As Range
For Each C In Range("A1:b1")
If C.HasArray Then 'Si la formule est matricielle
x = Evaluate(C.FormulaArray)
End If
Next
End Sub
'-------------------------------------------
Dans la feuille de calcul, les cellules affichent 5 et 7.
En VBA, le résultat de chacune des formules est évalué individuellement et
retourne dans les 2 cas 5.
Un autre exemple suppose qu'en VBA tu veux recopier ces formules dans une
autre plage de cellules
'-------------------------------------------
Sub test()
Dim F As String
F = Range("A1").FormulaArray
Range("A3:B3").FormulaArray = F
End Sub
'-------------------------------------------
A3:B3 a les mêmes formules matricielles que la plage "A1:B1" et pourtant les
2 cellules affichent comme résultat 3 exactement après avoir fait une copie
de la feuille dans le même classeur.
Lorsque les formules renferment des plages de cellules au lieu de
constantes, les formules sont calculées correctement.
On peut en "conclure" que la commande "raccourci clavier" utilise un autre
paradigme lorsqu'il s'agit de faire l'évaluation des formules contenues dans
la feuille. Les créateurs (programmeurs) de la feuille et du code VBA ne
sont pas les mêmes et je suppose qu'ils répondent à des prérogatives propres
à leur environnement et qu'il y a des différences...
Les 2 formules matricielles sont dans une "plage matricielle" c'est-à-dire que l'on ne peut pas modifier le contenu d'une des cellules de la matrice A1:B1
Suppose par exemple que tu veuilles évaluer leur formule en vba, '------------------------------------------- Dim C As Range For Each C In Range("A1:b1") If C.HasArray Then 'Si la formule est matricielle x = Evaluate(C.FormulaArray) End If Next End Sub '-------------------------------------------
Dans la feuille de calcul, les cellules affichent 5 et 7. En VBA, le résultat de chacune des formules est évalué individuellement et retourne dans les 2 cas 5.
Un autre exemple suppose qu'en VBA tu veux recopier ces formules dans une autre plage de cellules '------------------------------------------- Sub test() Dim F As String F = Range("A1").FormulaArray Range("A3:B3").FormulaArray = F End Sub '-------------------------------------------
A3:B3 a les mêmes formules matricielles que la plage "A1:B1" et pourtant les 2 cellules affichent comme résultat 3 exactement après avoir fait une copie de la feuille dans le même classeur.
Lorsque les formules renferment des plages de cellules au lieu de constantes, les formules sont calculées correctement.
On peut en "conclure" que la commande "raccourci clavier" utilise un autre paradigme lorsqu'il s'agit de faire l'évaluation des formules contenues dans la feuille. Les créateurs (programmeurs) de la feuille et du code VBA ne sont pas les mêmes et je suppose qu'ils répondent à des prérogatives propres à leur environnement et qu'il y a des différences...