Se connecter avec
S'enregistrer | Connectez-vous

[résolu] Automatiser une fonction excel sur vba

Dernière réponse : dans Programmation

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 qui suivent. En gros sur une feuille de calcul j'ai 500 blocs de ligne allant de start a fin, soit autant de fois polyA à appliquer.

Voici mon code :

  1. Sub PolyA()
  2.  
  3. Dim index As Long
  4. Dim nb As Integer
  5. Dim start As Long (ligne de début pour un vehicule)
  6. Dim fin As Long (ligne de fin pour le meme vehicule)
  7. Dim Val As Integer
  8.  
  9. index = 2
  10. nb = 0
  11. start = 2
  12. fin = 2
  13. Val = 0
  14.  
  15. Dim nbligne As Long
  16.  
  17. nbligne = 66000
  18.  
  19. Do
  20.  
  21. Val = Cells(index, 2).Value
  22.  
  23. Do
  24.  
  25. index = index + 1
  26. nb = nb + 1
  27.  
  28. Loop While Cells(index, 2).Value = Val
  29.  
  30. If Cells(index, 2).Value = "" Then
  31. nb = nb - 1
  32. End If
  33.  
  34. fin = start + nb - 1
  35. 'start et fin correspondent aux indices de 1ère et dernière ligne d'une série de données, donc une fois que la formule est appliquée a la série de start à fin, le start devient le fin+1 et le nouveau fin est déterminé avec la boucle du dessus'
  36.  
  37. Dim coef As String
  38. Dim valeur As Integer
  39.  
  40. For i = start To fin
  41. coef = "=PolyA(" & Cells(i, 7) & ";" & Cells(i, 11) & ";0;1)"
  42. Next
  43.  
  44. coef = valeur
  45. Cells(start, 12).Value = valeur
  46. 'C'est le passage ci d"essus qui m'embete'
  47.  
  48. start = index
  49. nb = 0
  50.  
  51. If IsEmpty(Cells(index, 2)) Then
  52. index = nbligne + 1
  53. End If
  54.  
  55. Loop While index < nbligne
  56.  
  57. End Sub


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?
Donc voilà si quelqu'un pouvait eclairer ma lanterne sur cette fonction ca m'aiderait grandement.
J'espere avoir été clair, merci d'avance

edit : désolé pour l'affichage non réglementaire
Lassé par la pub ? Créez un compte

Pas de réponse, donc je vais eclaircir un peu tout ça.
Mon problème est de définir correctement mes plages de données (plage 1 et plage2)
Actuellement j'en suis là :

  1. Dim plage1 As Range
  2. Dim plage2 As Range
  3.  
  4. Set plage1 = Range(Cells(start, 7).Address, Cells(fin, 7).Address)
  5. Set plage2 = Range(Cells(start, 11).Address, Cells(fin, 11).Address)
  6.  
  7. Range(Cells(start, 12), Cells(start, 12)).FormulaLocal = "=PolyA(" & plage1 & ";" & plage2 & ";0;1)"


Qu'est ce qui n'est pas bon dans mes lignes "set plage1....." et "set plage2....."?

Merci
Expert Programmation

Eh, eh, une (ou deux) petite(s) erreur(s) :

1° La première, qui n'est pas vraiment une erreur, puisque VB l'accepte. Mais bon. Tu le fais bien ligne, 7, fais pareil ligne 4 et 5:
  1. Set plage1 = Range(Cells(start, 7), Cells(fin, 7))
  2. Set plage2 = Range(Cells(start, 11), Cells(fin, 11))
  3.  
  4. Range(Cells(start, 12), Cells(start, 12)).FormulaLocal = ".."


2° Par contre (c'est là que c'est drôle par rapport au 1° :D  ) :
  1. Range(..).FormulaLocal = "=PolyA(" & plage1.Address & ";" & plage2.Address & ";0;1)"


Voilà, c'est tout.

En fait, ce que tu ne sais pas faire c'est voir l'erreur. Certes, mais comment faire alors ?

Si ligne 6, tu avais écris :
  1. MsgBox "=PolyA(" & plage1 & ";" & plage2 & ";0;1)"
tu te serais rendu compte de ton erreur.

Tu peux aussi te servir de la fenêtre d'exécution (cherche-là à titre d'exo ;)  ). Pour écrire dedans :
  1. Debug.Print "Coucou. L'adresse de la plage n°1 est : " & plage1.Address


Tu peux aussi te servir de la fenêtre espion (pareil, cherche-là) Mais elle est plutôt à réserver aux objets. Qu'importe. Ajoutes-y l'espion "=PolyA(" & plage1 & ";" & plage2 & ";0;1)".

Mets un point d'arrêt [F9] sur la ligne 7 ou écris Stop sur la ligne 6 et exécute. La macro va s'y arrêter. Tu as alors tout loisir de consulter exécution et espion. Dans la fenêtre d'exécution, tape directement
? plage1.Address
? "PPC c'est cool !"

:) 

Merci infiniment zeb!!!

J'ai fais les modif que tu as dites, mais avec la 1°, ca ne marche pas, par contre juste la 2° ça fonctionne. J'ai pas le temps de vérifier plus, car il est l'heure de débaucher, mais il semblerait que ce soit bon.

En revanche j'avoue que j'ai pas tout saisi sur le reste, quand je met MsgBox =...., j'ai un message d'erreur, donc j'ai supprimé. En ce qui concerne la fenetre d'exécution, je l'ai trouvé sans trop de probleme, mais je n'ai pas pris le temps de tout faire, je voulais te remercier avant. Je m'y plongerais demain.

EN tout cas je vais passer une meilleure soirée, hihi.

Merci encore et si des fois j'ai encore des soucis je saurais a qui m'adresser.
Bonne soirée...
Lassé par la pub ? Créez un compte