2013-12-09 15 views
1

我已經使用以下代碼以當量/可接受的替代品來取代重音字符:Excel VBA中替換字符 - 炭通過炭VS正則表達式

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

而不是激活的每個小區,讀取整個範圍劃分爲陣列工藝在單個寫入的陣列和輸出陣列結果我會想象是速度問題的原因。另外,你可以使用.Replace作爲範圍,而不是單個單元格。 – user3357963

+0

感謝你改變方法。我從來沒有在pl中使用範圍數組在一定範圍內循環訪問每一個單元格的王牌(如果那是不好的形式,那麼這只是因爲我是自學成才的,從來不知道有這樣做的另一種方式)。因此,我將測試一些久經考驗的循環,以查看是否可以使用範圍數組來處理它們。一旦我成功瞭解了這個基本過程,我將嘗試使用範圍數組方法來解決這個特殊情況。 – 5th4x4

+0

閱讀本文http://www.cpearson.com/excel/ArraysAndRanges.aspx - VBA中的範圍和數組是不同的。 – user3357963

回答

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 
+0

這是令人印象深刻的羅恩。將我的現實生活中的Replace示例修改爲數組解決方案的能力確實讓我明白髮生了什麼。 UBound參數在我的腦海中仍然有點粗略,雖然邏輯會指示它轉換爲範圍的最大行。我顯然需要深入研究數組可以與之配對的支持功能,但這一切都將在我對數組解決方案的熟悉程度和需求擴展後立即解決。現在我明白了這個概念,我可以根據需要進行修改,這是巨大的!再次感謝羅恩。 – 5th4x4

+0

很高興幫助。當您將範圍讀入變量數組中時,數組將變爲基於1的2維數組,其中第一維表示行,而2維表示列。所以outerloop處理每個「行」等效。在VBA數組中執行這種工作要比在工作表中來回更快。 –

+0

是的,我已經做了一些研究和閱讀,其中一些神祕的東西已經爲我解決了。我仍然需要一段時間才能在範圍陣列解決方案中直觀地「思考」,但是今天在您的幫助下,您確實讓我向前邁進了一步。我對我的感激過度表示歉意,但嚴重的是,你讓我「看到」解決方案,這真的讓我有信心將它應用於其他情況。我會停止感謝你現在:) – 5th4x4

0

使用一個for循環通過每個字母更換一雙週期和將它們插入此:

Selection.Replace What:=letterToReplace,Replacement:=replacementLetter,- 
    LookAt:=xlPart,SearchOrder:=xlByRows,MatchCase:=True,SearchFormat:=False,- 
ReplaceFormat:=False