如何通过忽略空单元格来加快数据获取速度?

时间:2019-04-30 13:41:25

标签: excel vba

我正在使用的处理工具遇到了问题,即初始挂起时间接近10秒。我确定的问题是,当最初将数据导入到其中时,它将继续更新5x1000工作区中的每个查找数组和功能。我一直认为,加快处理速度的一种好方法是将导入限制为非空单元格,但是无论我如何尝试都无法完成导入。

默认情况下,此功能是将RadGridExport临时文件中的数据导入到缓冲区表中以便以后处理的功能:

Sub CopyData()
    Dim rng As Range
    Set rng = Workbooks("RadGridExport.xls").Sheets(1).Range("A1:E1000")

    ThisWorkbook.Sheets(2).Range("A1").Resize(rng.Rows.Count, rng.Columns.Count).Cells.Value = rng.Cells.Value
End Sub

我尝试使用IsEmpty(Cell.Value)方法,但效果不佳

Sub CopyData()
    Dim rng As Range
    Set rng = Workbooks("RadGridExport.xls").Sheets(1).Range("A1:E1000")
    For Each Cell In rng
        If IsEmpty(Cell.Value) = False Then
        ThisWorkbook.Sheets(2).Range("A1").Resize(rng.Rows.Count, rng.Columns.Count).Cells.Value = rng.Cells.Value
        End If
    Next Cell
End Sub

实际上,它冻结了整个工作簿。那是我熟悉的唯一可以应用的方法,所以我有点死胡同。

是否有一种方法可以真正让我的初始函数忽略空单元格?还是我是用错误的方式来解决这个问题,并且有某种方法可以阻止工作表对每个单元进行完整的更新,包括那些值不变的单元?

1 个答案:

答案 0 :(得分:1)

我设法找到了解决问题的方法。

首先感谢@Pᴇʜ提供了一种进行动态范围的方法-我最终没有在该工具中使用它,因为很多处理都依赖于某个范围内的静态单元格进行自动计算,但是我将其记下了未来!

@JvdV的建议很吸引人,将加载时间从平均31秒降低到14秒。

当前代码如下:

Sub CopyData()
    Dim rng As Range

    Set rng = Workbooks("RadGridExport.xls").Sheets(1).Range("A1:E1000").SpecialCells(2)

    ThisWorkbook.Sheets(2).Range("A1").Resize(rng.Rows.Count, rng.Columns.Count).Cells.Value = rng.Cells.Value
End Sub

然而,它仍然迫使所有静态值完全刷新-因此,在更深入地研究后,我意识到我在主宏中使用了一个庞大的清除门:

Sub clearAll()
    Range("A:E").ClearContents
End Sub

这造成了巨大的14秒延迟。在我将该功能更改为此:

Dim Workspace As Range
Set Workspace = ThisWorkbook.Sheets(2).Range("A1:E1000")

For Each Cell In Workspace
    If IsEmpty(Cell.Value) = False Then
    Cell.ClearContents
    End If
Next Cell

加载时间从14秒进一步减少到2秒以下。

再次感谢:)