Excel VBA替换字符 - char-by-char vs regex(?)

时间:2013-12-09 18:27:55

标签: regex excel vba excel-vba

我一直在使用以下代码用等效/可接受的替换替换重音字符:

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平台上使用正则表达式(我可以在工作表级别上进行基本的正则表达式功能)所以我不知道我是否无法让它工作因为我太过新手无法使用它,或者我无法使它工作,因为使用正则表达式作为解决方案是不可能完成的。

我很感激能够从那些了解正则表达式的人那里得到任何建议,以便对此需求做出决定。

2 个答案:

答案 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