我在EXCEL 2016中为PC开发了一个用户表单。如果用户从与上次启动或显示相同的工作簿/工作表中启动用户窗体(从我的加载项添加到功能区的按钮),那么我希望userform记住上次使用时的所有用户设置。因此,当用户完成特定用途时,我只是隐藏表单。这到目前为止运作良好。
但是,如果用户随后从另一个工作表或工作簿显示用户窗体,则EXCEL会“快照”回到启动用户窗体的原始工作簿/工作表。在这种情况下,我希望userform重置并显示在“新”活动工作簿/工作表中。
我可以想象这样的伪代码:
Public wb0 As Workbook
Public ws0 As Worksheet
' IF the userform is being used for the 1st time
Public Sub UserForm_Initialize()
yada yada yada...
wb0 = current workbook
ws0 = current worksheet
End Sub
Private Sub UserForm_Activate()
If wb0 <> ActiveWorkbook OR ws0 <> ActiveWorkSheet Then
(**Force the userform to open in the current workbook/worksheet**)
Call Reset
wb0 = current workbook
ws0 = current worksheet
End If
End Sub
但是,我不确定如何:
1)测试当前活动工作簿和工作表是否与上次使用时的活动工作簿和工作表相同。我应该将wb0设置为ActiveWorkbook的Name属性吗?
wb0 = ActiveWorkbook.Name
然后测试将是:
If wb0 <> ActiveWorkbook.Name ...
2)另外,不确定如何强制在当前工作表中打开用户窗体。
====
或者,也许最好有类似的东西:
Private Sub UserForm_Activate()
If wb0 <> ActiveWorkbook OR ws0 <> ActiveWorkSheet Then
Unload userform
Reload userform
End If
End Sub
这样一切都会自动重置......
====
有人可以提出建议吗?
谢谢!
丹
答案 0 :(得分:2)
我在一个大插件中使用一些UserForms执行此操作。
想象一下名为F_UserForm的UserForm。调用它的大规模剥离模块如下所示:
Option Explicit
Dim gF_UserForm As F_UserForm
Sub CallUserForm()
If Not gF_UserForm Is Nothing Then
On Error Resume Next
If gF_UserForm.ActiveWkbk.FullName <> ActiveWorkbook.FullName Then
Unload gF_UserForm
Set gF_UserForm = Nothing
End If
End If
If gF_UserForm Is Nothing Then
Set gF_UserForm = New F_UserForm
End If
With gF_UserForm
Set .ActiveWkbk = ActiveWorkbook
.Show
End With
End Sub
精简的UserForm代码如下所示:
Option Explicit
Dim m_Wkbk As Workbook
Public Property Set ActiveWkbk(wkbk As Workbook)
Set m_Wkbk = wkbk
End Property
对于OP的情况,我的主程序可以替换为以下内容,我在上面的用户表单代码中添加的部分不需要更改,但应该合并到{ {1}}。
Reg_Userform