我在 Excel 中有一个数据透视表,如下所示:
Team Doc 1 Doc 2 Grand Total
Team A 13 12 25
Team B 8 7 15
Team C 32 5 37
Grand Total 53 24 77
我已经编写了一段 VBA,它将格式化任何向下钻取工作表以进行打印(Workbook_NewSheet(ByVal Sh As Object))。但是,由于我试图使其尽可能用户友好,因此我真的希望能够使用 vba 自动重命名从数据透视表生成的任何工作表。但是,我不确定如何执行此操作,因为每个工作表的内容会根据用户单击的位置而有所不同(即,如果用户单击“Team A Doc 1 Total”,则该工作表应命名为“Team A Doc 1”但如果用户单击 Doc 2 的 Grand Total 行,则该工作表应命名为“Grand Total Doc 2”) - 我认为可能会出现 15 个不同的工作表名称,这就是为什么我猜测工作表默认为表1!我认为可以通过使用 offset 来根据事件单元格获取团队名称或列名称来生成名称,但我不太确定从哪里开始,因此任何建议/帮助将不胜感激!
谢谢
最佳答案
我希望我可以发表评论,但我还不能,因为我没有足够的代表点! (必须重新启动我的帐户!)
我建议您在手动深入任何给定数据点时录制宏,并查看录制的 vba 代码的外观。我认为从那里您可以配置代码,使工作表的名称基于记录代码的某些元素。
因为我希望这是一条评论,所以如果没有帮助,我会删除它。
更新您新发布的答案:
要在用户向下钻取时检查工作表是否已存在,您可以在获取工作表名称后检查工作表是否存在,如果存在,请选择它,而不是创建一个新工作表。否则,你就创建它。
请参阅此代码:
Private Sub Workbook_NewSheet(ByVal sh As Object)
Application.ScreenUpdating = False
Dim shtCur As Worksheet
Set shtCur = ActiveSheet
Sheets("DQ Summary").Select
RN = ActiveCell.Row
CN = ActiveCell.Column
SheetName = Cells(RN, 2).Value & " - " & Cells(9, CN).Value
If SheetExists(SheetName) Then
Worksheets(SheetName).Select
Else
shtCur.Move _
After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
shtCur.Name = "SheetName"
End If
Application.ScreenUpdating = True
End Sub
Function SheetExists(wsName As String, Optional wb As Workbook = Nothing) As Boolean
SheetExists = False
Dim WS As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set WS = wb.Worksheets(wsName)
On Error GoTo 0
If Not WS Is Nothing Then SheetExists = True
End Function
关于excel - 使用 VBA 根据枢轴钻头重命名工作表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11776353/