我一直在使用以下代码用等效/可接受的替换替换重音字符:
Const AccChars = "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿø"
Const RegChars = "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyyo"
For x = 1 To dataRange
ActiveCell.Offset(1, 0).Activate
For i = 1 To Len(AccChars)
y = Mid(AccChars, i, 1)
z = Mid(RegChars, i, 1)
ActiveCell.Replace What:=y, _
Replacement:=z, _
LookAt:=xlPart, _
MatchCase:=True
Next i
Next x
由于这是针对该范围内的每个单元格逐个字符地完成的,因此在处理成千上万条记录时,该过程变得非常慢(QUITE!)。
我最近使用正则表达式替换了一个不同的char-by-char评估过程(这加快了一点),但我不确定这种特殊类型的评估和替换过程是否适合正则表达式解。
我不太熟悉在VBA平台上使用正则表达式(我可以在工作表级别上进行基本的正则表达式功能)所以我不知道我是否无法让它工作因为我太过新手无法使用它,或者我无法使它工作,因为使用正则表达式作为解决方案是不可能完成的。
我很感激能够从那些了解正则表达式的人那里得到任何建议,以便对此需求做出决定。
答案 0 :(得分:2)
以下是使用数组和替换的一些VBA代码的示例。然后将数组写回工作表(尽管在此实现中的位置不同.AccChars和RegChars需要是相同长度的字符串。
Option Explicit
Sub ReplaceAccents()
Const AccChars As String = "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿø"
Const RegChars As String = "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyyo"
Dim rSrc As Range
Dim V As Variant
Dim I As Long, J As Long
Set rSrc = Range("a1", Cells(Rows.Count, "A").End(xlUp))
V = rSrc
For I = 1 To UBound(V, 1)
For J = 1 To Len(AccChars)
V(I, 1) = Replace(V(I, 1), Mid(AccChars, J, 1), Mid(RegChars, J, 1), compare:=vbBinaryCompare)
Next J
Next I
rSrc.Offset(columnoffset:=5) = V
End Sub
答案 1 :(得分:0)
使用for循环遍历每个字母替换对并将其插入:
Selection.Replace What:=letterToReplace,Replacement:=replacementLetter,-
LookAt:=xlPart,SearchOrder:=xlByRows,MatchCase:=True,SearchFormat:=False,-
ReplaceFormat:=False