Bonjour, je travaille sur un logiciel permettant de dimensionner des ouvrages hydrauliques à l'aide de la formule de Caquot. On a construit un datagridview pour rentrer les données (pente, longueur, etc), j'ai mis en place un bouton "Calcul" qui permet d'afficher les résultats, c'est-à-dire des débits:
Voici mon programme, dans ce cas, il n'y a pas de problème:
Lorsque je veux calculer plus de valeurs, voici mon programme:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 Private Sub ButtonCalcul2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCalcul2.Click If Verification() Then Me.LabelQmax1.Text = "Q1 = " & CalculCaquot(1).ToString("0.0#") & " litres par seconde" Me.LabelQmax2.Text = "Q2 = " & CalculCaquot(2).ToString("0.0#") & " litres par seconde" Else Me.erreur2.Visible = True End If End Sub Function Verification() As Boolean Dim Bon As Boolean = True If Me.Labela2.Text Is Nothing Or Not IsNumeric(Me.Labela2.Text) Then MessageBox.Show("Entrez une valeur numérique pour a") Bon = False Else Select Case CType(Me.Labela2.Text, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour a") Bon = False End Select End If If Me.Labelb2.Text Is Nothing Or Not IsNumeric(Me.Labelb2.Text) Then MessageBox.Show("Entrez une valeur numérique pour b") Bon = False Else Select Case CType(Me.Labelb2.Text, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour b") Bon = False Case Is > 1 MessageBox.Show("Entrez une valeur entre 0 et 1 pour b") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value) Then MessageBox.Show("Entrez une valeur numérique pour S") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour S") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("longueur").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("longueur").Value) Then MessageBox.Show("Entrez une valeur numérique pour L") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("longueur").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour L") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value) Then MessageBox.Show("Entrez une valeur numérique pour C") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour C") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("pente").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("pente").Value) Then MessageBox.Show("Entrez une valeur numérique pour p") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("pente").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour p") Bon = False End Select End If Return Bon End Function Function CalculCaquot(ByVal i) As Double Dim a2 As Double = Convert.ToDouble(Me.Labela2.Text) Dim b2 As Double = Convert.ToDouble(Me.Labelb2.Text) Dim LabelQmaxi As Double Dim ValeurSi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Surfacetotale").Value) Dim ValeurLi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("longueur").Value) Dim ValeurCi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Coefficientimpermeabilisation").Value) Dim ValeurPi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("pente").Value) i = 1 While i < 100 LabelQmaxi = ((((a2 / 60) / 6.6) * (0.28 * (ValeurLi / 100) ^ 0.84 * (ValeurSi / 10000) ^ -0.42) ^ -b2) ^ (1 / (1 - 0.287 * b2))) * (ValeurCi ^ (1 / (1 - 0.287 * b2))) * ((ValeurPi / 100) ^ (0.41 * b2 / (1 - 0.287 * b2))) * ((ValeurSi / 10000) ^ ((0.95 - 0.507 * b2) / (1 - 0.287 * b2))) * 1000 i += 1 End While Return LabelQmaxi End Function
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 Private Sub ButtonCalcul2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCalcul2.Click If Verification() Then Me.LabelQmax1.Text = "Q1 = " & CalculCaquot(1).ToString("0.0#") & " litres par seconde" Me.LabelQmax2.Text = "Q2 = " & CalculCaquot(2).ToString("0.0#") & " litres par seconde" Me.LabelQmax3.Text = "Q3 = " & CalculCaquot(3).ToString("0.0#") & " litres par seconde" Me.LabelQmax4.Text = "Q4 = " & CalculCaquot(4).ToString("0.0#") & " litres par seconde" Me.LabelQmax5.Text = "Q5 = " & CalculCaquot(5).ToString("0.0#") & " litres par seconde" Me.LabelQmax6.Text = "Q6 = " & CalculCaquot(6).ToString("0.0#") & " litres par seconde" Me.LabelQmax7.Text = "Q7 = " & CalculCaquot(7).ToString("0.0#") & " litres par seconde" Me.LabelQmax8.Text = "Q8 = " & CalculCaquot(8).ToString("0.0#") & " litres par seconde" Me.LabelQmax9.Text = "Q9 = " & CalculCaquot(9).ToString("0.0#") & " litres par seconde" Me.LabelQmax10.Text = "Q10 = " & CalculCaquot(10).ToString("0.0#") & " litres par seconde" Else Me.erreur2.Visible = True End If End Sub Function Verification() As Boolean Dim Bon As Boolean = True If Me.Labela2.Text Is Nothing Or Not IsNumeric(Me.Labela2.Text) Then MessageBox.Show("Entrez une valeur numérique pour a") Bon = False Else Select Case CType(Me.Labela2.Text, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour a") Bon = False End Select End If If Me.Labelb2.Text Is Nothing Or Not IsNumeric(Me.Labelb2.Text) Then MessageBox.Show("Entrez une valeur numérique pour b") Bon = False Else Select Case CType(Me.Labelb2.Text, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour b") Bon = False Case Is > 1 MessageBox.Show("Entrez une valeur entre 0 et 1 pour b") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value) Then MessageBox.Show("Entrez une valeur numérique pour S") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour S") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("longueur").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("longueur").Value) Then MessageBox.Show("Entrez une valeur numérique pour L") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("longueur").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour L") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value) Then MessageBox.Show("Entrez une valeur numérique pour C") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour C") Bon = False End Select End If If Me.DataGridView1.Rows(0).Cells("pente").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("pente").Value) Then MessageBox.Show("Entrez une valeur numérique pour p") Bon = False Else Select Case CType(Me.DataGridView1.Rows(0).Cells("pente").Value, Double) Case Is < 0 MessageBox.Show("Entrez une valeur positive pour p") Bon = False End Select End If Return Bon End Function Function CalculCaquot(ByVal i) As Double Dim a2 As Double = Convert.ToDouble(Me.Labela2.Text) Dim b2 As Double = Convert.ToDouble(Me.Labelb2.Text) Dim LabelQmaxi As Double Dim ValeurSi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Surfacetotale").Value) Dim ValeurLi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("longueur").Value) Dim ValeurCi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Coefficientimpermeabilisation").Value) Dim ValeurPi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("pente").Value) i = 1 While i < 100 LabelQmaxi = ((((a2 / 60) / 6.6) * (0.28 * (ValeurLi / 100) ^ 0.84 * (ValeurSi / 10000) ^ -0.42) ^ -b2) ^ (1 / (1 - 0.287 * b2))) * (ValeurCi ^ (1 / (1 - 0.287 * b2))) * ((ValeurPi / 100) ^ (0.41 * b2 / (1 - 0.287 * b2))) * ((ValeurSi / 10000) ^ ((0.95 - 0.507 * b2) / (1 - 0.287 * b2))) * 1000 i += 1 End While Return LabelQmaxi End Function
il n'y a pas de problème à la compilation, mais une fois que je lance mon calcul, cette erreur s'affiche:
Je ne comprends pas l'erreur, pourriez-vous m'aider?L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : index
Partager