【问题标题】:Prompt to close on new sheet from pivot table提示关闭数据透视表中的新工作表
【发布时间】:2015-02-17 08:43:04
【问题描述】:

我经常发现,对于数据透视表,我最终会得到大量来自通过数据透视表钻取创建的新工作表的工作表。我认为一个很棒的宏是在从数据透视表创建的所有新工作表的右上角显示一个小的用户窗体,允许用户轻松删除工作表并返回到数据透视表。但是,我不知道如何触发宏。有任何想法吗?基本上,只要通过在数据透视表中向下钻取创建新工作表,就需要自动触发宏。

【问题讨论】:

    标签: excel vba pivot userform


    【解决方案1】:

    不要太复杂,您可能正在寻找这样的东西......

    在“ThisWorkbook”下添加以下代码:


    已编辑

    这对我有用:

    Private Sub Workbook_NewSheet(ByVal Sh As Object)
        If Detect_Pivot(Sh) Then
            Sh.Activate
            frmSheetOptions.Show
        End If
    End Sub    
    
    Function Detect_Pivot(wsNew As Worksheet) As Boolean
        Dim wb As Workbook
        Dim pvt As PivotTable
        Dim bNew As Boolean
        Dim i As Integer
    
        i = 0
        bNew = True
        Set wb = ThisWorkbook
    
        For Each pvt In wsNew.PivotTables
            i = i + 1
            s = Split(pvt.SourceData, "!")
            sName = s(0)
            If wsNew.Name = sName Then
                bNew = False
                Exit For
            End If
        Next
        If i > 0 Then Detect_Pivot = bNew
    End Function
    

    在你要显示的框架内:

    Private Sub cmdHide_Click()
        frmSheetOptions.Hide
    End Sub
    
    Private Sub cmdDelete_Click()
        ActiveSheet.Delete
        frmSheetOptions.Hide
    End Sub
    
    Private Sub UserForm_Initialize()
        frmSheetOptions.lblSheetName = ActiveSheet.Name
    End Sub
    

    【讨论】:

    • 不是每次创建新工作表时都会触发此代码,即使它不是从数据透视表向下钻取创建的?有没有办法只让事件从数据透视表创建新工作表中触发
    • 它会 - 我编辑了我的答案以包含一个函数“Detect_Pivot”,它很简单,并且在测试手动创建工作表后似乎对我有用,在同一张工作表上创建一个数据透视表,然后创建一个数据透视表一张新纸。它可能无法完美地满足您的需求,但我不知道如果工作表是从自动数据透视表创建中生成的,您还能如何了解。
    • 感谢您的回复 - 非常有帮助!我现在想采用它并使其适用于每个工作簿,而不是每次打开新文档时都必须将其添加到“thisworkbook”中。有什么想法吗?
    • 问题是“Workbook_NewSheet”事件要求它在“ThisWorkbook”模块中。如果不手动替换代码,您将不得不想出一种新方法来触发此代码。我只需导出“ThisWorkbook”类模块并将其导入其他文档。这是手动执行此操作的最快方法。
    【解决方案2】:

    要在创建新工作表时启动事件,您可以使用以下示例(Tim Williams 的回答)。但是,我不确定如何判断新工作表是否是从数据透视表创建的。向下钻取可能是由数据透视表触发的事件,在这种情况下,您可以应用此方法找到它。这需要一些调查。

    Private WithEvents app As Excel.Application
    
    Sub Init()
        Set app = Application 'start capturing events
    End Sub
    
    Private Sub app_NewWorkbook(ByVal Wb As Workbook)
        Debug.Print "New"
    End Sub
    
    Private Sub app_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
        Debug.Print "Before close: " & Wb.Name
    End Sub
    
    Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
        Debug.Print "Open: " & Wb.Name
    End Sub
    

    【讨论】:

    • 有没有办法只让事件从数据透视表创建新工作表中触发,而不仅仅是创建任何工作表
    • 我找到了一个建议检查 SheetType 以查看它是否为“显示”的资源。这会将用户创建的工作表与钻取等创建的工作表分开。 contextures.com/excel-pivot-table-drilldown.html
    • 我强烈建议使用调试器来比较手动与向下钻取比较的工作表。除了 SheetType 之外,您也许还能找到其他差异。
    • 感谢您的回复 - 非常有帮助!我现在想采用它并使其适用于每个工作簿,而不是每次打开新文档时都必须将其添加到“thisworkbook”中。有什么想法吗?
    • 这实际上抓住了我犯的一个错误,我使用的示例确实检查了何时添加工作簿(而不是工作表)。您也可以使用相同的方法检查工作表
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多