文件保存为 xlsx 后,工作簿模块中的代码仍然运行

Code in the workbook module still runs after the file is saved as xlsx

使用 VB.NET 形式的按钮,打开 .xlsm 文件并保存为 .xlsx.xlsx 文件(Workbook_BeforeClose 事件)中的代码在文件保存后不会被删除,因此,当我想关闭文件时,代码会运行!重新打开文件后,没有留下任何代码。

这是我的 VB.NET class:

Imports Excel = Microsoft.Office.Interop.Excel

Public Class Form1
    Dim xlApp As Excel.Application
    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkbooks As Excel.Workbooks

    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        xlApp = New Excel.Application
        xlWorkbooks = xlApp.Workbooks
        xlWorkBook = xlWorkbooks.Open("C:\Temp\testTemplate.xlsm")

        xlApp.DisplayAlerts = False
        xlWorkBook.SaveAs(Filename:="C:\Temp\testTemp.xlsx", FileFormat:=51)  '51=xlOpenXMLWorkbook
        xlApp.DisplayAlerts = True

        xlApp.Visible = True

        'Clean Up
        releaseObject(xlWorkBook)
        releaseObject(xlWorkbooks)
        releaseObject(xlApp)
    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Try
    End Sub
End Class

这在 Excel 文件中,工作簿模块:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    MsgBox "event still runs"
End Sub

如何正确保存文件,不让代码留在里面?

你说得对,代码在关闭之前不会被删除。我想你可以在 xlsm 的 BeforeClose 事件中设置某种类型的标志来检查它的文件类型并且只在它是 xlsm 时运行。或者您可以执行 Worksheets.Copy 而不是 SaveAs 并将生成的工作簿(不包含 VBA)保存为 xlsx,但可能存在需要清理的参考问题。或者您可以设置 xlApp.EnableEvents=False,关闭新保存的 xlsx,将其设置回 True 并重新打开 xlsx。

这是我在第二个选项上写的post:http://yoursumbuddy.com/copy-an-xlsm-xlsx/