更快等效于worksheetfunction.Clean

时间:2015-06-02 02:10:35

标签: excel vba excel-vba loops

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

$users = scandir('users'); // First we get the users

unset($users[0]); // We unset the first two elements, which are useless
unset($users[1]);

foreach ( $users as $i ) // We loop through the folders
{
        $contents = scandir('users/'.$i); // We repeat the same process

        unset($contents[0]);
        unset($contents[1]);

        foreach ( $contents as $i2 ) // Loop through files of each folder
        {
            unlink('users/'.$i.'/'.$i2); // File deletion
        }
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

除了@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)),但您指出的是针对单元格值运行工作表CLEAN function的目的。其他非打印字符也可以在后续的替换操作中删除,并且仍然更快。可能的候选人是 Tab 字符(例如Chr(9))或vbCRLF(例如Chr(13)&Chr(10))。

我没有使用空格等替代品,因为CLEAN只是删除非打印字符。如果愿意,可以用空格替换 vbNullString