1

我正在尝试自动化报告。第一步是创建一个数据透视表,我认为正在创建数据透视表,但我无法在工作表上查看它。

 Sub CurrentPipelineView()
 Dim pt As PivotTable
 Dim ptcache As PivotCache
 Dim pf As PivotField
 Dim pi As PivotItem
 Dim ws As Worksheet
 Dim wspivot As Worksheet
 Dim datasheetname As String
 Dim totalrows As Integer
 Dim tottalcolumns As Integer

For Each ws In ThisWorkbook.Worksheets
  If ws.Name = "PivotTest1" Then
  ws.Delete
  End If
  Next


 'Setting sheet names
  SheetName = "Data" 'storing sheet name which will be default
  Set ws = Worksheets(SheetName)
  Sheets.Add.Name = "PivotTest1"
  Set wspivot = Worksheets("PivotTest1")
  wspivot.Select 'Activating worksheet


 'Delete any prior pivot tables
  On Error Resume Next
  For Each CurrentViewPt In wspivot.PivotTables
    CurrentViewPt.TableRange2.Clear
Next CurrentViewPt

 'Defining pivot table cache
  ws.Select
  totalcolumns = ws.Cells(1, Columns.Count).End(xlToLeft).Column
  totalrows = ws.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count 'Counting           total rows
  Set PRange = ws.Range("A1").Offset(totalrows, totalcolumns)
  Set ptcache = ActiveWorkbook.PivotCaches.Create(xlDatabase, PRange)


  'Create pivot table
   wspivot.Select
   Set pt = ActiveSheet.PivotTables.Add(ptcache, Range("A3"), "PipelineView")

   End Sub

我想要做的是从数据库生成的第一张表中获取数据并使用它来制作报告。

为了做出正确的支点,我想逐个字段地调试代码,以确保我添加了正确的字段。当我运行它时,我看不到工作表上的数据透视表,就像我在 excel 中手动执行它一样。

感谢和问候瓦伦

4

2 回答 2

0

看起来问题是PRange对象 - 它只是设置到该字段的右下角单元格。尝试将其更改为:

Set PRange = Range(ws.Range("A1"), ws.Range("A1").Offset(totalrows, totalcolumns))

我还ptcache.CreatePivotTable(...)用来创建数据透视表:

Set pt = ptcache.CreatePivotTable(TableDestination:=wspivot.Range("A3"), TableName:="YourTableName")

编辑:

使用它来设置 PRange:

Set prange = Range(ws.Range("A1"), ws.Range("A1").Offset(totalrows, totalcolumns - 1))

我的代码的问题是它添加了一个额外的列(它是空白的),这会引发错误。

于 2013-03-22T22:39:30.353 回答
0

终于让代码工作了。使用 PivotTableWizard 而不是添加/创建数据透视缓存。

下面是我的代码。还找到了一个函数 .UsedRange 用于选择使用的范围

Public Sub CountingRows()

Dim ws As Worksheet
Dim SheetName As String 'data sheet name
Dim TotalRows As Integer 'counts total number of rows
Dim TotalColumns As Integer 'sets total number of columns
Dim Counter As Integer 'Counter to start the loop
Dim wsPivot As Worksheet
Dim CreatePt As PivotTable 'creates using pivot table wizard
Dim CurrentViewPt As PivotTable
Dim PRange As Range
Dim PTCache As PivotCache
Dim PF As PivotField

'Deleting sheet if it already exists
   For Each ws In ThisWorkbook.Worksheets
   If ws.Name = "PivotTest1" Then
     ws.Delete
    End If
    Next

'Setting sheet names
SheetName = "Sheet 1" 'storing sheet name which will be default
 Set ws = Worksheets(SheetName)
Sheets.Add.Name = "PivotTest1"
 Set wsPivot = Worksheets("PivotTest1")
wsPivot.Select 'Activating worksheet

 'Delete any prior pivot tables
On Error Resume Next
For Each CurrentViewPt In wsPivot.PivotTables
    CurrentViewPt.TableRange2.Clear
Next CurrentViewPt

'Defining pivot table cache
 ws.Select
TotalColumns = ws.Cells(1, Columns.Count).End(xlToLeft).Column 'Counting total columns
TotalRows = ws.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count 'Counting total rows
Set PRange = ws.UsedRange 'found a new function to use do not need to use above fields, but keeping them just incase
'Set PRange = ws.Cells(1, 1).Resize(TotalRows, TotalColumns)<<<Not sure if it works>>>
wsPivot.Select
 Set PTCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange)


'Create the Pivot Table
 Set CreatePt = wsPivot.PivotTableWizard(SourceType:=xlDatabase, SourceData:=PRange, TableDestination:=wsPivot.Range("B4"), TableName:="CurrentNBI")
 Set CurrentViewPt = wsPivot.PivotTables("CurrentNBI")

'**** Define the layout of the pivot table****
 With CurrentViewPt.PivotFields("NBI_CODE")
    .Orientation = xlRowField
    .Position = 1
  End With
   With CurrentViewPt.PivotFields("CREATION_DATE")
   .Orientation = xlRowField
   .Position = 2
   End With
   With CurrentViewPt.PivotFields("BUSINESS_AREA")
    .Orientation = xlRowField
   .Position = 3
   End With
 With CurrentViewPt.PivotFields("CASE_CLASSIFICATION")
   .Orientation = xlRowField
   .Position = 4
End With
With CurrentViewPt.PivotFields("BOOKING_CENTER")
   .Orientation = xlRowField
   .Position = 5
 End With
With CurrentViewPt.PivotFields("LOCATION")
   .Orientation = xlRowField
   .Position = 6
 End With
With CurrentViewPt.PivotFields("INITIATIVE_NAME")
   .Orientation = xlRowField
   .Position = 7
End With
With CurrentViewPt.PivotFields("BRIEF_DESCRIPTION")
   .Orientation = xlRowField
   .Position = 8
 End With
With CurrentViewPt.PivotFields("TARGET_ASSESSMENT_DATE")
   .Orientation = xlRowField
   .Position = 9
End With
With CurrentViewPt.PivotFields("ASSESSMENT_COMPLETION_DATE")
   .Orientation = xlRowField
   .Position = 10
 End With
 With CurrentViewPt.PivotFields("NBI_CODE")
    .Orientation = xlDataField
    .Position = 1
    .xlCount = True
 End With


 'Setting sub-totals to zero
  ActiveSheet.PivotTables("CurrentNBI").PivotFields("NBI_CODE").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
 ActiveSheet.PivotTables("CurrentNBI").PivotFields("CREATION_DATE").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
 ActiveSheet.PivotTables("CurrentNBI").PivotFields("BUSINESS_AREA").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
ActiveSheet.PivotTables("CurrentNBI").PivotFields("CASE_CLASSIFICATION").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
  ActiveSheet.PivotTables("CurrentNBI").PivotFields("BOOKING_CENTER").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
  ActiveSheet.PivotTables("CurrentNBI").PivotFields("LOCATION").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
  ActiveSheet.PivotTables("CurrentNBI").PivotFields("INITIATIVE_NAME").Subtotals = _
    Array(False, False, False, False, False, False, False, False, False, False, False, False)
 End Sub
于 2013-03-27T13:34:14.800 回答