Pb de concaténation de chaînes

Résolu
ahikaz Messages postés 71 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 7 décembre 2007 - 15 févr. 2007 à 14:49
ahikaz Messages postés 71 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 7 décembre 2007 - 15 févr. 2007 à 17:49
Salut,
J'espère qu'il y a quelqu'un qui pourra m'aider dans mon petit problème.
En effet, j'ai une chaîne de caractère comme entrée dans ma fonction et sur cette chaîne je veux faire des modifications sur quelques mots qui la composent.


Prenons par exemple la chaîne suivante :
select var1,var10 from LaTable where var23 = 10;


Je veux que chaque mot qui contient "var" sera concaténé par "TT" donc comme résultat final j'aurai :
select var1TT,var10TT from LaTable where var23TT = 10;


J'ai essayé avec le replace mais le problème est le chiffre présent après "var".


Donc, si quelqu'un a une idée comment résoudre cela.
Merci.

8 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 févr. 2007 à 17:06
code modifié un ptit peu, çà donne çà :

Option Explicit

Private Sub Form_Load()
    Dim aArr1(30) As String, aArr2(30) As String,
sStr As String, i
As Integer

'   init
les tableaux
    For i =  0 To 30
        aArr1(i) = "var" & i & "
"
        aArr2(i) = "var" & i & "TT "
    Next i

'   chaîne
    sStr = "select var1,var10 from LaTable
where var23 = 10;"

'  
resultat
    MsgBox sStr & vbCrLf & Replace(MultiReplace(Replace(sStr, ",", "
,"), aArr1, aArr2), "
,", ",")

    Unload Me
End Sub

Function MultiReplace(ByVal Expression As String, aFind() As String, aReplace() As String) As String
    Dim i&, lPos&, UboundReplace%, sBuffer$

'   tableaux dimentionnés?
    If (Not (Not aFind)) = 0 Then MultiReplace = Expression: Exit
Function
    If (Not (Not aReplace)) = 0 Then UboundReplace = -1 Else UboundReplace = UBound(aReplace)

'   chaque élément du
tableau à chercher
    If UboundReplace = -1 Then
        For i = LBound(aFind) To UBound(aFind)
            Call MonoReplace(Expression, aFind(i),
vbNullString)
        Next i
    ElseIf UboundReplace >= UBound(aFind) Then
        For i = LBound(aFind) To UBound(aFind)
            Call MonoReplace(Expression, aFind(i),
aReplace(i))
        Next i
    Else
        For i = LBound(aFind) To UBound(aFind)
            Call MonoReplace(Expression, aFind(i),
aReplace(UBound(aReplace)))
        Next i
    End If
    MultiReplace = Expression
End Function

Sub MonoReplace(ByRef Expression As String, sFind As String, sReplace As String)
    Dim lPos&
    Do
        lPos = InStr(1, Expression, sFind)
        If lPos > 0 Then Expression = Left$(Expression, lPos - 1) & sReplace & Right$(Expression, Len(Expression) - lPos - Len(sFind) + 1)
    Loop Until lPos = 0
End Sub

<small>Coloration
syntaxique automatique [AFCK] </small>
       

quant à l'explication, la "solution" sert pourtant de traduction

fait ceci :
i =3
msgbox (i=4)

tu vois? i ne s'initialise pas à 4 pour autant.
tu fais pareil avec ton while i=instr(blabla)>0, sauf  qu'en plus tu utilises mal instr

++
PCPT  [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
3
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
15 févr. 2007 à 14:52
Salut, fais une petite recherche sur www.codyx.org et le tour est joué!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
ahikaz Messages postés 71 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 7 décembre 2007
15 févr. 2007 à 15:13
Merci pour la réponse.
Est ce que  c'est pas possible d'utiliser le "?" ou bien "*" pour désigner la présence d'autres caractères dans la chaîne ? Ainsi, je pourrai écrire Replace(chaine,"varIciLe*","varIciLe*TT")
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 févr. 2007 à 16:02
salut,
de toute façon tes "varN" étant des variables, tu ne pourras pas renommer des variables, ta requète cherchera le champ nommé "varNTT" et non son contenu.

à moins que çà soit réellement le nom de tes champs?...
dans quel cas tu peux utiliser cette fonction, avec les arguments en tableau

++
PCPT  [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ahikaz Messages postés 71 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 7 décembre 2007
15 févr. 2007 à 16:04
Bon, je voulais essayer avec ce bout de code mais apparament il n'entre jamais dans la boucle et je ne comprends pas pourquoi.

Do While ((i = InStr(chaine, "var")) > 0)
        If (Mid$(chaine, i+3, 1) = " ") Then
            Mid$(in_SQL, i + 4, 1) = "TT"
        End If
Loop

Merci.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 févr. 2007 à 16:14
traduction :
Do While ((i = InStr(chaine, "var")) > 0)

do -> fait
while -> tant que(i InStr(chaine, "var") -> booléen, i ou <> de POSITION_NUMERIQUE_DE_DEPART***variable_chaine, dans "var", on cherche rien
>0 -> vrai

euh..... beh si, lka traduction est bonne

solution :
utiliser instr comme il se doit -> i = instr(position de départ (1 ou i), chaîne à lire, chaîne à trouver)
faire le while sur i

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
ahikaz Messages postés 71 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 7 décembre 2007
15 févr. 2007 à 16:25
Merci pour la réponse. Les "VarN" sont du texte normal donc pas des variables dans ce cas là.
Sinon, j'ai visité le lien proposé mais d'après la première lecture je crois qu'il ne prend pas en considération les caractères après le mot "var" donc on aura comme résultat "VarTTN" et non "VarNTT" comme souhaité.

Sinon, pour la 2ème réponse :
je veux que le "i" pointe à chaque fois sur le début de la variable var donc qu'on parcourt toute la chaîne. Sinon, j'ai pas bien compris qu'est ce que tu voulais dire par ça : do -> fait
while -> tant que(i InStr(chaine, "var") -> booléen, i ou <> de POSITION_NUMERIQUE_DE_DEPART***variable_chaine, dans "var", on cherche rien
>0 -> vrai

Merci.
0
ahikaz Messages postés 71 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 7 décembre 2007
15 févr. 2007 à 17:49
Un très grand merci
0
Rejoignez-nous