Mini-fonction replace pour vb5

Soyez le premier à donner votre avis sur cette source.

Vue 4 832 fois - Téléchargée 149 fois

Description

Remplacement d'un nombre défini d'occurences, ou de toutes celles d'une sous-chaîne, par une autre.
Destinée à remplacer la fonction "Replace" non implémentée en VB5 (sic SCALPWEB).
Les arguments sont les mêmes que pour "Replace", afin d'assurer la compatibilité le jour où l'utilisateur passe à une autre version de VB. Ceux-ci sont décrits dans l'en-tête de la fonction.
Cette fonction, actuellement nommée "ReplaceT", pour éviter les conflits, pourra être renommée "Replace" en VB5.

Source / Exemple :


Attribute VB_Name = "ReplaceTst"
' REDLUPUS 2004 : Remplacement de la fonction "Replace" non
' implémentée en VB5
' ======================================================
Public Function ReplaceT(ByVal Expression As String, _
                         ByVal Find As String, _
                         ByVal Replace As String, _
                Optional ByVal Start As Long = 1, _
                Optional ByVal Count As Long = -1, _
                Optional ByVal Compare As Integer = vbTextCompare) _
                As String
' ------------------------------------------------------
' Destinée à remplacer la fonction "Replace" non
' implémentée en VB5.
' Les arguments sont les mêmes que pour "Replace", afin
' d'assurer la compatibilité le jour où l'utilisateur
' passe à une autre version de VB.
'   Expression      Chaîne sur laquelle le traitement doit
'                   être effectué
'   Find            Sous-chaîne à trouver
'   Replace         Sous-chaîne à substituer à "Find"
'  [Start]          défaut : 1
'                   position de début du traitement.
'                   Remarqes :
'                   1 - Quel que soit le traitement, la
'                       chaîne sera amputée des caractères
'                   2 - Si Start est supérieur à la longueur
'                       d'"Expression", une chaine vide
'                       est retournée.
'  [Count]          défaut : -1
'                   Nombre de substitutions à effectuer. "-1"
'                   permet de substituer TOUTES les occurences
'                   de "Find"
'  [Compare]        défaut : vbTextCompare
'                   Type de comparaison
'                   Pour mémoire, les autres valeurs possibles
'                   sont :
'                       vbDatabaseCompare
'                       vbBinaryCompare
'                       vbUseCompareOption
' ======================================================
Dim P As Long           ' position 1er caractère à tester
Dim L As Long           ' longueur de expression
Dim F As Long           ' longueur de la chaîne à remplacer
Dim R As Long           ' longueur chaîne de remplacement

' argument "Start" : élimination du début de chaîne
Let L = Len(Expression)
If Start > L Then
    ' parceque "Right$" n'accepte pas 1 taille négative
    Let Expression = vbNullString
ElseIf Start > 1 Then
    ' troncature d'"Expression"
    Let Expression = Right$(Expression, L - Start + 1)
    End If

ReplaceT = Expression   ' valeur retour par défaut

' argument "Find" : si chaîne vide, on retourne "Expression".
If Find = vbNullString Then Exit Function
Let F = Len(Find)

Let R = Len(Replace)    ' Taille de la chaîne de remplacement
Let P = 1               ' on commence à la première position
If Count <> 0 Then
    Do
        ' La taille d'"Expression" peut varier lors de chaque
        ' remplacement (si "Find" et "Replace" sont de longueurs
        ' différentes), c'est pourquoi l'instruction suivante
        ' est située DANS la boucle.
        Let L = Len(Expression)
        ' position de la sous-chaîne à remplacer...
        Let P = InStr(P, Expression, Find, Compare)
        ' ... si elle y figure bien
        If P > 0 Then
            Let Expression = Left$(Expression, P - 1) + _
                             Replace + _
                             Right$(Expression, (L - P - F + 1))
            ' décalage 1er caractère à comparer (position trouvée
            ' + taille de la chaîne de remplacement)
            Let P = P + R
            ' Un remplacement de moins à effectuer (si "Count">0)
            ' on continue indéfiniment si "Count" < 0
            Let Count = Count - 1
            End If
        ' Si le compteur atteint zéro (cas où on voulait un nombre
        ' défini de substitutions), où s'il n'y a plus de
        ' remplacements possibles, on sort.
        Loop Until (P <= 0) Or (Count = 0)
    End If
ReplaceT = Expression       ' retour..
End Function

Conclusion :


Comme je répondais à RENFIELD, "pourquoi je n'ai pas utilisé la fonction 'replace' de VB ?... je ne sais pas (j'utilise VBA et 'replace' existe) ! Ahhhh..lzheimer me guette !!!".
Mais si cette fonction n'est pas implémentée en VB5 (merci à SCALPWEB de me l'avoir indiqué), alors pourquoi ne pas fournir un code qui prend en charge, au moins le type de comparaison "vbTextCompare".

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
ok ok.

bonne continuation ;)
Messages postés
5
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
17 août 2004

Merci à RENFIELD et SCALPWEB pour leurs commentaires constructifs.
Pourquoi j'utilise "Let" ? Je sais, c'est inutile. Une déformation, sans doute, car avant je pratiquais le "Pascal" où les instructions d'affectation sont bien différenciées. Pour "Let", c'est la même idée, un souci de lisibilité.
Par ailleurs, en Basic, je crois que je vais délaisser "Right$" au profit de "Mid$", quand même beaucoup plus souple : pas besoin de se "traîner" la longueur de la chaîne avec "Mid$". Pourquoi ai-je (avais-je) l'habitude d'utiliser "Right$" ? Même raison : lisibilité. Mais.. çà a un prix qui s'appelle... perte d'efficacité.
Dans tous les cas, MERCI pour les remarques qui me permettent de progresser, ce qui, sommes toutes, est essentiel (du moins pour moi).
Messages postés
1467
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
3
Oui, effectivement, tu devrais mettre rapidment ta source à jour.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Salut ;)

j'ai testé ta fonction... elle comporte des bugs...


voici une version corrigée (et qui supporte l'argument Compare....)


Public Function ReplaceR(ByVal Expression As String, ByVal Find As String, ByVal Replace As String, Optional ByVal Start As Long 1, Optional ByVal Count As Long -1, Optional ByVal Compare As VbCompareMethod = vbTextCompare) As String
Dim P As Long: P = 1
Dim LFind As Long: LFind = Len(Find)
Dim LReplace As Long: LReplace = Len(Replace)

Select Case Start
Case Is <= 0
Err.Raise 5
Case Is > Len(Expression)
Exit Function
Case Else
Expression = Mid$(Expression, Start)
End Select

ReplaceR = Expression

If Find vbNullString Or Count 0 Then Exit Function
Do
Let P = InStr(P, Expression, Find, Compare)

If P > 0 Then
Expression = Left$(Expression, P - 1) & Replace & Mid$(Expression, P + LFind)

Count = Count - 1
P = P + LReplace
End If
Loop Until (P <0) Or (Count 0)

ReplaceR = Expression
End Function


Buggée ? oui, car tu recommence la recherche a partie du premier caractère a chaque fois....

replacet("ABBCC", "BC", "")
-> ACC au lieu de ABC

(au fait, pourquoi utilises tu 'Let' ?)
Messages postés
1467
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
3
Je confirme, cette fonction n'est pas intégré dans VB5 (tu moins dans MON VB5 et je doute qu'il soit différent des autres).
Je comptais développé une dll contennant toutes les fonctions en moins de VB5. Je sais qu'il y a Replace, et Splite. Si qqn en connait d'autre, je suis prenneur.

Sinon, bien ta source ! :-)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.