如何编写vba代码以删除和替换UTF8字符

如何编写vba代码以删除和替换UTF8字符,vba,excel,Vba,Excel,我有这段代码,但我仍然无法用简单的“占位符”替换数据中的非英语字符,如越南语或泰语 感谢您的帮助有关在VBA代码中使用正则表达式的详细信息,请参阅 然后在像这样的函数中使用正则表达式来处理字符串。这里我假设您想用占位符替换每个无效的字符,而不是整个字符串。如果是整个字符串,则不需要进行单个字符检查,只需对正则表达式模式中的多个字符使用+或*限定符,然后一起测试整个字符串 Function LatinString(str As String) As String ' After incl

我有这段代码,但我仍然无法用简单的“占位符”替换数据中的非英语字符,如越南语或泰语

感谢您的帮助

有关在VBA代码中使用正则表达式的详细信息,请参阅


然后在像这样的函数中使用正则表达式来处理字符串。这里我假设您想用占位符替换每个无效的字符,而不是整个字符串。如果是整个字符串,则不需要进行单个字符检查,只需对正则表达式模式中的多个字符使用
+
*
限定符,然后一起测试整个字符串

Function LatinString(str As String) As String
    ' After including a reference to "Microsoft VBScript Regular Expressions 5.5"
    ' Set up the regular expressions object
    Dim regEx As New RegExp
    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        ' This is the pattern of ALLOWED characters. 
        ' Note that special characters should be escaped using a slash e.g. \$ not $
        .Pattern = "[A-Za-z0-9]"
    End With

    ' Loop through characters in string. Replace disallowed characters with "?"
    Dim i As Long
    For i = 1 To Len(str)
        If Not regEx.Test(Mid(str, i, 1)) Then
            str = Left(str, i - 1) & "?" & Mid(str, i + 1)
        End If
    Next i
    ' Return output
    LatinString = str
End Function
您可以通过以下方式在代码中使用它:

Dim cell As Range
For Each cell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
    cell.Value = LatinString(cell.Value)
Next


对于不使用正则表达式而将Unicode字符串转换为UTF8字符串的字节级方法,请检查

您可以替换e中的任何字符。GASCII范围(前128个字符),带有占位符,使用以下代码:

选项显式
子测试()
Dim oCell As系列
使用CreateObject(“VBScript.RegExp”)
.Global=True
.Pattern=“[^u0000-u00F7]”
对于[A1:C4]中的每个oCell
oCell.Value=.Replace(oCell.Value,“*”)
下一个
以
端接头

在下一个语句之后,您不也需要一个i和一个单元格吗?看看如何使用
RegEx
instead@Luuklag您不必在
Next
语句之后包含计数器变量,这是一种很好的做法,因为它增加了可读性。请参阅@Wilson您是要用占位符替换非英语字符,还是要更改整个单元格(如果包含非英语字符)的值?您可能会发现它很有用,其中包含将字符串转换为UTF-8字符的代码,并在未知字符中填充
@Wolfie很好知道,但还不太老,无法学习;)为什么不忽略大小写,使用一个更简单的表达式呢?你完全可以这样做@Tom,我一直在尽可能地保持这个例子与OP模式的[简化版本]以及链接问题中给出的例子相似。将我包含的行省略会更整洁,因为默认值是
IgnoreCase=False
,我只是显示了一些选项!)
Dim cell As Range
For Each cell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
    cell.Value = LatinString(cell.Value)
Next