繁体   English   中英

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

[英]EXCEL VBA Showing a Userform from a Different Worksheet or Workbook

我已经在EXCEL 2016 PC版中开发了一个用户表单。 如果用户从与上次启动或显示相同的工作簿/工作表中启动用户窗体(通过我的外接程序添加到功能区的按钮),那么我希望该用户窗体记住上次使用时的所有用户设置。 因此,当用户完成特定用途时,我只是隐藏了表单。 到目前为止,效果很好。

但是,如果用户随后从不同的工作表或工作簿中显示用户表单,则EXCEL会“快照”回用户表单的原始工作簿/工作表。 在这种情况下,我希望用户窗体重置并出现在“新的”活动工作簿/工作表中。

我可以想象这样的伪代码:

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

这样,所有内容都会自动重置...

====

有人可以请教吗?

谢谢!!

我使用大型外接程序中的一些UserForms进行此操作。

想象一个名为F_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的情况,我的主例程可以替换为以下内容,并且我添加到上述用户窗体代码中的代码段无需更改,而应合并到Reg_Userform

Option Explicit

Dim gReg_Userform As Reg_Userform

Sub conRegBox(control As IRibbonControl)

  If Not gReg_Userform Is Nothing Then
    On Error Resume Next
    If gReg_Userform.ActiveWkbk.FullName <> ActiveWorkbook.FullName Then
      Unload gReg_Userform
      Set gReg_Userform = Nothing
    End If
  End If

  If gReg_Userform Is Nothing Then
    Set gReg_Userform = New Reg_Userform
  End If

  With gReg_Userform
    Set .ActiveWkbk = ActiveWorkbook
    .Show
  End With

End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM