[Résolu] dépasser/contourner la limite de 1 octet de Application.evaluate

Benamou39

XLDnaute Nouveau
Bonjour à tous,

Dans le cadre d'un programme qui me permet de tester la présence de chaines de caractères dans d'autres chaines de caractères, je réalise un calcul (du type : (1)*(1)+(1*0)+...) avec un résultat binaire (Oui / non : 1 / 0) via la fonction "Application.Evaluate".

Cela marche très bien, sauf qu'il y a une limite à cette fonction :
lorsque la chaîne de caractère à tester est trop importante (1 octet, 255 caractères 1 ou 0) la fonction ne fonctionne plus, et un message d'erreur apparaît en résultat.

Ayant fait des recherches / exécuté des tests je n'ai pas réussi à trouver de solution optimale
Seul solution à mon Pb pour le moment il est possible de mettre le résultat sous forme (1)*(1)+(1)*(0)... dans une cellule, puis cliquer/entrer et ça fonctionne.

Auriez-vous une solution à mon problème SVP ?

Merci à la communauté par avance,

Benamou
 
Dernière édition:

mutzik

XLDnaute Barbatruc
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

bonjour,

1. si tu nous epliquais le problème de fond, nous aurions éventuellement une autre solution
2. ensuite un fichier joint avec un exemple nous y aiderait beaucoup plus

en attente ...
 

job75

XLDnaute Barbatruc
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Bonjour Benamou39, mutzik,

Effectivement la chaine dans Evaluate ne peut dépasser 255 caractères :

Code:
Sub test1()
Dim n, a, i
n = 16
ReDim a(1 To n)
For i = 1 To n - 1
a(i) = "(1)*(1)+(1)*(0)"
Next
a(n) = "(1)*(1)+(1)*(0)" '"(1)*(1)+(1)*(00)" 'à tester
t = Join(a, "+")
MsgBox Len(t)
MsgBox Evaluate(t)
End Sub
Pas d'autre solution que d'évaluer au fur et à mesure :

Code:
Sub test2()
Dim n, i, s
n = 1000
For i = 1 To n
s = s + Evaluate("(1)*(1)+(1)*(0)")
Next
MsgBox s
End Sub
A+
 

job75

XLDnaute Barbatruc
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Re,

Avec ExecuteExcel4Macro la limite est 254 caractères :

Code:
Sub test3()
Dim n, a, i
n = 16
ReDim a(1 To n)
For i = 1 To n - 1
a(i) = "(1)*(1)+(1)*(0)"
Next
a(n) = "(1)*(1)+(1)*00" '"(1)*(1)+(1)*000" 'à tester
t = Join(a, "+")
MsgBox Len(t)
MsgBox ExecuteExcel4Macro(t)
End Sub
A+
 

Benamou39

XLDnaute Nouveau
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Bonjour Mutzik, Job75 fidèle au poste !

Mon problème de fond est :
Vérifier si une combinatoire logique composée de caractères et des éléments OU, ET, FACTEUR, SAUF,
est présente dans une chaîne de caractères.
lien : https://www.excel-downloads.com/threads/resolu-tester-une-combinatoire-logique.223290/) tout est dit dedans avec les fichiers qui vont biens.

La solution fournie par Mapomme (voir édit #15, fonction OUI_NON) à l'époque et que j'utilise actuellement m'a semblé vraiment super ! et je ne vois pas d'autre solution à l'instant"t".
Peut-être en existe-t-il une autre ...?

J'ai depuis concaténé un certain nombre d'opérations nécessaires, dont l'ajout du zéro hier soir, dernier en date, encore merci Job :)
(d'ailleurs j'ai vu que depuis des améliorations sont possibles via cette discussion "ajout 0", notamment pour gagner en rapidité, chose que j'effectuerai dans une seconde partie après avoir trouvé une solution définitive robuste)

Je vous joins un fichier avec un exemple concret de #valeur en comparaison des exemples qui eux fonctionnent pour plus de clarté.
/!\ en faisant la manip sur ce fichier je m'aperçois à l'instant que ce n'est peut-être pas lié uniquement au nombre de caractères de la fonction evaluate, potentiellement à ses paramètres....et même pire, peut-être aux autres fonctions....

En vous souhaitant bonne réception,

Benamou
 

Pièces jointes

  • Benamou39 -combinatoire-logique v2 (1).xlsm
    23.8 KB · Affichages: 39

job75

XLDnaute Barbatruc
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Bonsoir Benamou39,

Comme je l'ai dit au post #3 il faut évaluer t au fur et à mesure :

Code:
'évaluer t
'res = Application.Evaluate(t) 't est limité à 255 caractères...
a = Split(t, "+")
For i = 0 To UBound(a)
  res = res + Evaluate(a(i))
Next
If res >= 1 Then Oui_Non = "oui" Else If res = 0 Then Oui_Non = "non" Else Oui_Non = "???"
Fichier joint.

Edit : pour connaître le nombre de caractères de t c'est facile.

Dans la fonction, avant le code précédent, insérez :

Code:
Oui_Non = Len(t): Exit Function
En G30 on a 252, en G33 on a 256.

Bonne fin de soirée et A+
 

Pièces jointes

  • Benamou39 -combinatoire-logique(1).xlsm
    23.7 KB · Affichages: 35
Dernière édition:

Benamou39

XLDnaute Nouveau
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Bonjour Job, Muzic,

Ton code fonctionne dans l'exemple du fichier, cependant, il ne fonctionne plus lorsque j'intègre d'autres opérations du type "sauf" et "facteur"....
en effet le découpage ne peut s'effectuer sur les "+" si on intègre ces 2 autres opérateurs (ça fonctionne bien avec uniquement avec des + et des *)

L'idée qui consiste à développer lorsqu'il y à des facteurs se heurte au sauf à mon sens... et cela semble impossible de développer et passer via ta fonction d'évaluation au fur et à mesure...

Ci-dessous un exemple qui ne fonctionne pas avec application.evaluate (facteur au 5ème caractère):

=(1)*((0)*(0)*(0)*(0)+(0)*(0)*(0)*(1)+(0)*(0)*(0)*(0)+(0)*(0)*(0)*(1)+(0)*(1)*(0)*(0)+(0)*(1)*(0)*(1)+(0)*(0)*(0)*(0)+(0)*(0)*(0)*(1)+(0)*(0)*(0)*(0)+(0)*(0)*(0)*(1)+(0)*(1)*(0)*(0)+(0)*(1)*(0)*(1)+(1)*(0)*(0)*(0)+(1)*(0)*(0)*(1)+(1)*(0)*(0)*(0)+(1)*(0)*(0)*(1)+(1)*(1)*(0)*(0)+(1)*(1)*(0)*(1)+(0)*(0)*(0)*(0)+(0)*(0)*(0)*(1)+(0)*(0)*(0)*(0)+(0)*(0)*(0)*(1)+(0)*(1)*(0)*(0)+(0)*(1)*(0)*(1))

Sinon ces cas représentent 5%, et j'arrive via un collage spé/clic/entrée sur la cellule à gérer.
je pourrais en guise de solution temporaire, retourner la chaîne (composée des 0,1 parenthèses, + et *) dans la cellule en cas d'erreur de application.evaluate STP ?

un peu du type :
if(esterreur(application.evaluate(t));t;application.evaluate))

Merci par avance et bonne soirée,
 

job75

XLDnaute Barbatruc
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Bonsoir Benamou39,

Bien sûr avec des parenthèses imbriquées on peut aller très loin...

Inutile donc dans ce cas de se casser la tête, il suffit de faire faire l'évaluation par une cellule.

A+
 

job75

XLDnaute Barbatruc
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Re,

Ce n'est pas possible dans une fonction VBA, il faut passer par une procédure Sub.

Dans laquelle on introduira après le calcul de t :

Code:
Dim f$
f = [A1].Formula: [A1] = "=" & t: res = [A1]: [A1] = f

A+
 

Benamou39

XLDnaute Nouveau
Re : dépasser/contourner la limite de 1 octet de Application.evaluate

Re,

Ce n'est pas possible dans une fonction VBA, il faut passer par une procédure Sub.

Dans laquelle on introduira après le calcul de t :

Code:
Dim f$
f = [A1].Formula: [A1] = "=" & t: res = [A1]: [A1] = f

A+

Dans la vie y'a deux types de mecs, les novices et les autres.
Moi je fais partie des novices....

Je fais l'effort et m'excuse encore de mon ignorance face à tes compétences, pourrais-tu être un peu plus exhaustif pour moi please ?
Comment faire une procédure sub ? comment l'intégrer STP ?

Grâce à vous j'arrive quasiment au but de cette application, c'est le dernier point de ce "programme" !

Last Step ! A+
 

Discussions similaires

Statistiques des forums

Discussions
312 332
Messages
2 087 365
Membres
103 528
dernier inscrit
maro