我已經得到了下面的宏:使用正則表達式用宏替換單元格中的巧妙值?
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中解決這個問題。我嘗試了一些東西,但它沒有工作,有錯誤等,所以我回到了開始。
看看這個(頻繁VBA問題) :http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops – R3uK
@ R3uK我已經看了看,但我不知道如何將它應用到我的情況,他談到,如果正則表達式匹配替換字符串,但在我的情況我有一個字符串,它總是變化(所有的表達式中我的列C)被2個模式包圍(它們是「[^ a-zA-Z0-9 _]」)。我搜索了「通過範圍循環」部分,但我不明白「strInput」是什麼。 – Malik
Mkay,我從來沒有使用正則表達式,但'strInput'是分析的單元格的值,它只是提高效率的變量,每次不進入細胞來讀取信息。因此,而不是MSGBOX的,你可以把你自己的指令(替換那裏與新值單元格的值) – R3uK