Problème avc la fonction "EVALUATE"

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je progresse ! Maintenant, c'est du sérieux, je me lance dans le monde incommensurable d'"EVALUATE" et je sens que plus rien ne sera jamais pareil !
En attendant, plantages lamentables...

Pas toujours évident cette fonction, mais elle permet de résoudre des choses difficiles ou impossibles à résoudre sans elle et aussi de raccourcir singulièrement certaines procédures. Les capacités de cette fonction se lisent comme une proustitude ! Un seul problème, d'après ce que j'ai pu glaner à droite et à gauche, ce n'est pas une fonction qui s'exécute très rapidement (voir, à ce sujet ici : Evaluate - Most Powerful Command in VBA?).

Mon problème est simple.

J'ai une plage de chiffres qui va de A1 à A20.
Je veux faire (en VBA bien sûr) la somme de tous les chiffres de cette plage, et j'écris :
Dim x as Double
x = [Sum(A1:A20)] --> ça marche !

Je nomme maintenant la plage (A1:A20) "Lola", et j'écris :
Dim x as Double
x = [Sum(lola)] --> ça marche !

En fait, cette plage se trouve immédiatement à droite d'un tableau qui se nomme "TableauCF1".
Plutôt que de nommer la plage "A1:A20" "Lola" (au bout d'un moment on finit par avoir un nombre incensé de plages nommées...), comme, pour différentes raisons je suis un peu obligé de nommer néanmoins quelques plages dont le tableau "TableauCF1", je localise la plage "A1:A20" ainsi :
Dim plage as Range
Set plage = [TableauCF1].Offset(, 1) --> ça marche !

J'ai essayé :
x = [Sum(plage)] --> ça ne marche pas !
x = [Sum([plage])] --> ça ne marche pas !
x = Evaluate("Sum(plage)") --> ça ne marche pas !
x = Evaluate("Sum([plage])") --> ça ne marche pas !

Oui, au bout d'un moment on essaie n'importe quoi...

Merci à celui qui connaîtra le moyen de résoudre cette énigme.
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Problème avc la fonction "EVALUATE"

Bonsoir,

Evaluate évalue une expression tableur
Il ne faut pas confondre un nom de champ tableur et un range VBA

Code:
Sub essai()
  plage = "a1:a" & [A65000].End(xlUp).Row
  x = Evaluate("sum(" & plage & ")")
  MsgBox x
End Sub

Champ à droite du champ nommé toto

Code:
Sub essai()
  x = [sum(offset(toto,,1))]
  MsgBox x
End Sub
Evaluate

JB
 
Dernière édition:

Herdet

Nous a quitté
Repose en paix
Re : Problème avc la fonction "EVALUATE"

Bonsoir,
EVALUATE...et son super raccourci [...],... une fameuse et puissante fonction bien méconnue depuis l'existance d'excel
Tu connais peut être Rechercher | www.excelabo.net
Alain Vallon est un excellent spécialiste dans les EVALUATE et le classeur ci-joint, et donnera un vrai aperçu.

Il y a sûrement une actualisation de son classeur av-Evaluate-v7.xls
Je regarde aussi ton problème, si je peux le comprendre.

Cordialement
Robert
 

Pièces jointes

  • av-Evaluate-v7.zip
    893.8 KB · Affichages: 99

Magic_Doctor

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

Bonsoir BOISGONTIER, job,

Merci pour vos réponses.

En attendant, j'ai trouvé (en relisant le lien que j'ai mis dans mon précédent post) :
x = Application.Sum(plage)

Et ça a l'air de très bien marcher.

Ta solution marche aussi très bien job.
 

Herdet

Nous a quitté
Repose en paix
Re : Problème avc la fonction "EVALUATE"

Rebonjour Magic_Doctor,
Evaluate et les variables VBA ne font pas bon ménage !
Perso je me contenterais de x = [SUM(OFFSET(TableauCF1,,1))]
A+
Bonsoir,
Etant un peu de ton avis sur les mélanges entre Evaluate et les variables VBA, en général, j'hésite à utiliser ces raccourcis.
Dans quelle mesure peut on parler avec Microsoft de pérennité si l'on utilise cette fonction tableur ?

Robert
 

Staple1600

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

Bonsoir à tous

VB:
Sub a()
' en B1:B10: nombres de 1 à 20 (donc la somme de B1:B10 vaut 210)
Dim x, y
Dim p As Range: Set p = [A1:A20]: p.Name = "TableauCF1"
Dim pp As Range: Set pp = [TableauCF1].Offset(, 1): pp.Name = "plage"
'les tests fonctionnent tous sur mon PC
MsgBox [=SUM(plage)] 'affiche 210
x = [=SUM(plage)]
MsgBox x * 2 ' affiche 420
y = [=AVERAGE(plage)]
MsgBox y ' affiche 10,5
End Sub
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Problème avc la fonction "EVALUATE"


>Evaluate et les variables VBA ne font pas bon ménage !


Faux! il faut que le résultat de la chaîne à évaluer soit une expression tableur valide

Il ne faut pas confondre un nom de champ tableur et un range VBA

jb
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

Rebonsoir tout le monde,

Herdet, nos posts se sont croisés, mais je te remercie infiniment pour cette mine de documentation. Je sens (eh eh) que je vais en avoir pour un moment !
Stapple1600, j'ai essayé ta routine. Il y a une somme et, je pense, une moyenne. Je n'ai pas bien compris les résultats.

J'ai fini par opter pour le bref :

Sub SommePlage()

Dim plage As Range, x As Double

Set plage = [TableauCF1].Offset(, 1): x = Application.Sum(plage)

'x = [SUM(OFFSET(TableauCF1,,1))] 'solution de job qui marche aussi très bien

End Sub

Ma foi, ça marche !

PS : si l'un d'entre vous pouvait avoir la gentillesse de m'expliquer comment on fait pour bien présenter dans ses posts les fragments de macro et autres réflexions pertinentes de l'un de ses pairs (et non pas à ma manière pithécanthropienne), ce serait vachement sympa !
 

Magic_Doctor

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

Je me rétracte !

Maintenant gros bordel !

Je comprends mieux les résultats "bizarres" que donnait la solution d'Herdet.

Il y a encore un moment (j'étais content, serein et de bonne humeur...) la somme était juste (en l'occurrence 31), mais maintenant j'obtiens un chiffre des plus invraisemblables (avec ma solution ou celle de job), à savoir : 41313

Avec Excel les trucs les plus simples peuvent prendre des proportions déconcertantes !
 

Magic_Doctor

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

Je commence par le comprendre BOISGONTIER, même si ce n'est pas encore tout à fait clair dans mon esprit.
Mais la solution à mon problème reste toujours en suspens...
Pourtant c'est curieux qu'à un moment donné le résultat était bon.
 

Si...

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

salut

Si... tu tiens à Evaluate, tu peux essayer (n'est-ce pas JB ;) ?)
Code:
Sub SommePlage()
  Dim plage As Range, x As Double
  Set plage = [TableauCF1].Offset(, 1): x = Evaluate("=Sum(plage)")
  MsgBox x
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Problème avc la fonction "EVALUATE"

Re, Bonsoir Si...

Rebonsoir tout le monde,
PS : si l'un d'entre vous pouvait avoir la gentillesse de m'expliquer comment on fait pour bien présenter dans ses posts les fragments de macro et autres réflexions pertinentes de l'un de ses pairs (et non pas à ma manière pithécanthropienne), ce serait vachement sympa !

Il suffit pour cela d'utiliser la balise BBCODE suivante: [NOPARSE]
Code:
[/NOPARSE]Copier ici le code VBA[NOPARSE]
[/NOPARSE]

Tu peux aussi celle que j'évoque dans ma signature.

EDITION: grâce à l'intervention de Si..., je suis retourné dans VBE pour simplifier
Code:
Sub ab()
' en B1:B10: nombres de 1 à 20 (donc la somme de B1:B10 vaut 210)
Dim x, y, p As Range: Set p = [A1:A20]: p.Name = "TableauCF1"
Set plage = [TableauCF1].Offset(, 1): MsgBox [=SUM(plage)] 'affiche 210
x = [=SUM(plage)]: MsgBox x * 2 ' affiche 420
y = [=AVERAGE(plage)]: MsgBox y ' affiche 10,5
End Sub

PS: Magic_Doctor: le code ci-dessus et celui de mon premier message ne sont là qu'à titre illustratif.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 331
Messages
2 087 356
Membres
103 528
dernier inscrit
hplus