使用 MS Access VBA 在 .xlsx 文件中插入一行...如何避免损坏文件?

Posted

技术标签:

【中文标题】使用 MS Access VBA 在 .xlsx 文件中插入一行...如何避免损坏文件?【英文标题】:Using MS Access VBA to insert a row into a .xlsx file... how to avoid corrupting the file? 【发布时间】:2017-05-25 20:13:41 【问题描述】:

在 MS Access 中,我正在编写一小段代码来将一行插入到 .xlsx 文件中。这两个文件都是本地的。代码运行时没有错误,但每次运行时,都会使 .xlsx 文件不可读。这是一个步骤:

(1) 我有一个简单的 .xlsx 文件(几百行,十几列,有点格式,没有特殊功能或嵌入式 VBA)。

(2) 我可以在 Excel 中打开和查看文件 - 但我确保在运行代码之前关闭它。

(3) 在 MS Access 中运行以下代码。

(4) 代码执行没有错误。 debug.print 按预期执行并打印出 cell(1,1) 的内容。

(5) 我在 MS Excel 中重新打开 .xlsx 文件,但 Excel 现在无法打开它。 Excel 本身打开,但完全空白,没有打开文件。没有错误。

(6) 如果我使用 Office365 打开文件(通过 web 前端),那么,它会显示以下错误:

“我们无法打开此工作簿。它设置为仅显示某些命名项目,但它们不在工作簿中。”

我可以很容易地恢复文件,但每次都会出现相同的行为(我测试过 5 次 - 每次都使用略有不同的 .insert 方法)。我的代码中有什么东西导致了这种情况吗?

Public Function WriteHistoryToExcelFile()
    Dim lExcelObj As Excel.Application
    Dim lExcelWB As Excel.Workbook, lSheet As Excel.Worksheet

    Set lExcelObj = CreateObject("Excel.Application")
    Set lExcelWB = GetObject("C:\Users\XXX\OneDrive\AA-Store\Ziggy\Meta History.xlsx")
    Set lSheet = lExcelWB.Sheets(1)

    Debug.Print lSheet.Cells(1, 1)    'This works correctly

    lSheet.Rows(1).Insert

    lExcelWB.Save
    lExcelWB.Close
    Set lExcelWB = Nothing
    Set lExcelObj = Nothing
End Function

有人能重现这种尴尬的行为吗?

【问题讨论】:

【参考方案1】:

不要使用GetObject 打开工作簿,而是尝试使用Application.Workbooks.Open 方法。并明确Quit Excel:

Public Function WriteHistoryToExcelFile()

    Dim lExcelObj As Excel.Application
    Dim lExcelWB As Excel.Workbook, lSheet As Excel.Worksheet

    Set lExcelObj = CreateObject("Excel.Application")
    Set lExcelWB = lExcelObj.Workbooks.Open("C:\Users\XXX\OneDrive\AA-Store\Ziggy\Meta History.xlsx")
    Set lSheet = lExcelWB.Sheets(1)

    Debug.Print lSheet.Cells(1, 1)    'This works correctly

    lSheet.Rows(1).Insert

    lExcelWB.Save
    lExcelWB.Close
    lExcelObj.Quit
    Set lExcelWB = Nothing
    Set lExcelObj = Nothing
End Function

您可能还需要确保在任务管理器中没有任何延迟的隐藏 Excel 副本正在运行。

【讨论】:

是的!谢谢,代码修改成功。 ...而且我已经在检查任务管理器(可以理解,也许一个挥之不去的正在运行的进程有一个文件句柄,但它似乎不是那个)。 FWIW - 该错误是因为 GetObject 将工作簿的窗口打开为隐藏状态,根据存档文章 KB111247。根据文章,可以取消隐藏窗口,但 IMO,Workbooks.Open 方法是更好的方法,因为您已经参考了 Excel.Application

以上是关于使用 MS Access VBA 在 .xlsx 文件中插入一行...如何避免损坏文件?的主要内容,如果未能解决你的问题,请参考以下文章

VBA (Ms-Access) 从宏调用成员函数

MS Access 2013:通过 VBA 使用 MS Word 的语法检查

MS Access VBA参考

使用 VBA 激活打开的 MS Access 文件以发送密钥

使用拼写检查时使用 VBA 切换字典 (MS Access)

如何在 VBA 代码中的 ms-access 中执行查询?