文件保存为 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/
使用 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/