XL 2016 Pourquoi Evaluate s'exécute toujours 2 fois ?

Lu76Fer

XLDnaute Occasionnel
Bonjour,

J'ai testé sur différente version d'excel et le résultat est le même :
VB:
Function TestEval() As Boolean
    Debug.Print "TEST EN COURS ..."
    TestEval = True
End Function

Sub TestAppel()
Dim b As Boolean
    b = Evaluate("TestEval()")
    'b = [TestEval()] 'Même résultat
End Sub
Résultat :
TEST EN COURS ...
TEST EN COURS ...

Qui aurait des explications ou un lien pour m'éclairer ?
 

patricktoulon

XLDnaute Barbatruc
c'est bien de savoir quelles sont les possibilités technique
allez si c'est pour tester si une fonction existe

comme ça vite fait
ici on va tester si dans le module2 il y a la fonction testEval3()
VB:
Sub testX()
'******************************************************
'activer la référence Microsoft visual basic for application Extensibility 5.X
'*********************************************************
Set m = ThisWorkbook.VBProject.VBComponents("Module2") 'le module
code = m.CodeModule.Lines(1, m.CodeModule.CountOfLines)'le code entier du module
fonctionrecherchée = "TestEval3()"'la fonction que l'on recherche
MsgBox code Like "*Function*" & fonctionrecherchée & "*" 'alo!!
End Sub
voici comment on fait ;)

et tes fonction tu leur ajoute pas des setting et tout les sottises que l'on peut imaginer ;)
 

Lu76Fer

XLDnaute Occasionnel
Bonsoir
En parlant de possibilité technique, il y a quand même Application.Run NomProc avec NomProc une variable String contenant le nom de la Sub à exécuter qui serait à mon avis plus adapté.
Tout à fait pertinant !!
Merci encore !
C'est d'ailleurs aussi grâce à cette Macro que je communique entre 2 instances Excel. Il suffit de faire passer Application en paramètre qui est le seul objet qui peut être passé au travers de cette macro. Ensuite l'autoroute est ouverte ...
👏
 

patricktoulon

XLDnaute Barbatruc
re
la même qui cherche la fonction dans tout les modules
Code:
Sub testX2()
Dim code$
'******************************************************
'activer la référence Microsoft visual basic for application Extensibility 5.X
'*********************************************************
For Each m In ThisWorkbook.VBProject.VBComponents
If m.CodeModule.CountOfLines > 0 Then code = m.CodeModule.Lines(1, m.CodeModule.CountOfLines)
fonctionrecherchée = "TestEval3()"
If code Like "*Function*" & fonctionrecherchée & "*" Then MsgBox "oui"
Next
End Sub
 

Lu76Fer

XLDnaute Occasionnel
re
la même qui cherche la fonction dans tout les modules
Code:
Sub testX2()
Dim code$
'******************************************************
'activer la référence Microsoft visual basic for application Extensibility 5.X
'*********************************************************
For Each m In ThisWorkbook.VBProject.VBComponents
If m.CodeModule.CountOfLines > 0 Then code = m.CodeModule.Lines(1, m.CodeModule.CountOfLines)
fonctionrecherchée = "TestEval3()"
If code Like "*Function*" & fonctionrecherchée & "*" Then MsgBox "oui"
Next
End Sub
Pour ce type de code, il faut des autorisations particulières. Ce code est toujours intéressant mais pour un projet plus ambitieux...
La solution de Dranreb est encore et toujours la plus judicieuse !
 

Apache007

XLDnaute Nouveau
Bonjour,

J'ai testé sur différente version d'excel et le résultat est le même :
VB:
Function TestEval() As Boolean
    Debug.Print "TEST EN COURS ..."
    TestEval = True
End Function

Sub TestAppel()
Dim b As Boolean
    b = Evaluate("TestEval()")
    'b = [TestEval()] 'Même résultat
End Sub
Résultat :
TEST EN COURS ...
TEST EN COURS ...

Qui aurait des explications ou un lien pour m'éclairer ?
Bonjour Lu76Fer,

Pour éviter que la fonction appelée ne soit exécutée 2 fois je vous propose l'utilisation d'une variable en Static. La fonction sera bien exécuté 2 fois mais au deuxième appel on la quitte directement au début.

Exemple:

VB:
Function TestEval() As Boolean
    Static Vi_i As Integer
    Vi_i = Vi_i + 1
  
    If Vi_i > 1 Then
        Vi_i = 0
        Exit Function
    End If
  
    Debug.Print "TEST EN COURS ..."
    TestEval = True
End Function

Ou mettre une variable Static Vb_Execute As Boolean à la place du compteur:


VB:
...
Static Vb_Execute As Boolean

If Vb_Execute Then
    Vb_Execute = False
    Exit Function
End If
Vb_Execute = True
...
 
Dernière édition:

Lu76Fer

XLDnaute Occasionnel
Merci Apache007,
Ce post date un peu et j'explorai des possibilités diverses pour exécuter du code dynamiquement et j'avais partagé des observations à ce moment... J'étais parti sur une autre solution ensuite comme Application.Run
ou autre chose mais je ne me souviens plus :rolleyes:.
Cela concerne ce projet que j'ai partagé dans les ressources :
Notation-Simplifiee-pour-définir-une-collection-ou-un-tableau

Merci pour l'astuce même si du coup je préfère plutôt éviter cette instruction.
 

Discussions similaires

Statistiques des forums

Discussions
314 636
Messages
2 111 457
Membres
111 144
dernier inscrit
shura_77