Bonjour à tous,
pour mon boulot, je dois faire un graphique, récupérer les paramètres de la droite de régression linéaire et optimiser une variable pour que le coefficient directeur soit 1.
La procédure havodcalc permet de calculer les données nécessaire pour tracer la courbe.
Graphique s'occupe de tracer la courbe et de récuperer les coefficients de regression.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 Public Sub havodcalc() Dim cell As Range Dim dP As Double Dim plageP As Range Pi = ThisWorkbook.Worksheets(1).Range("B5").Value Boi = ThisWorkbook.Worksheets(1).Range("K5").Value Rsi = ThisWorkbook.Worksheets(1).Range("I5").Value Bgi = ThisWorkbook.Worksheets(1).Range("H5").Value Swi = ThisWorkbook.Worksheets(1).Range("G2").Value m = ThisWorkbook.Worksheets(1).Range("G1").Value cf = ThisWorkbook.Worksheets(2).Range("B4").Value xR = ThisWorkbook.Worksheets(1).Range("H1").Value xL = ThisWorkbook.Worksheets(1).Range("H2").Value Weig = ThisWorkbook.Worksheets(1).Range("J1").Value For Each cell In ThisWorkbook.Worksheets(1).Range("B6", Range("B6").End(xlDown)) P = cell.Value dP = Pi - P Np = cell.Offset(0, 2) Rp = cell.Offset(0, 3) / Np Wp = cell.Offset(0, 4) Bg = cell.Offset(0, 6) Rs = cell.Offset(0, 7) Bo = cell.Offset(0, 9) Bw = cell.Offset(0, 10) cw = cell.Offset(0, 11) If ThisWorkbook.Worksheets(1).CheckBox1.Value = False Then Eg = 0 Else: Eg = Boi * (Bg / Bgi - 1) If ThisWorkbook.Worksheets(1).CheckBox1.Value = False Then m = 0 Else m = ThisWorkbook.Worksheets(1).Range("G1").Value If ThisWorkbook.Worksheets(1).CheckBox2.Value = True Then Efw = 0 Else: Efw = (1 + m) * Boi * ((cw * Swi + cf) / (1 - Swi)) * dP Eo = (Bo - Boi) + (Rsi - Rs) * Bg F = Np * (Bo + (Rp - Rs) * Bg) + Wp * Bw Et = Eo + m * Eg + Efw cell.Offset(0, 13) = F cell.Offset(0, 14) = Eo cell.Offset(0, 15) = Eg cell.Offset(0, 16) = Efw cell.Offset(0, 17) = Weig / Et cell.Offset(0, 18) = F / Et cell.Offset(0, 19) = Et Next cell End Sub
La procédure Opt sert à optimiser le paramètre Weig par dichotomie et fait appel aux procédures havodcalc et graphique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 Public Sub graphique() Dim graph As Chart, feuille1 As Worksheet, plageX As Range, plageY As Range Dim cell As Range Dim dP As Double 'Suppression du graphique existant Application.DisplayAlerts = False While Charts.Count > 0 Charts(1).Delete Wend 'Creation d'un nouveau graphique Set feuille1 = ThisWorkbook.Worksheets(1) Set feuille2 = ThisWorkbook.Worksheets(2) With feuille1 Set plageX = .Range("S6", Range("S6").End(xlDown)) Set plageY = .Range("T6", Range("T6").End(xlDown)) End With Set graph = ThisWorkbook.Charts.Add Set graph = ThisWorkbook.Charts(1) graph.ChartArea.Clear graph.ChartType = xlXYScatter Set maserie = graph.SeriesCollection.NewSeries With maserie .Values = plageY .XValues = plageX End With 'Ajout d'une courbe de tendance graph.SeriesCollection(1).Trendlines.Add graph.SeriesCollection(1).Trendlines(1).Type = xlLinear graph.SeriesCollection(1).Trendlines(1).DisplayEquation = True graph.SeriesCollection(1).Trendlines(1).DisplayRSquared = True 'Calcul des paramètres de la regression linéaire P = Application.WorksheetFunction.Slope(plageY, plageX) inter = Application.WorksheetFunction.Intercept(plageY, plageX) ThisWorkbook.Worksheets(1).Range("W1") = P ThisWorkbook.Worksheets(1).Range("W2") = inter End Sub
Si j'utilise les 2 premières procédures, la courbe s'affiche mais quand j'essqie d'optimiser, j'ai une erreur 1004: Erreur définie par l'emploi ou définie par l'objet sur la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Sub Opt() Dim graph As Chart, feuille1 As Worksheet, plageX As Range, plageY As Range Dim cell As Range Dim dP As Double Set feuille1 = ThisWorkbook.Worksheets(1) P = ThisWorkbook.Worksheets(1).Range("W1") 'optimisation de Weig Epsi = 2 xR = ThisWorkbook.Worksheets(1).Range("H1").Value xL = ThisWorkbook.Worksheets(1).Range("H2").Value Do While (xR - xL) > Epsi Or P <> 1 Weig = (xR - xL) / 2 ThisWorkbook.Worksheets(1).Range("J1").Value = Weig If P < 1 Then xL = Weig Else xR = Weig End If Call havodcalc Call graphique Loop End SubQuelqu'un aurait il une idée soit pour contourner le problème, soit pour corriger l'erreur ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part For Each cell In ThisWorkbook.Worksheets(1).Range("B6", Range("B6").End
Merci d'avance.
Jon
Ps: pas sur que le test de l'erreur soit bon, je bosse sur une version en allemand d'Excel...
Ps2: je pourrais héberger le fichier au besoin.
Partager