2

回答で更新:質問に対する回答が見つかりました。簡単にするために、ここで元の質問の下に簡略化されたバージョンを配置し、受け入れられた回答として以下のより詳細なバージョンを配置します。

ユーザーが入力した日付範囲でピボット テーブルをフィルター処理する 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 サイトを参照してください。

4

3 に答える 3

0

元のコードを改善し、私が抱えていた問題を解決する VBA 経由のピボット テーブル フィルターの設定に関する追加情報を見つけました。とても参考になる情報だったので投稿することにしました。

前に行っていたように、すべてのデータを解析し、条件に基づいて手動で可視性を設定する複雑なループではなく、単純な 1 行のコマンドで設定できるさまざまなフィルターが多数あります。以下は更新されたコードで、日付の書式設定で発生していた問題も解決しました。

VBA を使用して設定できるさまざまなピボット テーブル フィルター設定について、globaliconnect Web サイトへのこのリンクには、非常に役立つ情報がいくつかあります。

ループで比較を行う前に日付が奇妙な動作をしていた理由はまだわかりませんが、日付はそのようなものだと思います...

Sub filterPivotDate(pt As PivotTable, strtDate As Date, endDate As Date)
   Dim pf As PivotField
   Application.ScreenUpdating = False

   'Clear date filter and set new filter
   Set pf = pt.PivotFields("Date")
   pf.ClearAllFilters

   'I REPLACED THE LOOP WITH A SINGLE LINE TO SET A FILTER BETWEEN TWO DATES
   pf.PivotFilters.Add Type:=xlDateBetween, Value1:=strtDate, Value2:=endDate

   Application.ScreenUpdating = True
End Sub
于 2013-11-21T17:36:12.033 に答える
0

最初に文字列の日付値を変換してみてください。

Dim dateValue as Date

'Set new date filter on all pivot tables
For Each pt In ws.PivotTables
    Set pf = pt.PivotFields("Date")

    For Each pi In pf.PivotItems

        If IsDate(pi.Value) Then
            dateValue = CDate(pi.Value)
            If dateValue < strtDate Or dateValue > endDate Then
                pi.Visible = False
            Else
                pi.Visible = True
            End If
        End If
    Next pi

Next pt

'call this function
Function IsDate(byval thisDateString as String) As Boolean
    On Error Goto ErrorHandler

    Dim d as Date
    d = CDate(thisDateString)
    IsDate = true
    Exit Function

ErrorHandler:
    IsDate = false
End Function
于 2013-11-05T21:57:29.407 に答える