4

わかりました、私はVBAを初めて使用しますが、これが可能でなければならないことを知っています. Android アプリケーションのコーディングにしばらく費やしましたが、自分自身をほとんど専門家とは呼びません。正直に言うと、おそらく中級者でさえありません。しかし、残念ながら、Excel は Java を使用していません。これが私の問題です:

必要なのは、同じシート上に他の 6 つのピボット テーブルを作成し、これをプライマリ ピボット テーブルと呼ぶことだけです。ただし、模倣する必要がある唯一の機能 (今のところ私が推測する) は、プライマリが拡張/崩壊したときであり、他の機能はそれに追随する必要があります。

コードは Java の onclicklistener に似ていると思います。コードがプライマリ ピボット テーブルの折りたたみまたは展開のクリックを「聞く」と、同じ折りたたみまたは展開が他の 6 つに適用されます。他の 6 つのピボットは常に同じ行ラベルを持つため、クリックの「位置」をプライマリから他のピボットに引き継ぐ際のエラーは問題になりません。

ピボット テーブルの行ラベルの 1 つの展開を記録しようとしたところ、このコードが返されました。

ActiveSheet.PivotTables("PivotTable1").PivotFields("Year").PivotItems("2005"). _
    ShowDetail = True

ただし、これがその展開を実行するためのコーディングであることは知っています (ShowDetail = False を使用すると、展開が折りたたまれます)。私が必要としているのは、私が言ったように、プライマリピボットテーブルの展開/折りたたみのクリックを「聞く」リスナー、どの行ラベルがクリックされたかに関する情報を保存/引き継ぐ方法(「場所」必要に応じてクリックしてください)、次に上記のコードの一般的なバージョンを使用して、他の 6 で実行します。ある種の for ループを推測しています。

私は正しい軌道に乗っていますか? いつもありがとうございます。

4

1 に答える 1

5

これはあなたのために働くはずです:

これを標準モジュールに入れます(これは効率の低い方法です-すべてのフィールドをチェックするため):

Sub LinkPivotTables_ByFieldItemName_ToShowDetail(pt As PivotTable)

Dim wkb As Workbook
Set wkb = ThisWorkbook

Dim wks As Worksheet
Set wks = wkb.Sheets(1)

Dim PivotTableIndex As Integer
Dim PivotFieldIndex As Integer
Dim PivotItemIndex As Integer

Dim PivotFieldIndexName As String
Dim PivotItemIndexName As String

Dim BoolValue As Boolean

Application.ScreenUpdating = False
Application.EnableEvents = False

On Error Resume Next

    For PivotFieldIndex = 1 To pt.PivotFields.Count

    PivotFieldIndexName = pt.PivotFields(PivotFieldIndex).Name

        For PivotItemsIndex = 1 To pt.PivotFields(PivotFieldIndex).PivotItems.Count

        PivotItemIndexName = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).Name
        BoolValue = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail

            For PivotTableIndex = 1 To wks.PivotTables.Count

                ' This If statement will dramatically increase efficiency - because it takes a long long time to set the value but it doesn't take long to check it.
                If wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndexName).PivotItems(PivotItemIndexName).ShowDetail <> BoolValue Then
                    wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndexName).PivotItems(PivotItemIndexName).ShowDetail = BoolValue
                End If

            Next PivotTableIndex

        Next PivotItemsIndex

    Next PivotFieldIndex


Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

次に、ピボットテーブルの編集でこのマクロを自動的に実行するには、これをSheet1コードに配置する必要があります(サポートが必要な場合はお知らせください)。

Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

    Call LinkPivotTables_ByFieldItemName_ToShowDetail(Target)

End Sub

すべてのピボットテーブルがシート1にある場合に機能します。行の長さの制限について心配していなかったので、最初にワードパッドまたは別のテキストエディタにコピーして貼り付ける必要があるかもしれません(ワードラップに注意してください)。

編集/追加:

これは、特定のシートオブジェクトにコードを配置する方法です。 PutCodeOnSheetObject

EDIT2 / ADDITION2-効率性の方法:

この方法は効率を劇的に向上させますが、同期するフィールドを具体的に指定する必要があります(すべてを同期するわけではありません)。

Sub LinkPivotTables_ByFieldItemName_ToShowDetail(pt As PivotTable)  'takes as argument - pt As PivotTable

Dim wkb As Workbook
Set wkb = ThisWorkbook

Dim wks As Worksheet
Set wks = wkb.Sheets(1)

Dim PivotTableIndex As Integer
Dim PivotItemIndex As Integer
Dim PivotFieldIndex As String
Dim BoolValue As Boolean
Dim ItemName As String

Application.ScreenUpdating = False
Application.EnableEvents = False

PivotFieldIndex = "Year"

On Error Resume Next


        For PivotItemsIndex = 1 To pt.PivotFields(PivotFieldIndex).PivotItems.Count

        BoolValue = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail
        ItemName = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).Name

            For PivotTableIndex = 1 To wks.PivotTables.Count

                ' This If statement will dramatically increase efficiency - because it takes a long long time to set the value but it doesn't take long to check it.
                If wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail <> BoolValue Then
                    wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail = BoolValue
                End If

            Next PivotTableIndex

        Next PivotItemsIndex

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

この行で、同期するフィールドを手動で指定する必要があります。

PivotFieldIndex = "Year"

同じループ方法を使用してピボットテーブルを同期する他のいくつかのソリューションをオンラインで見つけました。問題は、適切なサイズのピボットテーブルを取得すると、すべて同じ効率の問題が発生することです。これらは、Item.ShowDetail値を設定する前にチェックするIFステートメントを含めることで、この問題をある程度回避します(値を設定するのに、単にチェックするよりもかなり長い時間がかかるため)。幸運を。

于 2012-09-10T18:59:44.420 に答える