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

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
Je ne comprends pas l'erreur, pourriez-vous m'aider?