【问题标题】:How to catch page exit event of multipage control in Excel VBA如何在 Excel VBA 中捕获多页控件的页面退出事件
【发布时间】:2013-03-21 15:58:23
【问题描述】:

我在用户窗体上有一个多页控件。当用户导航到新页面时,我希望将当前页面上的数据保存到数据库中。用户可以通过各种方式在页面之间导航,我不想为所有页面编写程序。在选择新页面之前,我可以使用一个事件来引用活动页面吗?

我查看了多页控件的 Change 事件,但如果您在其中引用 multipage.selecteditem,它指的是新页面。我需要的是一个 BeforeChange 事件,但没有。

我还查看了 multipage.exit 事件,但它会在整个多页控件退出时触发,而不仅仅是一个页面。

有什么想法吗?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    使用MultiPage1_Change 事件。

    如果您为 Multipage 分配了一个名称,那么您可以将子例程从 MultiPage1_Change(这是默认值)更改为 YourMultiPageName_Change

    例如,我有一个叫做“MultiPageBannerFilter”。我使用这个子程序执行一些代码来捕获这个对象的 _Change 事件。

    Private Sub MultiPageBannerFilter_Change()
    
    MsgBox "You have changed pages!", vbInformation
    
    End Sub
    

    只需将您的代码保存到数据库而不是消息框,并确保正确命名事件子例程并且这应该可以工作。

    修订版

    Public previousPage As String
    
    
    Sub UserForm_Activate()
        previousPage = MultiPage1.SelectedItem.Name
    
    End Sub
    
    Private Sub MultiPage1_Change()
    
    Dim currentPage As String
    currentPage = MultiPage1.SelectedItem.Name
    
    If Not currentPage = previousPage Then
        previousPage = currentPage
        '
        '
        MsgBox "Your Code Goes Here!", vbInformation
        '
        '
    End If
    
    
    
    End Sub
    

    【讨论】:

    • 我认为您不了解如何将此答案应用于您的问题。您可以声明一些公共变量来存储哪个页面是/曾经是活动的,并以这种方式检测更改。但无论如何,它都需要使用MultiPage_Change 事件来处理。请参阅上面的修订版。
    • 是的,谢谢,我可以看到如何应用您的解决方案(尽管“您的代码在此处”行应该位于“previousPage = currentPage”行的上方)。我希望还有其他一些我不知道的事件可以简化。正如我在问题中提到的,我知道 MultiPage_Change 事件。我最终将我的代码放在了用户导航的点击事件中。
    【解决方案2】:

    我遇到了类似的挑战,并想出了以下代码。您必须跟踪您所在的页面并使用 Click 事件。因此,在 Initialize 子中将 Multipage 设置为一个 Page,并将 intPrevPage 设置为相应的数字。

    Private Sub MultiPage1_Click(ByVal Index As Long)
        Select Case True
    ' If the click doesn't change the Page, then do nothing
            Case intPrevPage = MultiPage1.Value
    ' ValidForm is a function that validates data on previous
    ' Page if click changed the Page
            Case ValidForm
    ' If TRUE then capture current Page
                intPrevPage = MultiPage1.Value
                Call FormatPage
    ' If FALSE then return to previous Page
            Case Else
                MultiPage1.Value = intPrevPage
        End Select
    End Sub
    

    【讨论】:

      【解决方案3】:

      MultiPage1_Change 事件只会在有页面时触发。因此,无需检测更改并使用公共变量“previousPage”

      私有子 MultiPage1_Change() 将 currentPage 调暗为字符串 currentPage = MultiPage1.SelectedItem.Name MsgBox currentPage & "Selected!", vbInformation 结束子

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2023-03-20
        相关资源
        最近更新 更多