2015-06-30 27 views
1

我已經得到了下面的宏:使用正則表達式用宏替換單元格中的巧妙值?

Sub MacroClear() 

Dim wbD As Workbook, _ 
    wbC As Workbook, _ 
    wsD As Worksheet, _ 
    wsC As Worksheet, _ 
    DicC() As Variant, _ 
    Dic() As String, _ 
    ValToReplace As String, _ 
    IsInDic As Boolean 

Set wbD = Workbooks.Open("D:\Users\me\Documents\macro\Dictionnary", ReadOnly:=True) 

Set wbC = Workbooks("FileToTreat.xlsm") 

Set wsD = wbD.Worksheets("Feuil1") 

Set wsC = wbC.Worksheets("draft") 

ReDim DicC(1, 0) 

For i = 1 To wsD.Range("C" & wsD.Rows.Count).End(xlUp).Row 
    Dic = Split(wsD.Cells(i, 3), ";") 
    ValToReplace = Trim(wsD.Cells(i, 2)) 
    For k = LBound(Dic) To UBound(Dic) 
     IsInDic = False 
     For l = LBound(DicC, 2) To UBound(DicC, 2) 
      If LCase(DicC(1, l)) <> Trim(LCase(Dic(k))) Then 
       'No match 
      Else 
       'Match 
       IsInDic = True 
       Exit For 
      End If 
     Next l 
     If IsInDic Then 
      'Don't add to DicC 
     Else 
      DicC(0, UBound(DicC, 2)) = Trim(Dic(k)) 
      DicC(1, UBound(DicC, 2)) = ValToReplace 
      ReDim Preserve DicC(UBound(DicC, 1), UBound(DicC, 2) + 1) 
     End If 
    Next k 
Next i 

ReDim Preserve DicC(UBound(DicC, 1), UBound(DicC, 2) - 1) 
wbD.Close 
Erase Dic 

    For l = LBound(DicC, 2) To UBound(DicC, 2) 
     Cells.Replace What:="*" & Trim(DicC(0, l)) & "*", _ 
      Replacement:=Trim(DicC(1, l)), _ 
      LookAt:=xlPart, _ 
      SearchOrder:=xlByRows, _ 
      MatchCase:=False, _ 
      SearchFormat:=False, _ 
      ReplaceFormat:=False 
    Next l 


Erase DicC 
Set wbD = Nothing 
Set wbC = Nothing 
Set wsD = Nothing 
Set wsC = Nothing 

End Sub 

我會盡力解釋:它從dictionnary我「的單詞來替換」(列C),全部由一個「;」分隔,和我「主要詞」(B欄)。

image http://img11.hostingpics.net/pics/403257dictionnary.png

然後,它在我的「文件處理」(通過Cells.Replace)的所有單元的搜索,如果發現某事在我的dictionnary的C柱,它與什麼在B列替換它

但現在,我已經在我的專欄C(索尼電腦娛樂,索尼在B列代替)得到了「SCE」,甚至當SCE是一個詞(例如:上升),它取代了字與索尼。我不想取代它,如果它是在一個字裏面...

在Java中,我會用p = Pattern.compile("[^a-zA-Z]"+keyword+"[^a-zA-Z]", Pattern.CASE_INSENSITIVE); 很容易做到這一點,但我不知道如何在VBA中解決這個問題。我嘗試了一些東西,但它沒有工作,有錯誤等,所以我回到了開始。

+0

看看這個(頻繁VBA問題) :http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops – R3uK

+0

@ R3uK我已經看了看,但我不知道如何將它應用到我的情況,他談到,如果正則表達式匹配替換字符串,但在我的情況我有一個字符串,它總是變化(所有的表達式中我的列C)被2個模式包圍(它們是「[^ a-zA-Z0-9 _]」)。我搜索了「通過範圍循環」部分,但我不明白「strInput」是什麼。 – Malik

+0

Mkay,我從來沒有使用正則表達式,但'strInput'是分析的單元格的值,它只是提高效率的變量,每次不進入細胞來讀取信息。因此,而不是MSGBOX的,你可以把你自己的指令(替換那裏與新值單元格的值) – R3uK

回答

0

所以我在替代方法改變幾個參數,並提出爲所有的細胞,你只需要設置右列的循環(在第二個命題:這裏B = 2)。

參數:

LookAt:=xlWhole 'To search for whole expression 
SearchOrder:=xlByColumns 'Search in column 
MatchCase:=True 'Will look for the expression with the same casing (not sure about this word...) 

嘗試其中之一:

For l = LBound(DicC, 2) To UBound(DicC, 2) 
    Cells.Replace What:="*" & Trim(DicC(0, l)) & "*", _ 
     Replacement:=Trim(DicC(1, l)), _ 
     LookAt:=xlWhole, _ 
     SearchOrder:=xlByColumns, _ 
     MatchCase:=True, _ 
     SearchFormat:=False, _ 
     ReplaceFormat:=False 
Next l 

或者在每個單元的循環:

For l = LBound(DicC, 2) To UBound(DicC, 2) 
    For k = 1 To wsC.Rows(wsC.Rows.Count).End(xlUp).Row 
     wsC.Cells(i, 2).Replace What:="*" & Trim(DicC(0, l)) & "*", _ 
      Replacement:=Trim(DicC(1, l)), _ 
      LookAt:=xlWhole, _ 
      SearchOrder:=xlByColumns, _ 
      MatchCase:=True, _ 
      SearchFormat:=False, _ 
      ReplaceFormat:=False 
    Next k 
Next l