Excel 使用MS Access VBA将行插入.xlsx文件。。。如何避免损坏文件?

Excel 使用MS Access VBA将行插入.xlsx文件。。。如何避免损坏文件?,excel,vba,ms-access,ms-access-2016,Excel,Vba,Ms Access,Ms Access 2016,在MS Access中,我正在编写一小段代码,将一行插入到.xlsx文件中。这两个文件都是本地文件。代码运行时没有错误,但每次运行时都会使.xlsx文件无法读取。下面是一个步骤: (1) 我有一个简单的.xlsx文件(几百行,十几列,一点格式,没有特殊功能或嵌入VBA) (2) 我可以在Excel中打开和查看该文件,但我确保在运行代码之前将其关闭 (3) 在MS Access中运行下面的代码 (4) 代码执行时没有错误。debug.print按预期执行并打印单元(1,1)的内容 (5) 我在MS

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

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

(2) 我可以在Excel中打开和查看该文件,但我确保在运行代码之前将其关闭

(3) 在MS Access中运行下面的代码

(4) 代码执行时没有错误。debug.print按预期执行并打印单元(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

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

请尝试使用
应用程序.Workbooks.open
方法,而不是使用
GetObject
打开工作簿。并明确地退出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
打开了工作簿的窗口,就像归档文章中说的那样。根据文章,该窗口可以取消隐藏,但在IMO中,
工作簿.Open
方法是一种更好的方法,因为您已经有了对
Excel.Application的引用