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

Benamou39

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

Bonsoir à tous,

Ma pomme,
(Visiblement tes messages ne s'incrémentent pas dans le fil alors j'ajoute ton code reçu par mail grâce à l’abonnement)

Merci pour cette belle transformation mais cela ne fonctionne pas.
Je crois qu'il ne faut pas se casser la tête en essayant de remplacer toutes les combinaisons possibles...
Mais plutôt opter pour l'évaluation dans une cellule comme l'avait proposé Job75 via sub.

Saurais-tu comment faire STP ?

Merci par avance,


Code:
'le code de  Evaluer(x) :
Function Evaluer(x$)
Dim a$, b$
  b = x
  Do
    a = b: b = Replace(b, " ", "")
  Loop Until Len(b) = Len(a)

  Do
    a = b
    b = Replace(b, "(0)", "0"): b = Replace(b, "(1)", "1")
    b = Replace(b, "(0*0", "(0"): b = Replace(b, "(0*1", "(0")
    b = Replace(b, "(1*0", "(0"): b = Replace(b, "(1*1", "(1")
  Loop Until Len(b) = Len(a)

  Do
    a = b
    b = Replace(b, "(0)", "0"): b = Replace(b, "(1)", "1")
    b = Replace(b, "(0+0", "(0"): b = Replace(b, "(0+1", "(1")
    b = Replace(b, "(1+0", "(1"): b = Replace(b, "(1+1", "(1")
    b = Replace(b, "(1-0", "(1"): b = Replace(b, "(1-1", "(0")
  Loop Until Len(b) = Len(a)

  Do
    a = b
    b = Replace(b, "(0)", "0"): b = Replace(b, "(1)", "1")
    b = Replace(b, "0*0", "0"): b = Replace(b, "0*1", "0")
    b = Replace(b, "1*0", "0"): b = Replace(b, "1*1", "1")
  Loop Until Len(a) = Len(b)

  Do
    a = b
    b = Replace(b, "(0)", "0"): b = Replace(b, "(1)", "1")
    b = Replace(b, "0+0", "0"): b = Replace(b, "0+1", "1")
    b = Replace(b, "1+0", "1"): b = Replace(b, "1+1", "1")
  Loop Until Len(a) = Len(b)

  Evaluer = b
End Function
 

mapomme

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

Bonsoir Benamou39 :), job75 :),mutzik :)

(...) Je crois qu'il ne faut pas se casser la tête en essayant de remplacer toutes les combinaisons possibles. (...) Mais plutôt opter pour l'évaluation dans une cellule comme l'avait proposé Job75 via sub. (...) Saurais-tu comment faire STP ? (...)

Je suis têtu sur ce coup :p. Une troisième tentative en modifiant la manière de procéder. Cela fonctionne sur les exemples mais il faut pousser un peu plus les tests (je te laisse le soin de le faire)

Avec des tests un peu plus poussés, cette version v2c a révélé un bogue logique.
Une nouvelle version v2 corrigée est dans le fichier joint dans le message ici.
 
Dernière édition:

Benamou39

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

Bonjour Job75, Mutzik et Ma Pomme :),


je viens d'implémenter ta fonction Evaluer V2 dans mon programme et comment dire..... CA MARCHE DU FEU :cool:!!!!
J'ai essayé avec des cas assez complexes (combinaison de plusieurs () < + *) sur mon PC en vérifiant chaque étapes du code !

Avant de te proclamer mon nouveau "Dieu" et ne plus jamais croquer dans aucune pomme,
je vais essayer rapidement sur des cas plus complexes et vérifier via les systèmes usines !

Je te tiens au courant très vite !!!!

Encore un grand merci à la communauté et à Toi en particulier !!

Prochaine étape -> L'optimisation du code ?
Car à mon sens ça doit ramer un peu si l'utilisation est exploitée sur un grand nombre de cas...
(On va attendre un peu je crois et fêter cette première victoire en attendant !)

PS : Vous êtes quand mm bluffant les XLDnaute Barbatruc !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : [Résolu] dépasser/contourner la limite de 1 octet de Application.evaluate

Bonsoir Benamou39, à tous,

Voici une nouvelle version de la fonction v2 (la précédente v2c comportait un bogue logique), une ancienne version v3 que j'avais commencée mais que j'ai terminée (ce qui va fait détecter le bogue de la v2c) et une version utilisant une Sub() avec ce qu'a préconisait job75 :).

J'ai rajouté une feuille pour comparer les 3 méthodes.

La logique est respectée: la Sub() est la plus rapide, ensuite la v2, puis en fin de peloton la v3 (ex v1:)).
 

Pièces jointes

  • Benamou39 - Fonctions v2-v3 & Sub - (a).xlsm
    63.4 KB · Affichages: 16

Discussions similaires

Statistiques des forums

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