0

我有一些 Excel 2013 和 Excel 2017 电子表格,它们广泛使用 VBA,从 Oracle 下载和处理数据。我们最近迁移到 Office 365(64 位),因此我必须更新这些电子表格才能在新环境中工作。大多数迁移工作正常......但是在执行一些将过滤器应用于记录集的代码时,我总是遇到崩溃。

此代码在 Excel 2017(32 位)中完美运行。

Dim thisContractID As Long
While outputSheet.Range("CONTRACT_LIST").Cells(2, col).value <> 0
    thisContractID = outputSheet.Range("CONTRACT_LIST").Cells(2, col).value
    quantityData.Filter = "SALES_CONTRACT_ID=" & thisContractID     '<= Crash here.  ThisContractID is a Long, and value exists in the recordset.
    While Not quantityData.EOF
        earliestDate = quantityData![EFFECTIVE_FROM]
        latestDate = quantityData![EFFECTIVE_TO]
        For thisDate = startDate To endDate
            If thisDate >= earliestDate And thisDate <= latestDate Then
                dateOffset = thisDate - startDate + 4
                outputSheet.Range("CONTRACT_LIST").Cells(1, col).Offset(dateOffset, 0).value = quantityData![DAILY_QUANTITY_GJ]
                outputSheet.Range("CONTRACT_LIST").Cells(1, col).Offset(dateOffset, 11).value = quantityData![DAILY_MAX_GJ]
            End If
        Next thisDate
        quantityData.MoveNext
    Wend
    col = col + 1
Wend

在 locals 窗口中,我可以看到记录集有 5 个字段(预期),“SALES_CONTRACT_ID”是第一个字段,具有 adVarNumeric 类型。不确定要提供哪些其他信息 - 我使用 adOpenStatic 光标和 adLockReadOnly 锁。

我试过的:

  • 将 thisContractID 设置为 LongLong。
  • 在应用过滤器之前添加 quantityData.MoveFirst。
  • 将过滤器更改为 filter = """SALES_CONTRACT_ID=" & thisContractID & """" (在第一次迭代时计算为 "SALES_CONTRACT_ID=723"。=> 运行时错误 '3001'
  • 将过滤器更改为 filter = "SALES_CONTRAACT_ID='" & thisContractID & "'" (在第一次迭代时评估为 SALES_CONTRAACT_ID='723';仍然崩溃。
  • 更改对 Microsoft ActiveX Data Objects 2.8 库(原为 6.1 库)的库引用

我不知道还能尝试什么!任何帮助表示赞赏。

4

1 回答 1

1

避免过滤器:

While Not quantityData.EOF
    If quantityData![SALES_CONTRACT_ID] = thisContractID Then  '<-- new
    earliestDate = quantityData![EFFECTIVE_FROM]
    latestDate = quantityData![EFFECTIVE_TO]
    For thisDate = startDate To endDate
        If thisDate >= earliestDate And thisDate <= latestDate Then
            dateOffset = thisDate - startDate + 4
            outputSheet.Range("CONTRACT_LIST").Cells(1, col).Offset(dateOffset, 0).value = quantityData![DAILY_QUANTITY_GJ]
            outputSheet.Range("CONTRACT_LIST").Cells(1, col).Offset(dateOffset, 11).value = quantityData![DAILY_MAX_GJ]
        End If
    Next thisDate
    End If   '<-- new
    quantityData.MoveNext

或者使用 WHERE 子句并发出多个 SQL 查询,而不是过滤大型记录集。

更新:

看起来像 VBA 和 O365 的错误:https ://answers.microsoft.com/en-us/msoffice/forum/msoffice_access-mso_win10-mso_365hp/ms-access-crashes-when-filtering-a-table-or-select /f3fac17c-af3a-45aa-b8f6-46585e6413a5

于 2020-12-14T23:46:29.303 回答