等同于工作表function更快。清洁

所以作为一个更大的macros的一部分,我正在比较两个列表(简称Omni和MV)。 如果Omni列表上的值也在MV列表中,我想将Omni中的行复制到新的工作表中。 我正在计划使用嵌套的for循环(下面的轮廓),但只有清理MV列表中的额外换行符,我正在使用下面的第二组代码。 它需要永远(5分钟为<50值),我想知道是否有人知道一个更快的方式来做到这一点。 谢谢!

For i = 2 To OmniLastRow Step 1 OmniValue= Workbooks(OmniFileName).Worksheets("pcr").Cells(i, 1) Workbooks(MVFileName).Worksheets(Yesterday & "_ORPCR_MVTest").Activate For j = 1 To MVLastRow Step 1 If Cells(j, 1).Value = OmniValue And Cells(i, 5).Value <> "0" Then Workbooks(OmniFileName).Worksheets("pcr").Rows(i).Copy MsgBox Cells(j, 1).Value End If Next j set rng = workbooks(MVFileName).Worksheets(Yesterday & "_PCRMV").activate For each cell in rng cell.value = WorksheetFunction.Clean(cell.value) Next Cell 

难怪代码需要时间。 您在工作表中的每个单元格上运行它。

例如,将范围限制为仅包含数据的行和列

 set rng = workbooks(MVFileName).Worksheets(Yesterday & "_PCRMV").UsedRange For each cell in rng cell.value = WorksheetFunction.Clean(cell.value) Next Cell 

除了@teylyn的回答之外,块操作总是比在任何单元格范围内循环更快,无论是整个工作表还是仅仅是使用的数据范围。

 With Workbooks(MVFileName).Worksheets(Yesterday & "_PCRMV").UsedRange.Cells With .SpecialCells(xlCellTypeConstants, 2) '.Replace what:=Chr(9), replacement:=vbNullString, lookat:=xlPart '.Replace what:=vbCRLF, replacement:=vbNullString, lookat:=xlPart .Replace what:=Chr(10), replacement:=vbNullString, lookat:=xlPart End With End With 

虽然这只会删除换行字符(例如, Chr(10) ),您所指出的是运行工作表CLEANfunction与单元格值的目的。 其他非打印字符也可以在随后的replace操作中被移除,并且仍然更快。 可能的候选者是Tab字符(例如Chr(9) )或vbCRLF(例如Chr(13)&Chr(10) )。

我没有使用像CLEAN这样的replace空间,只是去掉非打印字符。 如果你愿意,你可以用空格replacevbNullString