EXCEL VBA显示来自不同工作表或工作簿的用户表单

时间:2018-03-10 22:37:26

标签: excel vba userform

我在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

这样一切都会自动重置......

====

有人可以提出建议吗?

谢谢!

1 个答案:

答案 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