OVH Cloud OVH Cloud

Split for 97

6 réponses
Avatar
François
Bonjour =E0 tous,

Apr=E8s =EAtre aller faire un tour sur le site de FS, pour=20
adapter une macro 2000 pour excel97 avec la fonction=20
Split, mes connaissances limit=E9es en vba m'emp=E8chent de la=20
faire fonctionner.....

Ci joint la macro, qui r=E9cup=E8re en A toutes les donn=E9es=20
dans la col A, s=E9par=E9es par un "-", puis les incr=E9mente=20
dans une fonction Sommeprod.=20

Merci pour votre aide pr=E9cieuse,

Fran=E7ois

Function SplitFor97(sStr As String, sdelim As String) As=20
Variant
SplitFor97 =3D Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") &=20
"""}")
End Function
Sub InventPosMonth()

For Each cel In [A30:A35]
For Each txt In cel
X =3D SplitFor97(txt, "-")
For i =3D 0 To UBound(X)
If Len(X(i)) =3D 3 Then
laFormule =3D laFormule & "(left(ComptesG,3)=3D" &=20
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) =3D 8 Then
laFormule =3D laFormule & "(ComptesG=3D" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 9) =3D "=3Dsumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule =3D ""
Next cel
For Each cel In [A46:A50]
For Each txt In cel
X =3D Split(txt, "-")
For i =3D 0 To UBound(X)
If Len(X(i)) =3D 3 Then
laFormule =3D laFormule & "(left(ComptesG,3)=3D" &=20
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) =3D 8 Then
laFormule =3D laFormule & "(ComptesG=3D" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 7) =3D "=3Dsumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule =3D ""
Next cel
End Sub

6 réponses

Avatar
Denis Michon
Bonjour François,

Modifie la fonction à sigonneau comme ceci :

J'ai seulement ajouté par ByVal à la fonction...

'------------------
Function SplitFor97(ByVal sStr As String, sdelim As String) As Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function
'------------------


Salutations!




"François" a écrit dans le message de
news:0c7d01c3add9$c31927a0$
Bonjour à tous,

Après être aller faire un tour sur le site de FS, pour
adapter une macro 2000 pour excel97 avec la fonction
Split, mes connaissances limitées en vba m'empèchent de la
faire fonctionner.....

Ci joint la macro, qui récupère en A toutes les données
dans la col A, séparées par un "-", puis les incrémente
dans une fonction Sommeprod.

Merci pour votre aide précieuse,

François

Function SplitFor97(sStr As String, sdelim As String) As
Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") &
"""}")
End Function
Sub InventPosMonth()

For Each cel In [A30:A35]
For Each txt In cel
X = SplitFor97(txt, "-")
For i = 0 To UBound(X)
If Len(X(i)) = 3 Then
laFormule = laFormule & "(left(ComptesG,3)=" &
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) = 8 Then
laFormule = laFormule & "(ComptesG=" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 9) = "=sumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule = ""
Next cel
For Each cel In [A46:A50]
For Each txt In cel
X = Split(txt, "-")
For i = 0 To UBound(X)
If Len(X(i)) = 3 Then
laFormule = laFormule & "(left(ComptesG,3)=" &
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) = 8 Then
laFormule = laFormule & "(ComptesG=" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 7) = "=sumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule = ""
Next cel
End Sub
Avatar
Frédéric Sigonneau
Bonsoir,

Ainsi que cela est expliqué sur mon site (certes en anglais) par son auteur (Tom
Ogilvy) cette fonction renvoie un tableau de base 1 (et non 0 comme la fonction
Split d'Excel 2000).
Tu as sans doute une erreur sur les lignes

For i = 0 To UBound(X)

Modifie en choisissant l'une de ces deux syntaxes :

For i = 1 To UBound(X)
ou
For i = LBound(X) To UBound(X)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour à tous,

Après être aller faire un tour sur le site de FS, pour
adapter une macro 2000 pour excel97 avec la fonction
Split, mes connaissances limitées en vba m'empèchent de la
faire fonctionner.....

Ci joint la macro, qui récupère en A toutes les données
dans la col A, séparées par un "-", puis les incrémente
dans une fonction Sommeprod.

Merci pour votre aide précieuse,

François

Function SplitFor97(sStr As String, sdelim As String) As
Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") &
"""}")
End Function
Sub InventPosMonth()

For Each cel In [A30:A35]
For Each txt In cel
X = SplitFor97(txt, "-")
For i = 0 To UBound(X)
If Len(X(i)) = 3 Then
laFormule = laFormule & "(left(ComptesG,3)=" &
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) = 8 Then
laFormule = laFormule & "(ComptesG=" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 9) = "=sumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule = ""
Next cel
For Each cel In [A46:A50]
For Each txt In cel
X = Split(txt, "-")
For i = 0 To UBound(X)
If Len(X(i)) = 3 Then
laFormule = laFormule & "(left(ComptesG,3)=" &
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) = 8 Then
laFormule = laFormule & "(ComptesG=" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 7) = "=sumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule = ""
Next cel
End Sub


Avatar
Denis Michon
Bonjour Frédéric,

Sans rien enlever à ta judicieuse remarque, et pour ceux que la chose intéresse, Voici un exemple qui montre bien la
différence entre un paramètre d'une fonction passé par ByVal ou par ByRef .....


La fonction :

Function SplitFor97(sStr As String, sdelim As String) As Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


Le paramètre "sStr" de la fonction a comme type : "String"

Et l'ami François dans sa procédure tente de lui passer un "objet range" plutôt qu'une variable String.

La ligne de code est : For Each txt In cel
X = SplitFor97(txt, "-")
.../...

Et c'est pour ça qu'il obtient ce message d'erreur :
"Erreur de compilarion - type d'argument ByRef incompatible"


IL y a 2 façons de s'en sortir :

A )
En ajoutant à la déclaration du paramètre de la fonction "ByVal" , c'est le contenu du "range" qui est passé à la
fonction plutôt que l'objet.

B ) François aurait pu modifier son code comme ceci :
For Each txt In cel
X = SplitFor97(txt.text, "-")
.../...

À l'objet Txt défini dans cette procédure comme un objet Range, il aurait pu ajouter la propriété "Text" pour passer
à la fonction un "String" comme le demande la fonction....


Faites votre choix quant à la méthode que vous préférez !

;-)



Salutations!









"Frédéric Sigonneau" a écrit dans le message de news:
Bonsoir,

Ainsi que cela est expliqué sur mon site (certes en anglais) par son auteur (Tom
Ogilvy) cette fonction renvoie un tableau de base 1 (et non 0 comme la fonction
Split d'Excel 2000).
Tu as sans doute une erreur sur les lignes

For i = 0 To UBound(X)

Modifie en choisissant l'une de ces deux syntaxes :

For i = 1 To UBound(X)
ou
For i = LBound(X) To UBound(X)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour à tous,

Après être aller faire un tour sur le site de FS, pour
adapter une macro 2000 pour excel97 avec la fonction
Split, mes connaissances limitées en vba m'empèchent de la
faire fonctionner.....

Ci joint la macro, qui récupère en A toutes les données
dans la col A, séparées par un "-", puis les incrémente
dans une fonction Sommeprod.

Merci pour votre aide précieuse,

François

Function SplitFor97(sStr As String, sdelim As String) As
Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") &
"""}")
End Function
Sub InventPosMonth()

For Each cel In [A30:A35]
For Each txt In cel
X = SplitFor97(txt, "-")
For i = 0 To UBound(X)
If Len(X(i)) = 3 Then
laFormule = laFormule & "(left(ComptesG,3)=" &
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) = 8 Then
laFormule = laFormule & "(ComptesG=" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 9) = "=sumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule = ""
Next cel
For Each cel In [A46:A50]
For Each txt In cel
X = Split(txt, "-")
For i = 0 To UBound(X)
If Len(X(i)) = 3 Then
laFormule = laFormule & "(left(ComptesG,3)=" &
"""" & X(i) & """" & ")+"
ElseIf Len(X(i)) = 8 Then
laFormule = laFormule & "(ComptesG=" & """" & X
(i) & """" & ")+"
End If
Next i
Next txt
On Error Resume Next
Cells(cel.Row, 7) = "=sumproduct((" & Left(laFormule, Len
(laFormule) - 1) & ")*Solde)"
laFormule = ""
Next cel
End Sub


Avatar
Frédéric Sigonneau
Bonsoir Denis,


[snip]
Le paramètre "sStr" de la fonction a comme type : "String"

Et l'ami François dans sa procédure tente de lui passer un "objet range" plutôt qu'une variable String.

La ligne de code est : For Each txt In cel
X = SplitFor97(txt, "-")

Et c'est pour ça qu'il obtient ce message d'erreur :
"Erreur de compilarion - type d'argument ByRef incompatible"
[re-snip]



Je dirais plutôt que "l'ami François", au vu du code qui nous a été transmis,
essaye de passer un paramètre (txt) dont le type n'est pas déclaré, ce qui
revient à le déclarer implicitement en Variant, alors que la fonction attend
explicitement un String, comme tu le notes justement. C'est, AMA, ce qui
provoque ce message d'erreur et dans ce cas, il suffit de déclarer txt en String
pour calmer la fureur du 'compilateur'.
A cela s'ajoute peut-être le fait que cette boucle For Each txt etc. n'est pas
forcément indispensable pour ce qu'il essaye de faire. A mon avis, il pourrait
suffire, après avoir déclaré la variable cel en Range, de boucler sur les seules
cellules :

For Each cel In [A30:A35]
X = SplitFor97(cel.Text, "-")

La propriété Text des cellules renvoyant une chaine de caractères, le paramètre
passé à la fonction SplitFor97 sera du type attendu, donc, normalement, pas
d'erreur...

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Avatar
Denis Michon
Bonsoir Frédéric,

Essaie ceci : Même si la variable txt est déclaré comme un "range" cela provoque quand même le même type d'erreur que
François a décelé !

Pour éviter l'erreur, il aurait dû écrire : For Each txt.text In Range("A1:A5")... ce que mes explications tentaient de
démontrer...


'-------------------
Function SplitFor97(sStr As String, sdelim As String) As Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function
'-------------------

Sub LaBoucle()

Dim txt As Range

For Each txt In Range("A1:A5")
X = SplitFor97(txt, "-")
Next

End Sub
'-------------------


Salutations!



"Frédéric Sigonneau" a écrit dans le message de news:
Bonsoir Denis,


[snip]
Le paramètre "sStr" de la fonction a comme type : "String"

Et l'ami François dans sa procédure tente de lui passer un "objet range" plutôt qu'une variable String.

La ligne de code est : For Each txt In cel
X = SplitFor97(txt, "-")

Et c'est pour ça qu'il obtient ce message d'erreur :
"Erreur de compilarion - type d'argument ByRef incompatible"
[re-snip]



Je dirais plutôt que "l'ami François", au vu du code qui nous a été transmis,
essaye de passer un paramètre (txt) dont le type n'est pas déclaré, ce qui
revient à le déclarer implicitement en Variant, alors que la fonction attend
explicitement un String, comme tu le notes justement. C'est, AMA, ce qui
provoque ce message d'erreur et dans ce cas, il suffit de déclarer txt en String
pour calmer la fureur du 'compilateur'.
A cela s'ajoute peut-être le fait que cette boucle For Each txt etc. n'est pas
forcément indispensable pour ce qu'il essaye de faire. A mon avis, il pourrait
suffire, après avoir déclaré la variable cel en Range, de boucler sur les seules
cellules :

For Each cel In [A30:A35]
X = SplitFor97(cel.Text, "-")

La propriété Text des cellules renvoyant une chaine de caractères, le paramètre
passé à la fonction SplitFor97 sera du type attendu, donc, normalement, pas
d'erreur...

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Avatar
Frédéric Sigonneau
Re Denis,


Bonsoir Frédéric,

Essaie ceci : Même si la variable txt est déclaré comme un "range" cela provoque quand même le même type d'erreur que
François a décelé !


Normal :)
La fonction SplitFor97 attend un paramètre String et pas autre chose (Ni Variant
ni Range ni..).
Mais si txt est déclaré As Range alors X = SplitFor97(txt.Text, "-") ne provoque
pas d'erreur, la propriété Text de l'objet Range étant du type attendu (String).

Bon, on ne va pas faire la soirée là-dessus :) D'autant que le demandeur s'est
déclaré tiré d'affaire par tes bons soins dans un autre fil hier !
:-)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Pour éviter l'erreur, il aurait dû écrire : For Each txt.text In Range("A1:A5")... ce que mes explications tentaient de
démontrer...

'-------------------
Function SplitFor97(sStr As String, sdelim As String) As Variant
SplitFor97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function
'-------------------

Sub LaBoucle()

Dim txt As Range

For Each txt In Range("A1:A5")
X = SplitFor97(txt, "-")
Next

End Sub
'-------------------

Salutations!

"Frédéric Sigonneau" a écrit dans le message de news:
Bonsoir Denis,


[snip]
Le paramètre "sStr" de la fonction a comme type : "String"

Et l'ami François dans sa procédure tente de lui passer un "objet range" plutôt qu'une variable String.

La ligne de code est : For Each txt In cel
X = SplitFor97(txt, "-")

Et c'est pour ça qu'il obtient ce message d'erreur :
"Erreur de compilarion - type d'argument ByRef incompatible"
[re-snip]


Je dirais plutôt que "l'ami François", au vu du code qui nous a été transmis,
essaye de passer un paramètre (txt) dont le type n'est pas déclaré, ce qui
revient à le déclarer implicitement en Variant, alors que la fonction attend
explicitement un String, comme tu le notes justement. C'est, AMA, ce qui
provoque ce message d'erreur et dans ce cas, il suffit de déclarer txt en String
pour calmer la fureur du 'compilateur'.
A cela s'ajoute peut-être le fait que cette boucle For Each txt etc. n'est pas
forcément indispensable pour ce qu'il essaye de faire. A mon avis, il pourrait
suffire, après avoir déclaré la variable cel en Range, de boucler sur les seules
cellules :

For Each cel In [A30:A35]
X = SplitFor97(cel.Text, "-")

La propriété Text des cellules renvoyant une chaine de caractères, le paramètre
passé à la fonction SplitFor97 sera du type attendu, donc, normalement, pas
d'erreur...

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !