0

2 つのセル入力 (開始日、終了日) からピボット テーブル (日付) のフィルターを更新しようとしています。 table は、範囲内の日付のみを表示するフィルターを自動的に適用します。この目的のために、インターネットでいくつかの VBA コード スニペットを見つけました。

Option Explicit

Sub FilterPivotDates()
'
Dim dStart As Date
Dim dEnd As Date
Dim pt As PivotTable
Dim pf As PivotField
Dim pi As PivotItem

Application.ScreenUpdating = False
On Error Resume Next

dStart = Sheets("Pivot").Range("StartDate").Value
dEnd = Sheets("Pivot").Range("EndDate").Value

Set pt = ActiveSheet.PivotTable2
Set pf = pt.PivotFields("Week")

pt.ManualUpdate = True

pf.EnableMultiplePageItems = True

For Each pi In pf.PivotItems
  pi.Visible = True
Next pi

For Each pi In pf.PivotItems
  If pi.Value < dStart Or pi.Value > dEnd Then
    pi.Visible = False
  End If
Next pi

Application.ScreenUpdating = False
pt.ManualUpdate = False

Set pf = Nothing
Set pt = Nothing

End Sub

ワークシートの Modules フォルダーにそれがあり、Sheet "Pivot" に "Option Explicit" を入れました。日付入力のある2つのセルに範囲名「StartDate」と「EndDate」を割り当て、マクロでボタンを割り当てました。ピボットテーブルには「ピボットテーブル」という名前が付けられ、フィルター処理する必要があるそれぞれのフィールドには「週」という名前が付けられます。しかし、ボタンを押しても何も起こりません...誰かがコードにエラーを見ていますか、それとも別の方法で実装する必要がありますか?

ありがとうございます!

4

2 に答える 2

1

ファイナルを変更してみる

Application.ScreenUpdating = False

Application.ScreenUpdating = True

すべてを適切に実行したのに、それが表示されない可能性があります:) そうでない場合 (そうではないように聞こえます)、同様のタイプを比較していない可能性があります。これは答えではありませんが、何が問題なのかを理解するのに役立つ場合があります。入力セルの値/型を決定するために、ループのデバッグ ステートメントをいくつか配置してみてください。

Debug.Print "dStart Value: " & dStart.Value
Debug.Print "dEnd Value: " & dEnd.Value
Debug.Print "dStart Type: " & VarType(dStart)
Debug.Print "dEnd Type: " & VarType(dEnd)

次に、ループに別のチェックを追加します。

For Each Pi In pf.PivotItems
  Debug.Print "Pi Value: " & Pi.Value
  Debug.Print "Pi Type: " & VarType(Pi.Value)
  If Pi.Value < dStart Or Pi.Value > dEnd Then
    Pi.Visible = False
  End If
Next Pi

繰り返しますが、これで何かが明らかになるかどうかはわかりませんが、コードは機能しているが何も比較していない可能性があります。その点について、ループを変更して、選択する値をハードコーディングすることでループが機能していることを確認しましたか? それが機能する場合は、もう少し絞り込むことができます。

于 2012-08-16T20:19:34.343 に答える
0

私の推測では、あなたの問題は dstart と dend にあります。値を取得することで、日付がExcelの数値に変わると思います。

この行を変更してみてください:

    If pi.Value < dStart Or pi.Value > dEnd Then

次のようなものに:

    If cdate(pi.value)< cdate(dStart) Or cdate(pi.value) > cdate(dend) then

それが機能しない場合は、作成した 2 つの変数に cdate のみを配置してみてください

于 2012-08-16T20:42:58.430 に答える