FORUM Tom's Hardware » Programmation » VB / VBA / VBS » [résolu] Automatiser une fonction excel sur vba
 

[résolu] Automatiser une fonction excel sur vba

Il y a 267 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [résolu] Automatiser une fonction excel sur vba
 
Plus d'informations

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 :
 

Code :
  1. Sub PolyA()
  2. Dim index As Long
  3. Dim nb As Integer
  4. Dim start As Long (ligne de début pour un vehicule)
  5. Dim fin As Long (ligne de fin pour le meme vehicule)
  6. Dim Val As Integer
  7.     index = 2
  8.     nb = 0
  9.     start = 2
  10.     fin = 2
  11.     Val = 0
  12.     Dim nbligne As Long
  13.     nbligne = 66000
  14.     Do
  15.         Val = Cells(index, 2).Value
  16.         Do
  17.              index = index + 1
  18.              nb = nb + 1
  19.         Loop While Cells(index, 2).Value = Val
  20.         If Cells(index, 2).Value = "" Then
  21.             nb = nb - 1
  22.         End If
  23.         fin = start + nb - 1
  24. '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'
  25.        Dim coef As String
  26.        Dim valeur As Integer
  27.              For i = start To fin
  28.              coef = "=PolyA(" & Cells(i, 7) & ";" & Cells(i, 11) & ";0;1)"
  29.              Next
  30.        coef = valeur
  31.        Cells(start, 12).Value = valeur
  32. 'C'est le passage ci d"essus qui m'embete'
  33.         start = index
  34.         nb = 0
  35.         If IsEmpty(Cells(index, 2)) Then
  36.              index = nbligne + 1
  37.         End If
  38.     Loop While index < nbligne
  39. 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


Message édité par husker le 18-12-2007 à 08:06:31

zeb
Profil : Modérateur libre
Plus d'informations

Dixit moderator : Merci de lire le règlement et de le respecter. :jap:


Message édité par zeb le 17-12-2007 à 17:31:37

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

Code :
  1. Dim plage1 As Range
  2.     Dim plage2 As Range
  3.     Set plage1 = Range(Cells(start, 7).Address, Cells(fin, 7).Address)
  4.     Set plage2 = Range(Cells(start, 11).Address, Cells(fin, 11).Address)
  5.         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

zeb
Profil : Modérateur libre
Plus d'informations

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:

Code :
  1. Set plage1 = Range(Cells(start, 7), Cells(fin, 7))
  2. Set plage2 = Range(Cells(start, 11), Cells(fin, 11))
  3. Range(Cells(start, 12), Cells(start, 12)).FormulaLocal = ".."


 
2° Par contre (c'est là que c'est drôle par rapport au 1° :D ) :

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

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

Code :
  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 !"


:)


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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...


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » VB / VBA / VBS » [résolu] Automatiser une fonction excel sur vba
 

Annonces Google
Publicité
Les ressources relatives