2017-12-27 20 views
-1

Ich habe die folgende Formel, die ich in eine Funktion in VBA konvertieren möchte.Ersetzen Sie mehrere Instanzen von Zeichen in VBA

Ich habe ein paar Dinge ausprobiert, aber es kann einfach nicht richtig funktionieren. Test

Function CharacterSwap(text) 

Dim Old As Variant 
Dim Comma As Variant 

Old = Array(")", "(", "-", "/") 
Comma = Array(",", ",", ",", ",") 

For i = LBound(Old) To UBound(Comma) 


    If InStr(1, text, Old(i), vbBinaryCompare) > 0 Then 

     CharacterSwap = Replace(text, Old(i), Comma(i), 1, 1, vbBinaryCompare) 

    End If 


Next i 

End Function 

Function SCRUB(text) 

If InStr(1, CharacterSwap(text), ",", vbBinaryCompare) > 0 Then 


SCRUB = Left((CharacterSwap(text)), InStr(1, (CharacterSwap(text)), ",") - 1) 

Else 

SCRUB = text 

End If 
End Function 
+1

auch diese Matrixformel wird tun, was Sie wollen: '= LEFT (B1, MIN (FIND ({ "(", ")", "-" , "/", ","}, B1 & "() - /,")) - 1) 'bestätigen mit Strg-Shift-Enter statt Enter. –

Antwort

0
Function CharacterSwap(text) 

Dim Old As Variant 
Dim Comma As Variant 

Old = Array(")", "(", "-", "/") 
Comma = Array(",", ",", ",", ",") 

For i = LBound(Old) To UBound(Old) 
    If InStr(1, text, Old(i), vbBinaryCompare) > 0 Then 
     'adjust the text in the text variable to maintain the changes 
     text = Replace(text, Old(i), Comma(i), 1, 1, vbBinaryCompare) 
    End If 
Next i 

CharacterSwap = text 

End Function 

Function SCRUB(text) 
Dim newtext As String 
'put output into a variable to avoid the multiple calls 
newtext = CharacterSwap(text) 

If InStr(1, newtext, ",", vbBinaryCompare) > 0 Then 
    SCRUB = Left(newtext, InStr(1, newtext, ",") - 1) 
Else 

SCRUB = text 

End If 
End Function 

Aber diese einfache Funktion, dass alle in weniger Zeilen tun:

Function Scrub(text) 
With Application 
    Scrub = Left(text, .Min(.Find(Array("(", ")", "-", "/", ","), text & "()-/,")) - 1) 
End With 
End Function 
0

Sie können dies auch in VBA mit regulären Ausdrücken erreichen. Wenn ich Sie richtig verstehe, möchten Sie alle/alle Zeichen in der Menge ()/- innerhalb einer Zeichenfolge durch ein Komma ersetzen.

Option Explicit 
Function CharacterSwap(S As String) As String 
    Dim RE As Object 
Set RE = CreateObject("vbscript.regexp") 
With RE 
    .Pattern = "[()/-]" 
    .Global = True 
    CharacterSwap = .Replace(S, ",") 
End With 

End Function 

Wenn Sie Zeichen hinzufügen, um die Zeichenklasse in .Pattern oben passieren sollte, dann sollten Sie das, dass dash - muss entweder der erste oder letzte Zeichen in der Klasse aufgeführt bewusst sein.

Wenn es irgendwo anders ist, wird es so interpretiert, dass es einen Bereich von Zeichen anzeigt, der durch die vorhergehenden und folgenden Zeichen begrenzt wird.

Mit anderen Worten

  • [0-9] würden alle Ziffern umfassen.
  • [-09] würde nur die dash, 0 und 9
Verwandte Themen