1

1 つのワークブックから新しいワークブックに 3 つのシート (2 つのシートはピボット テーブル、1 つはそれらのピボットのソース データ) をコピーしようとしています。

以下のコードは、目的のシートを新しいワークブックにコピーして保存します (変更されたオリジナル):

Sub ExportFile()
    Dim NewName As String
    Dim nm As Name
    Dim ws As Worksheet

    With Application
        .ScreenUpdating = False
        On Error GoTo ErrCatcher

        ' Array of sheets to copy
        Sheets(Array("sourcedata", "pivot", "pivot2")).Copy
        On Error GoTo 0

        For Each ws In ActiveWorkbook.Worksheets
            ws.Cells.Copy
            ' Paste sheets
            ws.[A1].PasteSpecial

            ' Remove external links, hyperlinks and hard-code formulas
            ws.Cells.Hyperlinks.Delete
            Application.CutCopyMode = False

            ' Select A1 on sheet
            Cells(1, 1).Select
            ws.Activate
        Next ws
        Cells(1, 1).Select

        ' Save it in the same directory as original and close
        ActiveWorkbook.SaveCopyAs ThisWorkbook.Path & "\export.xls"
        ActiveWorkbook.Close SaveChanges:=False

        .ScreenUpdating = True
    End With
    Exit Sub

ErrCatcher:
    MsgBox "Specified sheets do not exist within this workbook"
End Sub

ただし、新しいワークブックを開くと、ピボット テーブルのデータ ソースは依然として元のワークブックを指しています。私の同僚は、これはシートがグループではなく 1 つずつコピーされているためであると説明し、シートを範囲としてコピーすることを提案しました。シートを範囲としてコピーするにはどうすればよいですか、またはデータ ソースを新しいコピーされたシートに変更する方が簡単な方法でしょうか?

4

3 に答える 3

2

セルではなくワークシート全体をコピーすることで、新しいブック パーツの作成を簡略化できます。

新しいピボットを新しいソースに向ける限り、Pivo​​tSource から外部参照を削除するだけで済みます。形式な[oldworkbook]sourcedata!A1:Z100ので、括弧内の部分を切り捨てるだけです。(これは普遍的な解決策ではありませんが、この場合はデータ ソース タブとピボット タブを同時にコピーしているため、新しいワークブックには同じ名前、同じサイズ、同じ範囲などのデータ タブがあることがわかります。元のワークブックとして)

Sub CopyPivotsAndData()

Dim wb As Excel.Workbook, wbNew As Excel.Workbook
Dim ws As Excel.Worksheet
Dim pt As Excel.PivotTable
Dim s As String
Dim r As Integer

    Set wb = ThisWorkbook
    wb.Worksheets(Array("sourcedata", "pivot", "pivot2")).Copy
    Set wbNew = ActiveWorkbook

    Set ws = wbNew.Worksheets("pivot")
    Set pt = ws.PivotTables(1)
    s = pt.SourceData
    r = InStr(s, "]")
    pt.SourceData = Mid(s, r + 1)

    'repeat for pivot2, or loop if you have many worksheets

    wbNew.SaveAs "newworkbookname.xlsx"

    'close or clean up as necessary

End Sub
于 2012-10-25T01:22:39.560 に答える
1

ワークシートを単にコピーするのではなく、「移動」(カットに相当するワークシート)したいと思うかもしれません。Excelで何かをコピーしても、コピーされたデータの新しい場所への参照は変更されません(元のデータが引き続き使用されます)。ただし、ある場所から別の場所にデータを切り取ると、そのデータの新しい場所への参照が変更されます。だから私はこのようなことをします:

Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
Sheets("Sheet3").Activate
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Move Before:=Workbooks("Book2").Sheets(2)

これは記録されました-明らかに、特定の状況に合わせて.Moveコマンドを適切に使用する必要があります。

または、セルに対してこれを行う場合は、次を使用します。

ws.Cells.Cut

で保存せずに元のブックを閉じているように見えるActiveWorkbook.Close SaveChanges:=Falseので、これは問題ではないと思いますが、参考までに、後で保存しない限り、元のコピーにカットは影響しません。

于 2012-10-24T21:16:50.493 に答える
0

最も簡単なオプションは、ピボットのデータソースを変更することだと感じました。これが最もクリーンな構文なのか、ショートカットがあるのか​​はわかりませんが、私にとってはうまくいきます。

' Change pivot table data source
ActiveWorkbook.Worksheets("pivot").PivotTables("PivotTable1").ChangePivotCache ActiveWorkbook. _
PivotCaches.Create(SourceType:=xlDatabase, SourceData:="stagePivotData", _
Version:=xlPivotTableVersion10)
于 2012-10-25T18:07:27.817 に答える