# Problème macro sous Excel



## NeoDym.art (23 Mars 2006)

Hello à tous,
J'âi un petit soucis avec mes macros: je ne peux pas en enregistrer. Avec le "gestionnaire", lorsque j'enregistre ma macro, il plante, ou lorsque j'enregistre à partir de "nouvelle macro", une boîte de dialogue apparaît; "impossible d'enregistrer"
Je n'en sais pas plus, je voulais naïvement essayer d'écrire du code VBA pour un document pour l'école... mais impossible.
Est ce que quelqu'un connait ce genre de problème?

T.


----------



## GrandGibus (25 Mars 2006)

J'ai quelques doutes sur l'étendue des possibilités de Exel Mac avec les scripts VBA... car ils s'appuient sur Visual Basic (VB) qui est propre à Windows ...

Ce n'est pas une certitude absolue, mais ce genre de message apparaît régulièrement sur le forum sans jamais ne trouver de réponse.


----------



## Vladrow (25 Mars 2006)

NeoDym.art a dit:
			
		

> Hello à tous,
> J'âi un petit soucis avec mes macros: je ne peux pas en enregistrer. Avec le "gestionnaire", lorsque j'enregistre ma macro, il plante, ou lorsque j'enregistre à partir de "nouvelle macro", une boîte de dialogue apparaît; "impossible d'enregistrer"
> Je n'en sais pas plus, je voulais naïvement essayer d'écrire du code VBA pour un document pour l'école... mais impossible.
> Est ce que quelqu'un connait ce genre de problème?
> ...


Juste au cas où, arrives-tu à ouvrir Visual Basic Editor ?
N'y aurait-il pas un problème d'installation de Excel ? Il faut qu'il y ait l'extension "Visual Basic for applications" dans le dossier "Office" lui même dans le dossier "Microsoft Office 2004" . (Je parle sous OsX, sous Os9/classic je ne me souviens plus de l'endroit)


----------



## NeoDym.art (25 Mars 2006)

Je pose cette question parce que il s'avère que sur mon ibook je peux parfaitement utilisé visual basic editor et pas sur mon imac G5... C'est pourtant exactement le même version, le même logiciel, la même installation (donc VBA est installé) 
Donc je confirme que VBA est accessible pour mac.

* Au passage, est ce que vous savez comment utiliser dans le code une formule d'inconnue x que l'utilisateur remplit dans une cellule? Je n'arrive ni avec .calculate, ni avec .evaluate, car je n'ai aucune idée pour assigner à x une valeur (par exemple la valeur d'une autre cellule). Je pense qu'il faut récupérer la fonction, que je ne peux définir tant que l'utilisateur ne l'écrit pas, dans une fonction du code "function ma_fonction(x) as Integer" et là je peux ainsi assigner à la variable une valeur. Mais comment la récupérer? remarque; cette fonction va ^tre plusieur fois utilisée dans ma macro. Je n'ai pas réussi à trouver dans ma documentation quelque chose qui ressemblait à mon problème.*
 
T


----------



## Vladrow (25 Mars 2006)

NeoDym.art a dit:
			
		

> Je pose cette question parce que il s'avère que sur mon ibook je peux parfaitement utilisé visual basic editor et pas sur mon imac G5... C'est pourtant exactement le même version, le même logiciel, la même installation (donc VBA est installé)
> Donc je confirme que VBA est accessible pour mac.



Donc tu es obligé de faire le code à la main ?  Dans ce cas si Visual Basic est présent est fonctionne, je n'ai pas d'idée. Réinstalle. 



			
				NeoDym.art a dit:
			
		

> * Au passage, est ce que vous savez comment utiliser dans le code une formule d'inconnue x que l'utilisateur remplit dans une cellule? Je n'arrive ni avec .calculate, ni avec .evaluate, car je n'ai aucune idée pour assigner à x une valeur (par exemple la valeur d'une autre cellule). Je pense qu'il faut récupérer la fonction, que je ne peux définir tant que l'utilisateur ne l'écrit pas, dans une fonction du code "function ma_fonction(x) as Integer" et là je peux ainsi assigner à la variable une valeur. Mais comment la récupérer? remarque; cette fonction va ^tre plusieur fois utilisée dans ma macro. Je n'ai pas réussi à trouver dans ma documentation quelque chose qui ressemblait à mon problème.*
> 
> T



Si j'ai bien compris, c'est coton !  
Une piste -> nommer la cellule qui contient la valeur (et lui donner le nom x) L'utilisateur peut alors écrire sa formule en respectant les conventions d'Excel  du genre "=3*x+2" Pas besoin de passer par Visual basic pour cette étape. Bon courage


----------



## NeoDym.art (25 Mars 2006)

> Une piste -> nommer la cellule qui contient la valeur (et lui donner le nom x) L'utilisateur peut alors écrire sa formule en respectant les conventions d'Excel du genre "=3*x+2" Pas besoin de passer par Visual basic pour cette étape. Bon courage


OUi, ça j'ai réussi... je progresse! Effectivement je ne suis pas passé par le code... Maintenant je n'arrive pas à reprendre la fonction dans une autre cellule: la cellue A1 a la fonction: x*2 par exemple... Je n'arrive pas a allé dans une autre cellule: =A1, et qu'il me renvoie la valeur de f(x), c'est seulement si je tape =x*2 qu'il me renvoie la valeur numérique.

Bon, c'est un petit défit pour moi. Je n'arrive vraiment pas: je fais ça dans le cadre d'un nouveau cours sur la recherche dicotomique (je ne sais plus l'orthographe). Le prof nous a demandé de "réfléchir" pour pouvoir trouver des intervalles avec excel. C'est pas très difficile, il suffit d'écrire une fonction et la fonction Si() qu'on répète antant de fois que voulu.
Mais dans mon orgueil personnel, je voulais toucher au code VBA, ce que je trouve un poil plus drôle; Je n'ai fait que jusqu'ici du dév web. Et  je veux faire maintenant un mini-programme où je n'est lplus qu'à taper ma fonction, mon intervalle, et le nombre de fois que je veux qu'il exécute un affinement. Donc je ne suis tenu à rien, et puisque je m'énerve et que je n'arrive pas, je vais faire une dernière tentative avant d'abandonner. On apprend pas à programmer en deux jours... 
Voilà mon idée de base:

une plage de saisie pour la fonction f(x), une pour la borne inférieure de l'intervalle= min, borne supérieure= max, La précision= préc. Un bouton appel ma fonction:

// d'abord une fonction qui vérifie que ma fonction est continue dans l'intervalle, si vrai, alors appel 
de la fonction ma_fonction()

Sub ma_fonction()
Dim Encore As Boolean
Dim min As Single, max As Single, milieu As Single 'milieu et le milieu de l'intervalle, 
'formant les deux nouvelles intervalles
Encore=true
min = Range("cellule_de_min").Value
max = Range("cellule_de_max").Value
While Encore=true
     milieu = (max-min/2)+min
If f(min)*f(milieu)<0 'si valeur négatif, donc pas le même signe, 
 ' donc la réponse se trouve dans cette intervalle
      max = milieu
Else If
            min = milieu
End if
   encore = (max-min)>préc
End While
End Sub

La syntaxe n'est pas forcément respectée car je n'ai pas encore tout "traduit" en VBA. Il me restait à trouver le moyen d'écrire à chaque tour l'intervalle (j'imagine return min...). 
Mais le plus, c'est ma fonction, *je n'ai aucune idée* pour dire que f(x) est la chaîne de caractère d'une cellule... j'ai essayé function f(x) as single // ici pas mal d'instructions testées comme .evaluate ou calculate// end function.

Est ce que je suis complétement à côté? Oû il y a un semblant d'espoir?


----------



## Vladrow (25 Mars 2006)

NeoDym.art a dit:
			
		

> Est ce que je suis complétement à côté? Oû il y a un semblant d'espoir?



Il y a un semblant d'espoir.
Mais là je viens de descendre une bouteille de Bollinger  et un sorbet à la bière alors je ne suis plus très clair. :rateau: 

Du genre écrire une sous routine qui applique une valeur à la cellule nommée x et qui récupère le résultat dans la cellule où est écrite la fonction. Sous routine que tu appelles chaque fois que tu as besoin de la fonction f. 

La cuite au prochain numéro


----------



## NeoDym.art (25 Mars 2006)

une sous routine? une nouvelle fonction qui récurpère cette valeur... j'avais pensé que je pourrais récupéré une valeur en convertissant string avec Csin ou un truc du genre. 

En fait, je dois être dans le même état que toi, mais sans avoir bu! J'attend le prochain épisode...

Et je te remercie pour toutes tes lumières!


----------



## Vladrow (26 Mars 2006)

NeoDym.art a dit:
			
		

> une sous routine? une nouvelle fonction qui récurpère cette valeur... j'avais pensé que je pourrais récupéré une valeur en convertissant string avec Csin ou un truc du genre.
> 
> En fait, je dois être dans le même état que toi, mais sans avoir bu! J'attend le prochain épisode...
> 
> Et je te remercie pour toutes tes lumières!



La nuit portant conseil, tu devrais regarder du côté de Addfromstring et de l'objet codemodule.
Car finalement ce que tu veux, c'est intégrer ta formule dans ton code, donc modifier ton code. 
Tu ferais une procédure spécifique pour la fonction modifiée à chaque exécution et une procédure telle que tu l'as écrite dessus qui comprendrait les instructions pour modifier la première procédure.

Il y a donc deux méthodes. Tout dépend de ce que tu veux afficher comme résultat.


----------



## NeoDym.art (26 Mars 2006)

Ok! ça me parle, je vais essayer ça.

Je veux afficher l'intervalle qui contient la réponse à chaque "affinement", donc min et max, je pense qu'il me suffit d'écrire avant la fin de ma boucle mais après la déclaration If qui change milieu en min ou max, Range("L(1)C2").Value = min et Range("L(1)C3").Value = max... mais je suis pas sûr que à chaque tour, la ligne sera décrémentée de 1... Peut-être faudra-t-il que je mette en argument i = 0 hors de la boucle, et dans la boucle: i = i+1, et ainsi Range("LiC2).Value...

Mais pour l'instant je suis plus préoccupé par ma fonction! Merci beaucoup...


----------



## NeoDym.art (29 Mars 2006)

Bon, maintenant tout marche... sauf que ça marche pas!
Je modifie mon code, et merci beaucoup pour l'astuce, c'est nikel la première fois. Mais ensuite excel plante! De plus je ne peux qu'ajouter des nombres, mais pas de x ou d'opérateurs, sinon Excel plante.
Voilà mon code
Le tout est dans un Useform... "Redico"... où j'entre ma fonction dans une plage de texte "TextBox"...
D'abord, effacer l'ancienne fonction f(x), car sinon il y en aura plusieurs et lors de l'appel de f(x), c'est pas possible:
Private Sub TextBox_Change()

Dim vbext_pk_Proc As Long
Dim deb As Integer
Dim nb As Integer
With ActiveWorkbook.VBProject.VBComponents("Redico").CodeModule
deb = .ProcStartLine("f", vbext_pk_Proc)
nb = .ProcCountLines("f", vbext_pk_Proc)
.deleteLines deb, nb
End With

End Sub

Ensuite je rajoute la fonction f(x) qui est entrée dans TextBox, dans une nouvelle fonction. J'exécute   ce code avec un bouton parce que je n'arrivais pas à le faire marcher un même temps avec l'événement _change() du textBox.

Private Sub CommandButton3_Click()
Dim code As Variant
Dim contenu As Variant
contenu = TextBox.Value
code = code & "Private Function f(x) as Single" & vbCrLf
code =vcode & "f =" & contenu & vbCrLf
code = code & "End Function" & vbCrLf
With ActiveWorkbook.VBProject.VBComponents("Redico").CodeModule
.AddFromString code
End With
End Sub

Alors voilà, j'ai pensé que le problème était dû aux déclarations de VBA et contenu (à la base "String") mais même avec variant ça ne marche pas. Je ne comprend pas, surtout que ça marche une fois et ensuite ça plante! Où est ma faute? 
(**A ce propos, j'ai trouvé la structure de addfromstring et codemodule sur un vieux topic d'un forum excel**)

T.


----------

