2

これは私たちを困惑させています。アイテムを複数選択できるレポート フィルターを備えた標準のピボット テーブルがあります。レポート フィルターで選択した項目を次のように取得できます。

Dim pi As PivotItem
For Each pi In PivotTables("MyPivot").PivotFields("MyField").PivotItems
    If pi.Visible Then
        Debug.Print pi.Value
    End If
Next

単純。私の同僚は、項目を複数選択できるレポート フィルターを備えた標準のピボット テーブルを持っています。彼は、同じコードを使用して、レポート フィルターで選択した項目を取得しようとしています。

Dim pi As PivotItem
For Each pi In PivotTables("HisPivot").PivotFields("HisField").PivotItems
    If pi.Visible Then
        Debug.Print pi.Value
    End If
Next

で Type Mismatch エラーが発生しpi.Visibleます。入力後、インテリセンスがすべてのプロパティとメソッドと共に表示されるため、これVisibleは のプロパティであることがわかります (ご想像のとおり)。pi を呼び出すと値が正しく出力されるため、pi には有効な PivotItem が含まれていることがわかります ( /ステートメントを削除すると、リスト内のすべての項目が出力されますが、値に関係なく値が出力されます)。彼のレポート フィルターには「特別な」ものはありません。計算フィールドなどではありません。の他のほとんどのプロパティも失敗します。pipi.PivotItempi.ValueIfEnd IfPivotItem

なぜPivotItemこの動作を示すのか、誰かが知っていますか? MSDN リファレンスはかなり不適切なようです。

4

4 に答える 4

2

これを少し調べた後、私が見つけたすべては、これが VBA ライブラリ コードのバグであることを示しています。ただし、このエラーに関する他のスレッド/フォーラムで言及されていない、エラーを修正するように見える方法に (偶然) つまずいたようです。

私が扱っていたピボットテーブルは、基本的に次のようになりました。

ここに画像の説明を入力

ハイライトされたセクションをマクロで非表示にしようとしていました。 エラーは、空白の日付/データを含む最初の強調表示されたセクションに対してのみスローされていたことに注意してください。

私はこのコードを使用していました:

Function RemovePivotTableBlanks(ByRef pt As PivotTable, ByVal field As String)
    Dim pi As PivotItem

    For Each pi In pt.PivotFields(field).PivotItems
        If Left(pi.Value, 1) = "<" Or Left(pi.Value, 1) = ">" Or pi.Value = "(blank)" Then

            'this throws an error, but only for the first PivotItem
            If pi.Visible = True Then
                pi.Visible = False
            End If
        End If
    Next pi
End Function

.Visibleまた、プロパティが [ローカル] ウィンドウに正しい値を表示していることにも注意してください。

何らかの理由で、 を に割り当てて.Valueオブジェクトにstring戻すと、エラーはなくなりました。PivotItem

Function RemovePivotTableBlanks(ByRef pt As PivotTable, ByVal field As String)
Application.ScreenUpdating = False
Application.EnableEvents = False
    Dim pi As PivotItem
    Dim str As String

    For Each pi In pt.PivotFields(field).PivotItems
        If Left(pi.Value, 1) = "<" Or Left(pi.Value, 1) = ">" Or pi.Value = "(blank)" Then

            str = pi.Value
            pi.Value = str

            'no error for the first PivotItem anymore
            If pi.Visible = True Then
                pi.Visible = False
            End If
        End If
    Next pi
Application.EnableEvents = True
Application.ScreenUpdating = True
End Function
于 2016-08-23T17:09:52.907 に答える
0

私の同僚は、この投稿で多くのグーグル検索を行った後、答えを見つけました:

あなたの情報とこの問題を抱えている他の人のために-私はそれをクラックして簡単にしました!

PivotField の NUMBER 形式を (GENERAL ではなく) 明示的に DATE 形式にすることで、.PivotItem.Visible = True 命令は、英国の dd/mm/yyy 日付形式を使用しても、2007 年の下で正しく実行されることがわかりました。ただし、.PivotItems(i).Visible Then ではない場合でも、タイプの不一致エラーが発生します。PivotField の DATE 形式を dd mmm yyy に変更すると (ロケールも変更せずに)、2007 でコードが正しく機能するようになります。

注意: ピボット フィールドの NUMBER 形式を設定するオプションは、ピボット テーブルのソース領域が DATA LIST の場合にのみ使用できるようです。データ ソースが単なるセル範囲である場合、フィールド設定ダイアログの NUMBER ボタンは表示されません。

Excel 2003 は、英国の日付を含む GENERAL 形式のセルを「正しい日付」に正しく合体させ、期待どおりに VBA コードを実行するように見えますが、Excel 2007 / 2010 では結果的な型の不一致エラーは発生しません。これらのバージョンでは、明示的に PivotField NUMBER フォーマット DATE を作成し、月と日の間で明確な図を作成する必要があります。

つまり、この問題があり、ピボットフィールドを DATE としてフォーマットできる場合、コードは正しく機能します。

何よりも、このコードが USA WRS の下で正常に機能するというあなたの洞察は、解決策として VBA コード以外の場所に目を向けるのに必要な目を見張るものでした。そのために私は最も感謝しています - ありがとう!

そのほとんどを理解しているふりをしたり、形式が PivotItem プロパティにまったく影響を与える理由を理解したりするつもりはありませんが、うまくいきました。私たちの解決策は、そこに詳述されている回答とは少し異なりました。彼のレポート フィルターには日付形式がありました*dd/mm/yyyy。それを変更してdd/mm/yyyy問題を修正しました。完全に不可解です。

于 2013-10-17T11:18:00.723 に答える