访问 VBA - 在大范围内更改 Excel 单元格值的更快方法?

Posted

技术标签:

【中文标题】访问 VBA - 在大范围内更改 Excel 单元格值的更快方法?【英文标题】:Access VBA - faster way to change Excel cell values across a large range? 【发布时间】:2013-04-19 17:08:28 【问题描述】:

我在 Access 中有一些 VBA 代码,它从 Excel 工作表中获取一系列单元格,然后将它们从数字转换为日期。例如,一个范围是 H1:Y25000

Public Sub FixDates(theRange as Range)

Dim RangeCell as Range

For Each RangeCell In theRange
    If IsNumeric(RangeCell.Value) And RangeCell.Value > 0 And Not IsEmpty(RangeCell.Value) Then
        lngDate = CLng(RangeCell.Value)
        RangeCell.Value = DateAdd("d", lngDate -1, "1/1/1968")
    End If
Next RangeCell

End Sub

代码似乎可以运行,但运行起来需要很长时间。可以用不同的方式编写以更快地运行吗?我正在阅读有关使用 Variant 而不是 Range 的信息,但我无法弄清楚。

哦,要调用 Sub,我使用类似:

path = "C:\myfile.xlsx"
Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Open(path)
Set xlWks = xlWbk.Worksheets(1)
lastRow = xlWks.Range("A1").End(xlDown).Row
FixDates (xlWks.Range("H1:Y" & lastRow))

谢谢!

【问题讨论】:

我们可以修改问题并从中删除“访问”吗?因为这个问题在 Excel 中帮助了我很多(没有 Access) 【参考方案1】:

您可以简单地将范围分配给一个变体,这将创建一个数组 - 它看起来像下面的代码 - 您应该添加适当的错误处理:

Public Sub FixDates(theRange as Range)

    Dim data as Variant
    Dim i as Long
    Dim j as Long
    Dim lngDate as Long

    data = theRange

    For i = LBound(data, 1) to UBound(data, 1)
        For j = LBound(data, 2) to UBound(data, 2)
            If IsNumeric(data(i, j)) Then
                If data(i, j) > 0 Then
                    lngDate = CLng(data(i, j))
                    data(i, j) = DateAdd("d", lngDate - 1, "1/1/1968")
                End If
            End If
        Next j
    Next i

    theRange = data

End Sub

【讨论】:

那是完美的!它的运行时间只是我原始代码的一小部分。非常感谢! 这样做实际上比使用Range.CopyFromRecordset 更快。快多了。这值得更多的支持。

以上是关于访问 VBA - 在大范围内更改 Excel 单元格值的更快方法?的主要内容,如果未能解决你的问题,请参考以下文章

当参考范围内的值发生变化时,VBA 更新公式

VBA Excel在单元格中分隔日期范围

Ax 导出EXCEL给范围内的每个单元格加边框

动态循环范围,VBA

如何查找范围是不是包含VBA中的合并单元格

从 Excel 与 VBA 调用时,VBA UDF 给出不同的答案