我有一个宏,其中打开多个用户表单,每个用户表单都有自己专用的“完成”按钮,用于卸载相应的用户表单。 现在,我有一个单独的“保存”功能,可以将输出表复制到新工作簿并单独保存。 我的目的是在单击最后一个用户窗体的“完成”按钮时调用此保存函数。 (用户可以随机选择关闭打开的用户表单的顺序。)
我会遇到不同的情况,在流程结束时仅同时打开一个用户表单或 2 个甚至 3 个不同的用户表单。
我很困惑,仅当单击最后一个用户表单上的“完成”按钮时,应该使用什么逻辑来调用保存功能。
我该怎么办? 感谢您的投入。
请使用下一个场景:
移动(如果不存在)将工作簿保存在标准模块中。对于我将发布的代码,它应该是
Sub SaveTheNecessaryWorkbook
。与要保存或不保存的工作簿相关的参数......
在
UserForm_Terminate
所有涉及此类用户表单的情况下,复制下一段代码:
Private Sub UserForm_Terminate()
Dim frm As Object, CountFrm As Long
For Each frm In VBA.UserForms
If Not frm Is Me Then
'check if other user form(s) from the same workbook are open:
If IsFromSameWorkbook(frm.name, ThisWorkbook.name) Then CountFrm = CountFrm + 1
End If
Next
If CountFrm = 0 Then SaveTheNecessaryWorkbook 'take care to have such a `Sub` in a standard module, or use here the existing one name, if it already exists.
End Sub
并且该函数能够确定打开的用户表单是否属于同一工作簿,该工作簿将被复制到用户表单代码模块中的某个位置。也许,在上述
Terminate
事件之后...
Function IsFromSameWorkbook(formName As String, WBNme As String) As Boolean
Dim VbComp As Object
For Each VbComp In Workbooks("" & WBNme & "").VBProject.VBComponents
If VbComp.name = formName Then
Let IsFromSameWorkbook = True: Exit Function
End If
Next VbComp
IsFromSameWorkbook = False
End Function
更好的主意是同时复制它们......
现在,上述解决方案将计算有多少个表单与保留代码的表单属于同一工作簿(除了一个)打开,并仅当相应的用户表单是最后一个剩余表单时才调用保存
Sub
。 CountFrm
为零...
请在测试后发送一些反馈。