【问题标题】:Adding a pivot table to a new sheet with data on the same sheet将数据透视表添加到具有同一工作表上的数据的新工作表
【发布时间】:2018-03-24 21:18:51
【问题描述】:

我的代码根据以下代码创建一个新工作表,即ws2,其中我有一个从ws1 提取的表格。我想根据代码的底部在单元格“L4”中的同一工作表ws2 上放置一个数据透视表,但它不起作用。

Sub ClickThisMacro()

Dim i As Long
Dim y As Long
Dim n As Long

Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Report")

Dim ws2 As Worksheet: Set ws2 = Sheets.Add

Set rng1 = ws1.Range("A:A").Find("Name")

fr = rng1.Row
lr = ws1.Range("B" & Rows.Count).End(xlUp).Row
y = 2

For i = fr + 1 To lr
    ws2.Cells(y, 1) = ws1.Cells(i, 1)
    ws2.Cells(y, 2) = ws1.Cells(i, 2)
    ws2.Cells(y, 3) = ws1.Cells(i, 3)
    ws2.Cells(y, 4) = ws1.Cells(i, 4)
    ws2.Cells(y, 5) = ws1.Cells(i, 18)

    y = y + 1
Next i

ws2.Cells(1, 1) = "Cost centre name"
ws2.Cells(1, 2) = "Cost centre code"
ws2.Cells(1, 3) = "Phone number"
ws2.Cells(1, 4) = "User name"
ws2.Cells(1, 5) = "Amount"

LastRow = ws2.Range("A1").End(xlDown).Row

' making columns C and F numbers
ws2.Range("C2:C" & LastRow).Select

For Each xCell In Selection
    xCell.Value = xCell.Value
Next xCell

With ws2.UsedRange.Columns(5)
    .Replace "£", "", xlPart
    .NumberFormat = "#,##0.00"
    .Formula = .Value
End With

With ws2.UsedRange.Columns(8)
    .Replace "£", "", xlPart
    .NumberFormat = "#,##0.00"
    .Formula = .Value
End With

'Pivot table
Dim mypivot As PivotTable
Dim mycache As PivotCache

Set mycache = ws2.PivotCaches.Create(xlDatabase, Range("a1").CurrentRegion)

Set mypivot = ws2.PivotTables.Add(mycache.Range("l4"), "Mypivot1")

mypivot.PivotFields("Cost centre name").Orientation = xlRowField
mypivot.PivotFields("Cost centre code").Orientation = xlColumnField
mypivot.PivotFields("Amount").Orientation = xlDataField

End Sub

【问题讨论】:

    标签: vba excel pivot-table


    【解决方案1】:

    在设置PivotCachePivotTable 对象的部分,您的代码中有一些语法错误。

    修改后的代码(数据透视表部分)

    ' set the Pivot-Cache
    Set mycache = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=ws2.Range("A1").CurrentRegion.Address(False, False, xlA1, xlExternal))
    
    ' set the Pivot-Table object
    Set mypivot = ws2.PivotTables.Add(PivotCache:=mycache, TableDestination:=ws2.Range("L4"), TableName:="Mypivot1")
    
    With mypivot
        .PivotFields("Cost centre name").Orientation = xlRowField
        .PivotFields("Cost centre code").Orientation = xlColumnField
        .PivotFields("Amount").Orientation = xlDataField
    End With
    

    您应该添加到代码中的一些其他修改/建议:

    1. 使用Find,您应该处理找不到您要查找的术语的情况(即使不太可能),在这种情况下,如果Rng1 = Nothing 然后fr = Rng1.Row 将导致运行时错误。

    处理Find代码:

    Set Rng1 = ws1.Range("A:A").Find("Name")
    If Not Rng1 Is Nothing Then ' confirm Find was successfull
        fr = Rng1.Row
    Else ' if Find fails
        MsgBox "Critical Error, couldn't find 'Name' in column A", vbCritical
        Exit Sub
    End If
    
    1. 您应该避免使用SelectSelection,您可以使用完全限定的Range 对象:

    循环一个范围:

    For Each xCell In ws2.Range("C2:C" & lr)
        xCell.Value = xCell.Value
    Next xCell
    

    【讨论】:

    • 谢谢!绝对完美!
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多