2017-05-09 3 views
1

J'aurais juré que je l'ai dépouillé CRLF dans le passé, mais ne sais pas pourquoi ce qui suit ne fonctionne pas:Pourquoi ne pas VBA fonction Replace travail avec CRLF dans Word et Excel

myString = "ABC" & vbCrLf & "DEF" 
str1 = Replace(myString, vbLf, "") 
str2 = Replace(str1, vbCrLf, "") 
str3 = Replace(str2, vbNewLine, "") 
MsgBox str3 

Le code ci-dessus doesn « t travailler le résultat est:

ABC 
DEF 

myString = "ABC" & vbCrLf & "DEF" 
str1 = Replace(myString, Chr(13), "") 
str2 = Replace(str1, Chr(10), "") 
MsgBox str2 

le code précède ne fonctionne le résultat est:

ABCDEF 

Solution: Merci @ Mat pour la réponse (Le problème sur le premier code était l'ordre que je tentais de supprimer les éléments) VbCrLf & vbNewLine est la même et essayer de supprimer le combo vbCr + vbLf après le retrait vbLf ne fonctionnera pas

Répondre

2

La prémisse est erronée:

myString = "ABC" & vbCrLf & "DEF" 

La chaîne est faite de "ABC", vbCrLf et "DEF".

vbCrLf est vbCr et vbLf, ce qui sur toute boîte de Windows est vbNewLine.

Quand vous faites:

str1 = Replace(myString, vbLf, "") 

Vous remplacez vbLfet laisser le caractère vbCr en place.

str2 = Replace(str1, vbCrLf, "") 

Ensuite, vous remplacez vbCrLfmais vbLf est déjà allé si vbCrLf est pas dans la chaîne.

str3 = Replace(str2, vbNewLine, "") 

Ensuite, vous remplacez vbNewLine qui fait essentiellement la même chose que l'instruction précédente, et le résultat est une chaîne qui a été dépouillé de vbLfmais contient encore vbCr.

Ce code fonctionne comme prévu:

Sub Test() 
    Dim foo As String 
    foo = "foo" & vbCrLf & "bar" 
    Debug.Print foo 
    foo = Replace(foo, vbNewLine, vbNullString) 
    Debug.Print foo 
End Sub 

Comme le fait:

Sub Test() 
    Dim foo As String 
    foo = "foo" & vbNewLine & "bar" 
    Debug.Print foo 
    foo = Replace(foo, vbNewLine, vbNullString) 
    Debug.Print foo 
End Sub 

Ou ceci:

Sub Test() 
    Dim foo As String 
    foo = "foo" & vbNewLine & "bar" 
    Debug.Print foo 
    foo = Replace(foo, vbCrLf, vbNullString) 
    Debug.Print foo 
End Sub 

Ou encore ceci:

Sub Test() 
    Dim foo As String 
    foo = "foo" & vbNewLine & "bar" 
    Debug.Print foo 
    foo = Replace(foo, vbCr, vbNullString) 
    foo = Replace(foo, vbLf, vbNullString) 
    Debug.Print foo 
End Sub 

Votre deuxième fonctionne bout comme prévu, parce que vous faites enlever les deux vbCr (Chr(13)) et vbLf (Chr(10)) caractères. Aussi simple que cela.

+0

Wow c'était la commande. Merci beaucoup pour cette précision. Je n'y ai jamais pensé de cette façon (cette fois-ci) mais je l'ai utilisé dans le passé et j'y ai dû réfléchir plus logiquement. Merci encore –

+0

@MickeyD bien ... ce n'était pas * l'ordre. Votre code a supprimé 'vbLf' et laissé' vbCr' dans la chaîne; tout autre remplacement impliquant 'vbCrLf' et' vbNewLine' était non-op. Règle générale, si vous utilisez Windows, vous n'avez pas besoin de vous préoccuper de 'vbCr',' vbLf' ou 'vbCrLf' - il suffit d'utiliser' vbNewLine' et tout fonctionnera. Si le premier remplacement était pour 'vbNewLine', alors tout autre remplacement' vbCrLf' ou 'vbCr' ou' vbLf' serait également non-op. Notez également 'vbNullString' au lieu de' "" '; ce dernier est alloué 2 octets entiers, le premier est un pointeur nul de 0 octet. –

+0

@Matt merci, mais je dois expliquer poliment clairement la façon dont je voulais l'expliquer. Pensez-y de cette façon. Si j'avais utilisé str2 = Replace (myString, vbCrLf, "") d'abord, cela aurait marché. Je l'ai juste essayé par lui-même et ça a bien fonctionné. Je n'avais pas besoin de les supprimer individuellement: VbCr ou VbLf. Il n'y aurait pas de chr (10) ou chr (13) à enlever dans les étapes suivantes, donc si je voudrais essayer de les supprimer après, mon résultat sera toujours correct, mais il aurait gaspillé 2 lignes de code supplémentaires. Voyez-vous ce que je dis? –