最近在做一個(gè)批量替換程序汁掠,之前使用VBA在Excel內(nèi)部調(diào)用任何方法速度都很快(例如方法1)妨蛹,但是外部調(diào)用Excel對(duì)象次數(shù)多了灸蟆,程序就運(yùn)行很慢了。想了以下4種方法實(shí)現(xiàn)发皿,最終選用了方法4崔慧。先將數(shù)據(jù)統(tǒng)一讀取到數(shù)組中,然后遍歷內(nèi)存中的數(shù)組穴墅,再調(diào)用Range對(duì)象進(jìn)行替換惶室,這樣對(duì)于Excel對(duì)象的調(diào)用僅2次即可完成一次替換。
實(shí)際上方法2替換速度應(yīng)該最快的封救,僅一次對(duì)象調(diào)用就把一個(gè)工作表的數(shù)據(jù)都替換了拇涤。但是無(wú)返回值。是否替換了誉结?替換了哪些都不清楚鹅士。
第三種方法是先使用Find或FindNext方法找到值,然后再替換惩坑,判斷復(fù)雜掉盅,但也算是一種折中的方法。
方法1:遍歷所有單元格以舒,速度很慢
For Each Rng In sht.UsedRange
str = Rng.Value
? If InStr(str, OldStr(j)) Then
? ? Rng.Value = Replace(str, OldStr(j), NewStr(j))
? ? xlsOldStrCount(j) = xlsOldStrCount(j) + 1
? End If
Next
方法2:使用Excel內(nèi)置方法直接替換趾痘,速度很快,但不知道替換了哪些
appExcel.DisplayAlerts = False
Call sht.UsedrRang.Replace(What:=OldStr(j), Replacement:=NewStr(j))
appExcel.DisplayAlerts = True
方法3:先查找蔓钟,后替換永票,暫時(shí)有問(wèn)題
查找替換前文本
Rng = sht.Cells(1, 1)
Rng = sht.Cells.Find(What:=OldStr(j))
If Not Rng Is Nothing Then
rng1 = Rng.Address
Do
If Rng.Address = rng1 Then
Exit Do
End If
Rng.Value = Replace(Rng.Value, OldStr(j), NewStr(j))
xlsOldStrCount(j) = xlsOldStrCount(j) + 1
Rng = sht.Cells.FindNext(After:=Rng)
If Rng Is Nothing Then
Exit Do
ElseIf Rng.Address = rng1 Then
Exit Do
End If
Loop While (Not Rng Is Nothing)
End If
方法4:將數(shù)據(jù)讀入數(shù)組Arr,再遍歷數(shù)組滥沫,兼顧速度和明確替換了哪些數(shù)據(jù)侣集。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Arr = sht.Range(sht.Cells(1, 1), sht.UsedRange.SpecialCells(11)).Value
For k = 1 To UBound(Arr, 1)
For n = 1 To UBound(Arr, 2)
If InStr(CStr(Arr(k, n)), OldStr(j)) Then
sht.cells(k, n) = Replace(CStr(Arr(k, n), OldStr(j), NewStr(j))
xlsOldStrCount(j) = xlsOldStrCount(j) + 1
End If
Next
Next k