回答で更新:質問に対する回答が見つかりました。簡単にするために、ここで元の質問の下に簡略化されたバージョンを配置し、受け入れられた回答として以下のより詳細なバージョンを配置します。
ユーザーが入力した日付範囲でピボット テーブルをフィルター処理する VBA 関数を作成しています。何らかの理由で、期待される結果が返されません。
比較される日付は、2 つの異なる日付形式です。ユーザーが入力した日付は mmmm yyyy 形式 (2013 年 10 月) です。この値が比較のためにマクロに取り込まれると、2013 年 10 月 1 日として正しく変換されます。ピボット テーブルの日付は mmm yy 形式 (10 月 13 日) です。コードでこの日付を呼び出すとPivotItem.Value
、日付が文字列「10 月 13 日」として変換されているようです。
マクロの動作がやや不安定なので、マクロが何をしているのかよくわかりません。2011 年 10 月から 2013 年 10 月まで実行すると、2008 年、2009 年、2010 年など、毎年 1 月から 9 月までのすべての月が返されます。2013 年 6 月から 2013 年 10 月まで実行すると、毎年 6 月から 9 月までが返されます。 . さらに、各例では、マクロはピボット テーブル内のデータの最大範囲を超えて実行され続け、エラーが発生します。デバッグすると、マクロは、ピボット テーブルにも存在しない日付の可視性を「true」に設定しようとしています (データが 2013 年 10 月のみを通過する 2014 年 1 月の IE)。なぜそれが起こっているのか分かりません。
以下はコードです。どんな洞察も大歓迎です。
アップデート:
したがって、問題は間違いなく日付形式です。ピボット テーブルのフィールド設定を日付形式 mm/dd/yyyy (2013 年 10 月 1 日) に変更すると、マクロは期待どおりに機能します。これは、テーブルがユーザーダッシュボードに表示されるグラフをフィードしていることを除いて、問題の簡単な修正になります。これは、見た目がずっときれいなので、mmm yy の形式にしたいと思っています。比較のためにマクロ内でフォーマットを mm/dd/yyyy に変換し、完了したら目的のフォーマットに戻す簡単な方法はありますか?
そして、比較される生データが同じであり、両方が日付とテキストなどではなく、日付としてフォーマットされている場合、異なる日付形式がこのような異なる結果を返す理由を理解したいと思います。
Sub filterPivotDate(pt As PivotTable, strtDate As Date, endDate As Date)
Dim pf As PivotField
Dim pi As PivotItem
'Clear current date filter
Set pf = pt.PivotFields("Date")
pf.ClearAllFilters
'Set new date filter
For Each pi In pf.PivotItems
If pi.Value >= strtDate And pi.Value <= endDate Then
pi.Visible = True
Else
pi.Visible = False
End If
Next pi
end sub
回答の更新: フィルターを設定するために使用していたループを、次のコード行に置き換えました。
pf.PivotFilters.Add Type:=xlDateBetween, Value1:=strtDate, Value2:=endDate
これにより、日付形式で発生していた問題が解決されました。詳細については、以下の受け入れられた回答と、この Web サイトを参照してください。