Excel 提示关闭透视表中的新工作表
我经常发现,对于透视表,通过透视表向下钻取创建的新工作表中有大量工作表。我认为一个很棒的宏应该是在从透视表创建的所有新工作表的右上角显示一个小的userform,允许用户轻松删除工作表并返回透视表。但是,我不知道如何触发宏。有什么想法吗?基本上,在透视表中向下钻取创建新工作表时,需要自动触发宏 如果不太复杂,您可能正在寻找这样的东西 在此工作簿下添加以下代码: 编辑 这对我很有用:Excel 提示关闭透视表中的新工作表,excel,vba,pivot,userform,Excel,Vba,Pivot,Userform,我经常发现,对于透视表,通过透视表向下钻取创建的新工作表中有大量工作表。我认为一个很棒的宏应该是在从透视表创建的所有新工作表的右上角显示一个小的userform,允许用户轻松删除工作表并返回透视表。但是,我不知道如何触发宏。有什么想法吗?基本上,在透视表中向下钻取创建新工作表时,需要自动触发宏 如果不太复杂,您可能正在寻找这样的东西 在此工作簿下添加以下代码: 编辑 这对我很有用: Private Sub Workbook_NewSheet(ByVal Sh As Object) If
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
在要显示的frm内:
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
要在创建新工作表时启动事件,您可以使用下面的示例作为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
但是,即使不是从透视表向下钻取创建新工作表,也会在每次创建新工作表时触发此代码吗?有没有办法让事件只在数据透视表创建新的工作表时触发?我编辑了答案,加入了一个函数Detect_pivot。这很简单,在测试手动创建工作表、在同一工作表上创建数据透视表,然后在新工作表上创建数据透视表之后,它似乎对我有效。它可能无法完全满足您的需要,但我不知道如果工作表是从自动数据透视表创建中生成的,您还可以通过其他方式了解它。感谢您的回复-非常有用!现在,我想将其应用于每个工作簿,而不是每次打开新文档时都必须将其添加到此工作簿中。有什么想法吗?问题是工作簿\新闻纸事件要求它位于ThisWorkbook模块中。如果不手动替换代码,您将不得不想出一种触发此代码的新方法。我只需要导出ThisWorkbook类模块并将其导入到其他文档中。这是手动执行此操作的最快方法。是否有任何方法仅在透视表创建新工作表时触发事件,而不只是创建任何工作表?我找到一个资源,建议检查工作表类型以查看它是否显示。这会将用户创建的工作表与向下钻取之类的工作表分开。我强烈建议使用调试器来比较手动比较的工作表和向下钻取比较的工作表。您可能会发现除纸张类型之外的其他差异。感谢您的回复-非常有用!现在,我想将其应用于每个工作簿,而不是每次打开新文档时都必须将其添加到此工作簿中。有什么想法吗?这实际上抓住了我犯的一个错误,我使用的示例确实检查了何时添加工作簿而不是工作表。您也可以使用相同的方法检查工作表