Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'affectation de tableau dynamique dans une fonction

9 réponses
Avatar
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

ReductionFraction = Trim(Str(TableauValeurSgl(0))) + "/" +
Trim(Str(TableauValeurSgl(1)))

End Function

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

End Function

9 réponses

Avatar
JpPradier
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
Avatar
Emcy
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



Avatar
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
Avatar
JpPradier
Correction : Dim MaMatrice() as variant

j-p
Avatar
Emcy
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

ReductionFraction = Trim(Str(TableauValeurSgl(0))) + "/" +
Trim(Str(TableauValeurSgl(1)))

End Function

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


Avatar
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


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

ReductionFraction = Trim(Str(TableauValeurSgl(0))) + "/" +
Trim(Str(TableauValeurSgl(1)))

End Function

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

matrice ex:
Appel :
MaMatrice = MatriceTriangulaire(MaMatrice)

La fonction :
Function MatriceTriangulaire(matrice)
..
..
end function

j-p



Avatar
JpPradier
Il ne faut pas mettre les parentheses a Matrice :

Function MatriceTriangulaire(Matrice As Variant) As Variant

j-p