Problème d'affectation de tableau dynamique dans une fonction
9 réponses
Emcy
Bonjours,
j'ai le message d'erreur "Impossible d'affecter à un tableau qui s'affiche"
sur la ligne MaMatrice = MatriceTriangulaire(MaMatrice)
quelqu'un a-t-il une solution
Option Explicit
Sub main()
Dim MaMatrice() As String
Dim i, j, k, l As Integer
i = 1
Do Until Cells(i, 1).Value = ""
i = i + 1
Loop
i = i - 3
j = 1
Do Until Cells(1, j).Value = ""
j = j + 1
Loop
j = j - 2
ReDim MaMatrice(i, j)
For k = 0 To i
For l = 0 To j
MaMatrice(k, l) = Cells(k + 1, l + 2).Value
Next l
Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une
fraction de la forme "a/b"
Dim TableauValeurStr As Variant
Dim TableauValeurSgl(1) As Double
Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du
dénominateur
TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a
TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de
a/b
TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD
TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus
Grand Commun Diviseur
While a <> b
If a < b Then
b = b - a
Else
a = a - b
End If
Wend
PGCD = a
End Function
Function MatriceTriangulaire(ByRef Matrice() As String) As String
'Transforme la matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer
Dim LigneTemp() As String
Dim i As Integer
Dim ValeurMatrice As Double
Dim ValeurMatriceStr As String
Dim TableauValeurMatrice As Variant
Dim LigneMax As Integer
Dim CellValMax As Double
Dim CellValeur As Double
LigneNbr = UBound(Matrice, 0)
ColonneNbr = UBound(Matrice, 1)
ReDim LigneTemp(ColonneNbr, 1) 'crée un tableau servant à stocker 2 lignes
temporaire
CellValMax = StringVal(Matrice(0, 0)) 'valeur de a1,1
LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros
CellValeur = StringVal(Matrice(i, 0))
If CellValMax < CellValeur Then
LigneMax = i
CellValMax = CellValeur
End If
Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé
If LigneMax <> 0 Then 'si LigneMax différnet de 0
For i = 0 To ColonneNbr - 1
LigneTemp(0, i) = Matrice(0, i)
LigneTemp(1, i) = Matrice(LigneMax, i)
Next i
For i = 0 To ColonneNbr - 1
Matrice(LigneMax, i) = LigneTemp(0, i)
Matrice(0, i) = LigneTemp(1, i)
Next i
End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction
"a/b" en valeur numérique
Dim TableauStringVal As Variant
Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou
deux éléments
StringVal = Val(TableauStringVal(0))
Else
StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1))
End If
Je comprend pas bien ta réponse... la ligne ReDim MaMatrice(i, j) fonctionne (l'erreur est plus loin) => on peut donc redimensionner un tableau
"JpPradier" a écrit dans le message de news:uuRiLg%
Re Emcy
Regarde mon ancienne réponse :-)) Je te recopie le passage interessant : A noter qu'une matrice ne peut etre dimensionnée qu'en
variant.
j-p
JpPradier
Non au début tu ecris dim MaMatrice () as string. Tu dois écrire : Dim MaMatrice as Variant et pour tous tes tableaux pareil. Un autre truc que je viens de voir : Pour passer une Matrice à une fonction il faut préciser à la fonction que c'est une matrice avec ParamArray Ex : Function MatriceTriangulaire(ParamArray Matrice())
j-p
Non au début tu ecris dim MaMatrice () as string. Tu dois écrire :
Dim MaMatrice as Variant
et pour tous tes tableaux pareil. Un autre truc que je viens de voir : Pour passer une Matrice à une
fonction il faut préciser à la fonction que c'est une matrice avec ParamArray Ex :
Function MatriceTriangulaire(ParamArray Matrice())
Non au début tu ecris dim MaMatrice () as string. Tu dois écrire : Dim MaMatrice as Variant et pour tous tes tableaux pareil. Un autre truc que je viens de voir : Pour passer une Matrice à une fonction il faut préciser à la fonction que c'est une matrice avec ParamArray Ex : Function MatriceTriangulaire(ParamArray Matrice())
Merci, c'est vrai que ça marche mieux avec des variant Mais maintenant j'ai une erreur sur la ligne CellValMax StringVal(Matrice(0, 0)) 'valeur de a1,1 dans MatriceTriangulaire L'erreur est "Nombre de dimensions incorrect" (à la compilation)
Option Explicit
Sub main()
Dim MaMatrice() As Variant Dim i, j, k, l As Integer
i = 1 Do Until Cells(i, 1).Value = "" i = i + 1 Loop i = i - 3
j = 1 Do Until Cells(1, j).Value = "" j = j + 1 Loop j = j - 2
ReDim MaMatrice(i, j)
For k = 0 To i For l = 0 To j MaMatrice(k, l) = Cells(k + 1, l + 2).Value Next l Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Sub Main2()
Dim MaChaine As String
MaChaine = Replace(Cells(1, 1).Value, " ", "") 'enlève les espaces
MsgBox ReductionFraction(MaChaine)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une fraction de la forme "a/b"
Dim TableauValeurStr As Variant Dim TableauValeurSgl(1) As Double Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du dénominateur TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de a/b TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus Grand Commun Diviseur
While a <> b If a < b Then b = b - a Else a = a - b End If Wend
PGCD = a
End Function
Function MatriceTriangulaire(ParamArray Matrice() As Variant) As Variant 'Transforme la matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer Dim LigneTemp() As String Dim i As Integer Dim ValeurMatrice As Double Dim ValeurMatriceStr As String Dim TableauValeurMatrice As Variant Dim LigneMax As Integer Dim CellValMax As Double Dim CellValeur As Double
LigneNbr = UBound(Matrice, 0) ColonneNbr = UBound(Matrice, 1) ReDim LigneTemp(ColonneNbr, 1) 'crée un tableau servant à stocker 2 lignes temporaire
CellValMax = StringVal(Matrice(0, 0)) 'valeur de a1,1 LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros CellValeur = StringVal(Matrice(i, 0))
If CellValMax < CellValeur Then LigneMax = i CellValMax = CellValeur End If Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé If LigneMax <> 0 Then 'si LigneMax différnet de 0 For i = 0 To ColonneNbr - 1 LigneTemp(0, i) = Matrice(0, i) LigneTemp(1, i) = Matrice(LigneMax, i) Next i
For i = 0 To ColonneNbr - 1 Matrice(LigneMax, i) = LigneTemp(0, i) Matrice(0, i) = LigneTemp(1, i) Next i End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction "a/b" en valeur numérique
Dim TableauStringVal As Variant Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou deux éléments StringVal = Val(TableauStringVal(0)) Else StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1)) End If
End Function
"JpPradier" a écrit dans le message de news:eMkbHq%
Correction : Dim MaMatrice() as variant
j-p
Merci, c'est vrai que ça marche mieux avec des variant
Mais maintenant j'ai une erreur sur la ligne CellValMax StringVal(Matrice(0, 0)) 'valeur de a1,1 dans MatriceTriangulaire
L'erreur est "Nombre de dimensions incorrect" (à la compilation)
Option Explicit
Sub main()
Dim MaMatrice() As Variant
Dim i, j, k, l As Integer
i = 1
Do Until Cells(i, 1).Value = ""
i = i + 1
Loop
i = i - 3
j = 1
Do Until Cells(1, j).Value = ""
j = j + 1
Loop
j = j - 2
ReDim MaMatrice(i, j)
For k = 0 To i
For l = 0 To j
MaMatrice(k, l) = Cells(k + 1, l + 2).Value
Next l
Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Sub Main2()
Dim MaChaine As String
MaChaine = Replace(Cells(1, 1).Value, " ", "") 'enlève les espaces
MsgBox ReductionFraction(MaChaine)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une
fraction de la forme "a/b"
Dim TableauValeurStr As Variant
Dim TableauValeurSgl(1) As Double
Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du
dénominateur
TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a
TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de
a/b
TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD
TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus
Grand Commun Diviseur
While a <> b
If a < b Then
b = b - a
Else
a = a - b
End If
Wend
PGCD = a
End Function
Function MatriceTriangulaire(ParamArray Matrice() As Variant) As Variant
'Transforme la matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer
Dim LigneTemp() As String
Dim i As Integer
Dim ValeurMatrice As Double
Dim ValeurMatriceStr As String
Dim TableauValeurMatrice As Variant
Dim LigneMax As Integer
Dim CellValMax As Double
Dim CellValeur As Double
LigneNbr = UBound(Matrice, 0)
ColonneNbr = UBound(Matrice, 1)
ReDim LigneTemp(ColonneNbr, 1) 'crée un tableau servant à stocker 2 lignes
temporaire
CellValMax = StringVal(Matrice(0, 0)) 'valeur de a1,1
LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros
CellValeur = StringVal(Matrice(i, 0))
If CellValMax < CellValeur Then
LigneMax = i
CellValMax = CellValeur
End If
Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé
If LigneMax <> 0 Then 'si LigneMax différnet de 0
For i = 0 To ColonneNbr - 1
LigneTemp(0, i) = Matrice(0, i)
LigneTemp(1, i) = Matrice(LigneMax, i)
Next i
For i = 0 To ColonneNbr - 1
Matrice(LigneMax, i) = LigneTemp(0, i)
Matrice(0, i) = LigneTemp(1, i)
Next i
End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction
"a/b" en valeur numérique
Dim TableauStringVal As Variant
Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou
deux éléments
StringVal = Val(TableauStringVal(0))
Else
StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1))
End If
End Function
"JpPradier" <jp.pradier.JVeuxPasDeSpam@wanadoo.fr> a écrit dans le message
de news:eMkbHq%23bEHA.3944@tk2msftngp13.phx.gbl...
Merci, c'est vrai que ça marche mieux avec des variant Mais maintenant j'ai une erreur sur la ligne CellValMax StringVal(Matrice(0, 0)) 'valeur de a1,1 dans MatriceTriangulaire L'erreur est "Nombre de dimensions incorrect" (à la compilation)
Option Explicit
Sub main()
Dim MaMatrice() As Variant Dim i, j, k, l As Integer
i = 1 Do Until Cells(i, 1).Value = "" i = i + 1 Loop i = i - 3
j = 1 Do Until Cells(1, j).Value = "" j = j + 1 Loop j = j - 2
ReDim MaMatrice(i, j)
For k = 0 To i For l = 0 To j MaMatrice(k, l) = Cells(k + 1, l + 2).Value Next l Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Sub Main2()
Dim MaChaine As String
MaChaine = Replace(Cells(1, 1).Value, " ", "") 'enlève les espaces
MsgBox ReductionFraction(MaChaine)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une fraction de la forme "a/b"
Dim TableauValeurStr As Variant Dim TableauValeurSgl(1) As Double Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du dénominateur TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de a/b TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus Grand Commun Diviseur
While a <> b If a < b Then b = b - a Else a = a - b End If Wend
PGCD = a
End Function
Function MatriceTriangulaire(ParamArray Matrice() As Variant) As Variant 'Transforme la matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer Dim LigneTemp() As String Dim i As Integer Dim ValeurMatrice As Double Dim ValeurMatriceStr As String Dim TableauValeurMatrice As Variant Dim LigneMax As Integer Dim CellValMax As Double Dim CellValeur As Double
LigneNbr = UBound(Matrice, 0) ColonneNbr = UBound(Matrice, 1) ReDim LigneTemp(ColonneNbr, 1) 'crée un tableau servant à stocker 2 lignes temporaire
CellValMax = StringVal(Matrice(0, 0)) 'valeur de a1,1 LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros CellValeur = StringVal(Matrice(i, 0))
If CellValMax < CellValeur Then LigneMax = i CellValMax = CellValeur End If Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé If LigneMax <> 0 Then 'si LigneMax différnet de 0 For i = 0 To ColonneNbr - 1 LigneTemp(0, i) = Matrice(0, i) LigneTemp(1, i) = Matrice(LigneMax, i) Next i
For i = 0 To ColonneNbr - 1 Matrice(LigneMax, i) = LigneTemp(0, i) Matrice(0, i) = LigneTemp(1, i) Next i End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction "a/b" en valeur numérique
Dim TableauStringVal As Variant Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou deux éléments StringVal = Val(TableauStringVal(0)) Else StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1)) End If
End Function
"JpPradier" a écrit dans le message de news:eMkbHq%
Correction : Dim MaMatrice() as variant
j-p
Emcy
C'est bon j'ai trouvé l'erreur
"JpPradier" a écrit dans le message de news:eMkbHq%
Correction : Dim MaMatrice() as variant
j-p
C'est bon j'ai trouvé l'erreur
"JpPradier" <jp.pradier.JVeuxPasDeSpam@wanadoo.fr> a écrit dans le message
de news:eMkbHq%23bEHA.3944@tk2msftngp13.phx.gbl...
"JpPradier" a écrit dans le message de news:eMkbHq%
Correction : Dim MaMatrice() as variant
j-p
JpPradier
Bon, après vérification, j'ai dit une conn...ie : Il ne faut pas utiliser ParamArray pour passer une matrice ex: Appel : MaMatrice = MatriceTriangulaire(MaMatrice)
La fonction : Function MatriceTriangulaire(matrice) .. .. end function
j-p
Bon, après vérification, j'ai dit une conn...ie : Il ne faut pas utiliser ParamArray pour passer une
matrice ex:
Appel :
MaMatrice = MatriceTriangulaire(MaMatrice)
La fonction :
Function MatriceTriangulaire(matrice)
..
..
end function
Bon, après vérification, j'ai dit une conn...ie : Il ne faut pas utiliser ParamArray pour passer une matrice ex: Appel : MaMatrice = MatriceTriangulaire(MaMatrice)
La fonction : Function MatriceTriangulaire(matrice) .. .. end function
j-p
Emcy
J'ai d'autre erreurs. Maintenant j'ai une incompatibilité de type à la ligne MaMatrice = MatriceTriangulaire(MaMatrice)
Option Explicit
Sub main()
Dim MaMatrice() As Variant Dim i, j, k, l As Integer
i = 1 Do Until Cells(i, 1).Value = "" i = i + 1 Loop i = i - 2
j = 1 Do Until Cells(1, j).Value = "" j = j + 1 Loop j = j - 1
ReDim MaMatrice(i - 1, j - 1)
For k = 1 To i For l = 1 To j MaMatrice(k - 1, l - 1) = Cells(k + 1, l).Value Next l Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Sub Main2()
Dim MaChaine As String
MaChaine = Replace(Cells(1, 1).Value, " ", "") 'enlève les espaces
MsgBox ReductionFraction(MaChaine)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une fraction de la forme "a/b"
Dim TableauValeurStr As Variant Dim TableauValeurSgl(1) As Double Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du dénominateur TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de a/b TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus Grand Commun Diviseur
While a <> b If a < b Then b = b - a Else a = a - b End If Wend
PGCD = a
End Function
Function MatriceTriangulaire(Matrice() As Variant) As Variant 'Transforme la matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer Dim LigneTemp() As String Dim i As Integer Dim ValeurMatrice As Double Dim ValeurMatriceStr As String Dim TableauValeurMatrice As Variant Dim LigneMax As Integer Dim CellValMax As Double Dim CellValeur As Double
LigneNbr = UBound(Matrice, 1) ColonneNbr = UBound(Matrice, 2) ReDim LigneTemp(1, ColonneNbr) 'crée un tableau servant à stocker 2 lignes temporaire
CellValMax = Abs(StringVal(Str(Matrice(0, 0)))) 'valeur de a1,1 LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros en valeur absolue CellValeur = Abs(StringVal(Str(Matrice(i, 0))))
If CellValMax < CellValeur Then LigneMax = i CellValMax = CellValeur End If Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé If LigneMax <> 0 Then 'si LigneMax différnet de 0 For i = 0 To ColonneNbr - 1 LigneTemp(0, i) = Matrice(0, i) LigneTemp(1, i) = Matrice(LigneMax, i) Next i
For i = 0 To ColonneNbr - 1 Matrice(LigneMax, i) = LigneTemp(0, i) Matrice(0, i) = LigneTemp(1, i) Next i End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction "a/b" en valeur numérique
Dim TableauStringVal As Variant Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou deux éléments StringVal = Val(TableauStringVal(0)) Else StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1)) End If
End Function
"JpPradier" a écrit dans le message de news:uqxgh%23%
Bon, après vérification, j'ai dit une conn...ie : Il ne faut pas utiliser ParamArray pour passer une
La fonction : Function MatriceTriangulaire(matrice) .. .. end function
j-p
J'ai d'autre erreurs. Maintenant j'ai une incompatibilité de type à la ligne
MaMatrice = MatriceTriangulaire(MaMatrice)
Option Explicit
Sub main()
Dim MaMatrice() As Variant
Dim i, j, k, l As Integer
i = 1
Do Until Cells(i, 1).Value = ""
i = i + 1
Loop
i = i - 2
j = 1
Do Until Cells(1, j).Value = ""
j = j + 1
Loop
j = j - 1
ReDim MaMatrice(i - 1, j - 1)
For k = 1 To i
For l = 1 To j
MaMatrice(k - 1, l - 1) = Cells(k + 1, l).Value
Next l
Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Sub Main2()
Dim MaChaine As String
MaChaine = Replace(Cells(1, 1).Value, " ", "") 'enlève les espaces
MsgBox ReductionFraction(MaChaine)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une
fraction de la forme "a/b"
Dim TableauValeurStr As Variant
Dim TableauValeurSgl(1) As Double
Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du
dénominateur
TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a
TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de
a/b
TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD
TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus
Grand Commun Diviseur
While a <> b
If a < b Then
b = b - a
Else
a = a - b
End If
Wend
PGCD = a
End Function
Function MatriceTriangulaire(Matrice() As Variant) As Variant 'Transforme la
matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer
Dim LigneTemp() As String
Dim i As Integer
Dim ValeurMatrice As Double
Dim ValeurMatriceStr As String
Dim TableauValeurMatrice As Variant
Dim LigneMax As Integer
Dim CellValMax As Double
Dim CellValeur As Double
LigneNbr = UBound(Matrice, 1)
ColonneNbr = UBound(Matrice, 2)
ReDim LigneTemp(1, ColonneNbr) 'crée un tableau servant à stocker 2 lignes
temporaire
CellValMax = Abs(StringVal(Str(Matrice(0, 0)))) 'valeur de a1,1
LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros en valeur
absolue
CellValeur = Abs(StringVal(Str(Matrice(i, 0))))
If CellValMax < CellValeur Then
LigneMax = i
CellValMax = CellValeur
End If
Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé
If LigneMax <> 0 Then 'si LigneMax différnet de 0
For i = 0 To ColonneNbr - 1
LigneTemp(0, i) = Matrice(0, i)
LigneTemp(1, i) = Matrice(LigneMax, i)
Next i
For i = 0 To ColonneNbr - 1
Matrice(LigneMax, i) = LigneTemp(0, i)
Matrice(0, i) = LigneTemp(1, i)
Next i
End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction
"a/b" en valeur numérique
Dim TableauStringVal As Variant
Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou
deux éléments
StringVal = Val(TableauStringVal(0))
Else
StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1))
End If
End Function
"JpPradier" <jp.pradier.JVeuxPasDeSpam@wanadoo.fr> a écrit dans le message
de news:uqxgh%23%23bEHA.3512@TK2MSFTNGP12.phx.gbl...
Bon, après vérification, j'ai dit une conn...ie : Il ne faut pas utiliser
ParamArray pour passer une
J'ai d'autre erreurs. Maintenant j'ai une incompatibilité de type à la ligne MaMatrice = MatriceTriangulaire(MaMatrice)
Option Explicit
Sub main()
Dim MaMatrice() As Variant Dim i, j, k, l As Integer
i = 1 Do Until Cells(i, 1).Value = "" i = i + 1 Loop i = i - 2
j = 1 Do Until Cells(1, j).Value = "" j = j + 1 Loop j = j - 1
ReDim MaMatrice(i - 1, j - 1)
For k = 1 To i For l = 1 To j MaMatrice(k - 1, l - 1) = Cells(k + 1, l).Value Next l Next k
MaMatrice = MatriceTriangulaire(MaMatrice)
End Sub
Sub Main2()
Dim MaChaine As String
MaChaine = Replace(Cells(1, 1).Value, " ", "") 'enlève les espaces
MsgBox ReductionFraction(MaChaine)
End Sub
Function ReductionFraction(Expression As String) As String 'réduit une fraction de la forme "a/b"
Dim TableauValeurStr As Variant Dim TableauValeurSgl(1) As Double Dim MonPGCD As Double
TableauValeurStr = Split(Expression, "/") 'séparation du nominateur et du dénominateur TableauValeurSgl(0) = Val(TableauValeurStr(0)) '=> numérateur a TableauValeurSgl(1) = Val(TableauValeurStr(1)) '=> dénominateur b
MonPGCD = PGCD(TableauValeurSgl(0), TableauValeurSgl(1)) 'calcul le PGCD de a/b TableauValeurSgl(0) = TableauValeurSgl(0) / MonPGCD TableauValeurSgl(1) = TableauValeurSgl(1) / MonPGCD
Function PGCD(ByVal a, ByVal b As Double) As Double ' le PGCD est le Plus Grand Commun Diviseur
While a <> b If a < b Then b = b - a Else a = a - b End If Wend
PGCD = a
End Function
Function MatriceTriangulaire(Matrice() As Variant) As Variant 'Transforme la matrice en matrice triangulaire (méthode de gauss)
Dim ColonneNbr, LigneNbr As Integer Dim LigneTemp() As String Dim i As Integer Dim ValeurMatrice As Double Dim ValeurMatriceStr As String Dim TableauValeurMatrice As Variant Dim LigneMax As Integer Dim CellValMax As Double Dim CellValeur As Double
LigneNbr = UBound(Matrice, 1) ColonneNbr = UBound(Matrice, 2) ReDim LigneTemp(1, ColonneNbr) 'crée un tableau servant à stocker 2 lignes temporaire
CellValMax = Abs(StringVal(Str(Matrice(0, 0)))) 'valeur de a1,1 LigneMax = 0
For i = 0 To LigneNbr - 1 'recherche l'indice ai,1 le plus gros en valeur absolue CellValeur = Abs(StringVal(Str(Matrice(i, 0))))
If CellValMax < CellValeur Then LigneMax = i CellValMax = CellValeur End If Next i
'interverti la première ligne et la ligne avec ai,1 le plus élemvé If LigneMax <> 0 Then 'si LigneMax différnet de 0 For i = 0 To ColonneNbr - 1 LigneTemp(0, i) = Matrice(0, i) LigneTemp(1, i) = Matrice(LigneMax, i) Next i
For i = 0 To ColonneNbr - 1 Matrice(LigneMax, i) = LigneTemp(0, i) Matrice(0, i) = LigneTemp(1, i) Next i End If
End Function
Function StringVal(Expression As String) As Double 'converti une fraction "a/b" en valeur numérique
Dim TableauStringVal As Variant Dim ValeurStringVal As Double
TableauStringVal = Split(Expression, "/")
If UBound(TableauStringVal) = 0 Then 'regarde si TableauStringVal à un ou deux éléments StringVal = Val(TableauStringVal(0)) Else StringVal = Val(TableauStringVal(0)) / Val(TableauStringVal(1)) End If
End Function
"JpPradier" a écrit dans le message de news:uqxgh%23%
Bon, après vérification, j'ai dit une conn...ie : Il ne faut pas utiliser ParamArray pour passer une