wake-up-neo.com

Sonderzeichen entfernen VBA Excel

Ich verwende VBA, um einige TITLES zu lesen und diese Informationen dann in eine PowerPoint-Präsentation zu kopieren.

Mein Problem ist, dass die TITLES Sonderzeichen haben, aber Bilddateien, die ich auch kopiere, nicht.

Der TITLE bildet einen Teil eines Pfads, um ein JPEG in einen Bildcontainer zu laden. Z.B. "P k.jpg", aber der Titel heißt "p.k".

Ich möchte in der Lage sein, die Sonderzeichen im TITLE zu ignorieren und dafür zu sorgen, dass stattdessen ein Leerzeichen angezeigt wird, sodass die richtige JPG-Datei angezeigt wird.

Ist das möglich?

Vielen Dank!

5
pixie

Was halten Sie für "besondere" Charaktere, nur für einfache Interpunktion? Sie sollten die Replace-Funktion verwenden können: Replace("p.k","."," ")

Sub Test()
Dim myString as String
Dim newString as String

myString = "p.k"

newString = replace(myString, ".", " ")

MsgBox newString

End Sub

Wenn Sie mehrere Zeichen haben, können Sie dies in einer benutzerdefinierten Funktion oder einer einfachen verketteten Reihe von Replace-Funktionen usw. durchführen.

  Sub Test()
Dim myString as String
Dim newString as String

myString = "!p.k"

newString = Replace(Replace(myString, ".", " "), "!", " ")

'## OR, if it is easier for you to interpret, you can do two sequential statements:
'newString = replace(myString, ".", " ")
'newString = replace(newString, "!", " ")

MsgBox newString

End Sub

Wenn Sie viele potenzielle Sonderzeichen (z. B. nicht englischsprachige Ascii?) Haben, können Sie eine benutzerdefinierte Funktion oder Iteration über ein Array ausführen.

Const SpecialCharacters As String = "!,@,#,$,%,^,&,*,(,),{,[,],},?"  'modify as needed
Sub test()
Dim myString as String
Dim newString as String
Dim char as Variant
myString = "!p#*@)k{kdfhouef3829J"
newString = myString
For each char in Split(SpecialCharacters, ",")
    newString = Replace(newString, char, " ")
Next
End Sub
28
David Zemens

Für den Fall, dass Sie nicht nur eine Liste von Sonderzeichen ausschließen möchten, sondern all Zeichen, die keine Buchstaben oder Zahlen sind, ausschließen möchten, würde ich vorschlagen, dass Sie einen Char-Typ-Vergleich verwenden.

Für jedes Zeichen im String würde ich prüfen, ob das Unicode-Zeichen zwischen "A" und "Z", zwischen "a" und "z" oder zwischen "0" und "9" liegt. Dies ist der vba-Code:

Function cleanString(text As String) As String
    Dim output As String
    Dim c 'since char type does not exist in vba, we have to use variant type.
    For i = 1 To Len(text)
        c = Mid(text, i, 1) 'Select the character at the i position
        If (c >= "a" And c <= "z") Or (c >= "0" And c <= "9") Or (c >= "A" And c <= "Z") Then
            output = output & c 'add the character to your output.
        Else
            output = output & " " 'add the replacement character (space) to your output
        End If
    Next
    cleanString = output
End Function

Die Wikipedia-Liste der Unicode-Zeichen ist ein guter Schnellstart, wenn Sie diese Funktion etwas mehr anpassen möchten.

Diese Lösung hat den Vorteil, dass sie auch dann funktionsfähig ist, wenn der Benutzer einen Weg findet, neue Sonderzeichen einzuführen. Es ist auch schneller als zwei Listen miteinander zu vergleichen.

7
V. Brunelle

So entfernen Sie Sonderzeichen.

Ich habe einfach Regex angewendet

Dim strPattern As String: strPattern = "[^a-zA-Z0-9]" 'The regex pattern to find special characters
Dim strReplace As String: strReplace = "" 'The replacement for the special characters
Set regEx = CreateObject("vbscript.regexp") 'Initialize the regex object    
Dim GCID As String: GCID = "Text #N/A" 'The text to be stripped of special characters

' Configure the regex object
With regEx
    .Global = True
    .MultiLine = True
    .IgnoreCase = False
    .Pattern = strPattern
End With

' Perform the regex replacement
GCID = regEx.Replace(GCID, strReplace)
4
GuruKay

Das ist was ich benutze, basierend auf diesem link

Function StripAccentb(RA As Range)

Dim A As String * 1
Dim B As String * 1
Dim i As Integer
Dim S As String
'Const AccChars = "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ"
'Const RegChars = "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy"
Const AccChars = "ñéúãíçóêôöá" ' using less characters is faster
Const RegChars = "neuaicoeooa"
S = RA.Cells.Text
For i = 1 To Len(AccChars)
A = Mid(AccChars, i, 1)
B = Mid(RegChars, i, 1)
S = Replace(S, A, B)
'Debug.Print (S)
Next


StripAccentb = S

Exit Function
End Function

Verwendungszweck:

=StripAccentb(B2) ' cell address

Subversion für alle Zellen in einem Arbeitsblatt:

Sub replacesub()
Dim A As String * 1
Dim B As String * 1
Dim i As Integer
Dim S As String
Const AccChars = "ñéúãíçóêôöá" ' using less characters is faster
Const RegChars = "neuaicoeooa"
Range("A1").Resize(Cells.Find(what:="*", SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _
Cells.Find(what:="*", SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Column).Select '
For Each cell In Selection
If cell <> "" Then
S = cell.Text
    For i = 1 To Len(AccChars)
    A = Mid(AccChars, i, 1)
    B = Mid(RegChars, i, 1)
    S = replace(S, A, B)
    Next
cell.Value = S
Debug.Print "celltext "; (cell.Text)
End If
Next cell
End Sub
2
Ferroao