首页 > 解决方案 > 从数据透视表命名 showdetail 工作表时嵌套 For Loop 出牙问题

问题描述

我有一些代码可以做三件事......

  1. 显示每行的所有数据透视表行标签的详细信息c
  2. 在行标签上命名包含显示详细信息数据的工作表。对于每个长x
  3. 由于某些行标签超过 30 个字符 - 它使用一个if函数来检查行标签是否包含 30 个字符,然后将其削减,以便行标签名称可以适合。

但是,我遇到了一些初期问题……在显示第一行标签的详细信息后,它随后将第一张表命名为所有表的名称。我显然把我的循环搞混了,但我不确定我哪里出错了。有人可以建议吗?谢谢你。

Sub test()

Dim PivotSheet As Worksheet
Set PivotSheet = ActiveWorkbook.Worksheets("Pivot Table")

 Dim c As Range, x As Long, lastrow As Long
 lastrow = PivotSheet.cells.Find("*", cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row
 
    With PivotSheet.PivotTables(1)
        For Each c In .DataBodyRange.Resize(, 1)
            c.ShowDetail = True ' shows details of pivot table row labels
           For x = 6 To lastrow - 1
           If Len(PivotSheet.cells(x, 1)) > 31 Then 
           ActiveSheet.Name = Left(PivotSheet.cells(x, 1), 30) ' names spreadsheet containing pivottable details depending on row label
           Else
          ActiveSheet.Name = PivotSheet.cells(x, 1)
         End If
          Next x
          Next c
        ActiveSheet.Move After:=Sheets(12)
    End With
    
End Sub

标签: excelvba

解决方案


我认为您不需要内部循环(假设工作表标签与c工作表的第一列来自同一行)

Sub test()

    Dim PivotSheet As Worksheet, ws As Worksheet, wb As Workbook
    Dim c As Range, x As Long, lastrow As Long
    
    Set wb = ActiveWorkbook
    Set PivotSheet = wb.Worksheets("Pivot Table")

    lastrow = PivotSheet.Cells.Find("*", PivotSheet.Cells(1, 1), _
                  xlFormulas, xlPart, xlByRows, xlPrevious, False).Row
 
    For Each c In PivotSheet.PivotTables(1).DataBodyRange.Columns(1).Cells
       c.ShowDetail = True   ' shows details of pivot table row labels
       Set ws = ActiveSheet  'get a reference to the new sheet
       ws.Name = Left(c.EntireRow.Cells(1).Value, 30) 'no need for a test here...
       ws.Move After:=wb.Sheets(12)
    Next c
    
End Sub

推荐阅读