Automatiser une fonction excel sur vba [résolu] - VB/VBA/VBS - Programmation
Marsh Posté le 14-12-2007 à 13:29:31
Citation : Cette formule s'appelle polyA |
Qu'est-ce que PolyA ? Est-ce une formule, un graphique, une fonction pour une formule, ou une subroutine VBA ? Avoir le même nom pour ces différentes choses ne me permet pas de bien comprendre la question.
Je ne vois pas PolyA dans la liste des fonctions que me donne Excel quand je cherche à rentrer une formule, et je n'arrive pas à reproduire le cas Formula = "=PolyA(plage, plage2, 0, 1).
Je ne vois pas l'intérêt d'avoir un programme qui met des formules dans des cellules pour votre automatisation. On peut mettre une formule via le VBA en faisant, par exemple : ActiveCell.FormulaR1C1 = "=RC[1]+RC[2]" Mais ensuite, il faudrait lancer l'activation de la formule. Il est plus facile et plus pratique d'avoir une petite subroutine VBA qui va faire un calcul et qui va mettre le résultat dans une cellule.
Bref, je ne comprends pas bien, mais peut-être que les autres aussi, car personne ne répond.
Marsh Posté le 14-12-2007 à 13:59:52
Il faut bien différencier les cas :
La variable plage semble être une valeur de cellule alors que plage2 est un objet Range.
La propriété .Formula attend une valeur de type String.
start et fin sont des entiers Long
Ton objectif est donc de remplir .Formula, donc une variable String.
C'est pour cela que tu utilises les guillemets : "=PolyA(plage, plage2, 0, 1)"
Sauf qu'en les utilisant tu transformes tes variables en données non interprétées.
Et c'est là que les débutants ont du mal en général, parce que les formules Excel ne reconnaissent pas directement les variables VBA !
On ne peut donc pas les utiliser comme ça dans une formule.
Déjà pour résoudre ton problème il faut harmoniser plage et plage2 (soit des String contenant l'adresse des Range, soit les objets Range eux-même). Ensuite il faut utiliser une syntaxe de concaténation pour remplir .Formula
Par exemple, si plage et plage2 sont des String et contiennent directement les adresses (càd. "G2:G38" ), tu auras un truc du genre :
"=PolyA(" & plage & ", " & plage2 & ", 0, 1)"
À toi de trouver comment remplir plage et plage2 (un indice : propriétés .Address et .AddressLocal des objets Range)
Pas sûr d'avoir été clair, mais j'espère que ça t'aidera.
Marsh Posté le 14-12-2007 à 16:51:31
PolyA est une formule qui n'est pas par défaut sur excel, je l'ai "téléchargée si on peut dire". Mais ce n'est qu'une formule comme une autre permettant de déterminer les coefficient de polynomes.
Plage et Plage2 sont de même type, mais je n'arrive pas à les définir correctement. Et comme je suis extremement debutant c'est pas facile de se faire comprendre, et c'est pas facile pour moi de vous comprendre totalement.
Comment je définis mes plages de données pour que la formule polyA fonctionne en boucle? en gros sur une feuille de calcul j'ai 500 blocs de ligne allant de start a fin, soit autant de fois polyA à appliquer.
Marsh Posté le 17-12-2007 à 09:03:21
J'ai progressé un peu sur le sujet mais ce n'est pas encore ça.
J'ai fait ça (en lieu et place de ce qui etait en rouge dans mon premier post) :
Dim coef As String
Dim valeur As Integer
For i = start To fin
coef = "=PolyA(" & Cells(i, 7) & ";" & Cells(i, 11) & ";0;1)"
Next
coef = valeur
Cells(start, 12).Value = valeur
Quand je lance la macro je n'ai pas d'erreur ce qui est déjà une bonne chose; mais par contre j'ai un problème en ce qui concerne le résultat de ma formule, il me met 0 pour chaque série de données, comme si ca ne calculait pas.
QUand je fais le pas a pas, j'ai bien les bonnes valeurs de mes parametres dans ma formule polyA, mais après je sais pas. Est ce qu'il faut que je modifie coef pour mettre quelque chose de type .Formula?
Marsh Posté le 17-12-2007 à 09:32:06
- Ta procédure polyA ne prend pas de paramètres
- Dans ton code du message juste au dessus, tu donnes une valeur à coef dans la boucle x fois, une fois sorti de cette boucle, tu affectes à coef une valeur vide, puis tu utilises cette variable comme valeur dans une cellule de la colonne L
Bref, dans cette portion de code, tu ne fais... rien
Pour t'aider, une fonction personnalisée n'est, comme son nom l'indique, pas une procédure (donc Function, pas Sub)
ça veut dire également, qu'elle retourne une valeur, et qu'elle est typée
Je crois après relecture que tu n'as vraiment pas compris le principe, si tu veux la fonction dans ta feuille Excel...
Dans ta fonction, tu ne t'occupes pas de la partie affichage, tu t'occupes juste de la partie fonctionnelle, l'affichage dans la cellule, c'est Excel qui s'en occupe
Voici un petit exemple, une fonction très simple qui calcule l'aire d'un rectangle
Public Function aireRectangle(longueur As Single, largeur As Single) As Single
aireRectangle = longueur * largeur
End Function
Là, si tu tapes dans ta feuille Excel par exemple "=aireRectangle(5;6)", ça va t'afficher 30, pourtant la partie affichage n'est pas gérée dans la fonction
Il faut déclarer les variables en entrée de ta fonction
Marsh Posté le 17-12-2007 à 10:32:21
Merci devil_k pour la reponse.
Donc si j'ai bien compris, il faut que je crée un fichier function et que je l'appelle ensuite dans ma procédure sub.
Il y a un fichier function qui existe déjà dont voici le code :
Code :
|
Donc il faut que je me serve de ça, en entrant MatX, MatY et N comme parametre, sans toucher à ce fichier?
Marsh Posté le 17-12-2007 à 13:33:54
Ca devient plus clair. PolyA est donc une function VBA prenant 4 paramètres.
Pour l'utiliser dans du VBA, il faut l'appeler sans le "=" et les ";".
Par exemple :
For i = start To fin |
Marsh Posté le 17-12-2007 à 14:05:53
Je viens d'essayer comme ce que tu m'as proposé, mais il m'affiche un message d'erreur :Erreur de compilation : nombre d'arguments incorrects ou affectation de propriété incorrecte
J'ai essayé ça aussi mais ca marche pas :
Code :
|
Code :
|
Marsh Posté le 17-12-2007 à 15:27:22
Sur le bout de code que tu nous donnes, c'est normal que ça ne marche pas :
Ta fonction attend un Range (ou tout du moins son addresse), tu lui donnes sa valeur
Je pense que
Range(Cells(start, l2), Cells(start, l2)).FormulaLocal = "=PolyA(" & Cells(i, 7).Address & ";" & Cells(i, 11).Address & ";0;1)"
devrait passer, à tester
Marsh Posté le 17-12-2007 à 15:35:40
Erreur d'execution 1004
Je commence à désespérer, y'a rien qui veut bien marcher.
Marsh Posté le 17-12-2007 à 15:46:37
Il faut que tu vérifies que tes variables soient bien initialisées
(start, l2 et i à priori)
Si elles le sont, mets un point d'arrêt sur la première ligne de ton code et vois exactement à quel moment ça merde
Sinon, ta fonction, tu peux l'utiliser à la main dans une feuille Excel, et dérouler
Marsh Posté le 17-12-2007 à 16:05:59
Le reste du code est dans le premier poste du topic et je pense qu'il n'y a pas de probleme en dehors de cette ...... de fonction . Car ce code je l'utilise dans d'autres macro qui ont un autre bur mais dont le principe reste le même et ça marche.
Je crois que c''est pas possible de l'utiliser à la main, car je dois l'appliquer environ 10000 fois, d'ou ma volonté que ça fonctionne avec une macro, j'ai pas envie de rater noel a cause de ça
j'édite car je crois que c'est bon, ce que tu m'a donné tout à l'heure était correct, sauf que moi j'ai fait un copié collé de ce que tu as mis, mais il y avait une petite erreur, moi je voulais 12 et pas l2, hihi. Quand tu as parlé de variable l2 j'ai trouvé ça bizarre.
Je vérifie que ce soit vraiment bon et je reviens confirmer. Merci beaucoup en tout cas.
Marsh Posté le 17-12-2007 à 16:18:21
Quelle déception il semblerait que ce ne soit pas tout à fait ça.
En lieu et place de la valeur souhaitée, il m'affiche la valeur de cells(fin,11). En fait il applique la formule uniquement sur la derniere ligne donc celle qui a comme indice fin.
DOnc je pense qu'il faut effectivement faire comme tegu avait dit, c'est à dire :
Range(Cells(start, 12), Cells(start, 12)).FormulaLocal = "=PolyA(" & plage1 & ";" & plage2 & ";0;1)"
et donc bien définir plage1 et plage2 de telle sorte que la fonction s'applique une seule fois sur l'ensemble des données de start à fin, et non pas sur chque ligne ce qui amene a donner le resultat sur uniquement la dernier ligne.
J'ai fait ça :
Code :
|
Mais bien entendu ça ne fonctionne pas
Marsh Posté le 17-12-2007 à 16:36:43
ça ne serait pas plutôt
cells(i,12).FormulaLocal = "=PolyA(" & Cells(i, 7).Address & ";" & Cells(i, 11).Address & ";0;1)"
que tu voudrais dans ta boucle ?
Désolé, mais je dois y aller là, bon courage
Marsh Posté le 17-12-2007 à 16:47:08
Non car si je met ça, je me retrouve avec une colone 12 identique à la 11, car il applique la fonction sur chaque ligne independament des autres, donc la boucle ne sert a rien, d'ou la nécessiter de définir les plages de donnée avant.
Dommage que tu doives partir, car tes conseils me sont bien précieux et je sens que je suis près du but, mais mes lacunes sur vba ne pardonnent pas.
Marsh Posté le 17-12-2007 à 18:17:42
Soir Bon
Si cela peut aider :
http://fordom.free.fr/
http://fordom.free.fr/poly/POLYA.htm et les exemples
http://fordom.free.fr/poly/POLYAEX.htm
Restera à utiliser Option Explicit pour déclarer les variables, ce qui n'est pas fait à l'origine
Marsh Posté le 18-12-2007 à 08:04:12
Merci pour les réponses, j'ai enfin réussi à exécuter correctement cette macro, après plusieurs heures de prise de tête.
Code :
|
Marsh Posté le 14-12-2007 à 10:17:21
Bonjour a tous,
Je suis débutant en vba, et j'ai un problème pour automatiser une formule d'excel sur vba. Cette formule s'appelle polyA et elle permet de calculer les coefficients d'une courbe par la méthode des moindres carrés. Dans mon cas je veux une droite horizontale donc un polynome de degré 0.
4 parametre doivent etre entrés pour cette fonction :
Mat x : la colonne des abcisses
Mat y : la colonne des ordonnées
N : le degré du polynome (ici 0)
I : un coefficient qui vaut 1 par defaut
Mes abcisses se trouvent dans la colonne G et mes ordonnées dans la colonne K.
J'arrive a appliquer la formule en entrant une plage de données précises (ex : Formula = "=PolyA(G2:G38, K2:K38, 0, 1)" ), mais ce que je voudrais c'est que ca s'enchaine sur les plages de données suivantes.
Voici mon code :
Donc voilà si quelqu'un pouvait eclairer ma lanterne sur cette fonction ca m'aiderait grandement.
J'espere avoir été clair, merci d'avance
Message édité par othmer le 18-12-2007 à 08:05:45