VBA Excel:在关闭时调用宏,但不从工作簿\u BeforeClose函数调用宏?
简单地说,我想在工作簿关闭之前调用宏。你可能会说,为什么不把它放在这个工作簿部分呢?原因是我在最初创建书籍时通过VBA上传了一个代码模块。所以基本上有两种解决方法,我就是想不出来VBA Excel:在关闭时调用宏,但不从工作簿\u BeforeClose函数调用宏?,excel,vba,Excel,Vba,简单地说,我想在工作簿关闭之前调用宏。你可能会说,为什么不把它放在这个工作簿部分呢?原因是我在最初创建书籍时通过VBA上传了一个代码模块。所以基本上有两种解决方法,我就是想不出来 在本书结束之前,调用标准模块中的sub 找到一种方法,在创建书籍时,使用VBA过程将代码子部分上载到ThisWorkbook部分 有什么建议吗 假设在运行时我们插入一个模块,并在该模块中放置一个Public子模块: 然后在工作簿代码区域中: Private Sub Workbook_BeforeClose(Cance
有什么建议吗 假设在运行时我们插入一个模块,并在该模块中放置一个Public子模块: 然后在工作簿代码区域中:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Call SayGoodby
End Sub
我同意Gary的观点,使用模板可能是最好的选择,但在任何情况下,这里都是一个使用VBA向现有VBModule添加代码以及使用代码添加新标准模块的示例 显然,您试图添加的过程越复杂,通过在过程中构建字符串来实现这一点就越困难。您可以从文件中添加模块(假设您已经导出了模块,也可以通过VBA…),或者您也可以从打开的工作簿中的现有模块中复制模块等。有关如何执行这些操作,请参阅下面提供的链接 注意您需要启用应用程序以信任访问VBA项目对象模型(文件>选项>信任中心>信任中心设置>宏设置>信任访问VBA项目对象模型)
是有关VBE编程的一些很好的参考资料。但是如何将此代码插入到使用VBA创建的新工作簿中?@codecamp可能最好不要劫持其他人的答案/问题。如果您有自己的问题,请提出自己的问题:)您需要阅读有关VBE编程的内容,开始:)而不是创建一个全新的工作簿,打开一个部分完整的模板,其中工作簿代码已经存在……然后使用VBA插入模块(&public)sub@DavidZemens看看他的#2点,这不是他想要的吗?我会问一个不同的问题,但它将不同于这个问题或我在评论中提出的问题。如何将模块插入另一个工作簿?@codecamp我提供选项#3是否可以添加VBComponent?例如具有类似进程的模块或类?@codecamp是。请参考我之前提供的链接。a好的-我明白-你写字符串不是很好,但它会做-谢谢你-嘿,代码也需要一个tweekRight。这不太好,但会奏效的。你需要什么样的调整?哦,抱歉,虽然我已经发布了这篇文章-所以在关闭之前,请使用准确的代码并添加子工作簿(取消为布尔值)-这很好-干杯大卫!
Option Explicit
Sub AddWorkbookWithCode()
Dim wb As Workbook
Set wb = Workbooks.Add
AddVBCodeToWorkbook wb
End Sub
Sub AddVBCodeToWorkbook(wb As Workbook)
Dim procString$
procString = "Sub Workbook_BeforeClose()"
procString = procString & vbCrLf & vbTab & "On Error Resume Next"
procString = procString & vbCrLf & vbTab & "Call SayGoodby"
procString = procString & vbCrLf & "End Sub"
'## Insert some code to ThisWorkbook module:
With wb.VBProject.VBComponents("ThisWorkbook")
.CodeModule.AddFromString procString
End With
'## Add a new standard module and insert some code there, too:
procString = "Public Sub SayGoodby()"
procString = procString & vbCrLf & vbTab & "MsgBox ""Goodby!"""
procString = procString & vbCrLf & "End Sub"
With wb.VBProject.VBComponents.Add(1)
.Name = "Module1"
.CodeModule.AddFromString procString
End With
End Sub