【发布时间】:2015-02-17 08:43:04
【问题描述】:
我经常发现,对于数据透视表,我最终会得到大量来自通过数据透视表钻取创建的新工作表的工作表。我认为一个很棒的宏是在从数据透视表创建的所有新工作表的右上角显示一个小的用户窗体,允许用户轻松删除工作表并返回到数据透视表。但是,我不知道如何触发宏。有任何想法吗?基本上,只要通过在数据透视表中向下钻取创建新工作表,就需要自动触发宏。
【问题讨论】:
我经常发现,对于数据透视表,我最终会得到大量来自通过数据透视表钻取创建的新工作表的工作表。我认为一个很棒的宏是在从数据透视表创建的所有新工作表的右上角显示一个小的用户窗体,允许用户轻松删除工作表并返回到数据透视表。但是,我不知道如何触发宏。有任何想法吗?基本上,只要通过在数据透视表中向下钻取创建新工作表,就需要自动触发宏。
【问题讨论】:
不要太复杂,您可能正在寻找这样的东西......
在“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
【讨论】:
要在创建新工作表时启动事件,您可以使用以下示例(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
【讨论】: