2016-08-17 45 views
0

私は毎日のデータを持つピボットテーブルから情報を取り出すチャートを持っています。 ROW LABELのデータをフィルタリングして、先週と先月のデータの動作を確認できるようにactiveXボタンを作成しようとしていますvbaを使用したピボットテーブルのフィルタリング

今まで私が今まで持っていたことはありません作業は次のとおりです。

整数

If weekbtn1 = True Then 
i = 0 
Do Until Datavalue(date) - i = 42005 
With ActiveSheet.PivotTables("Pivotcompsprice").PivotFields("Date") 
    .PivotItems DateValue(Date) - i.Visible = False 
    i = i + 1 
End With  
Loop 

i = 0 
Do Until i = 7 
With ActiveSheet.PivotTables("Pivotcompsprice").PivotFields("Date") 
    .PivotItems Datevalue(date) - i.Visible = True 
End With 
Loop 
Else 
End If 

End Subの

としてプライベートサブweekbtn1_Click() 薄暗い私それは私が1/1であるデータを持っている最後の日であるので、私は、この42005を置きます/2015...私はすべてのデータを「偽」としてフィルタリングすることが可能であったと思って、私が望むものを真にすることはできますが、うまくいかないのです!

誰かが私を助けることができますか?

+0

ps:私が入れたvbaは先週のことです...私の意図は、先月のいくつかの変更で同じマクロを行うことです –

答えて

0

PivotFieldのすべてのアイテムを非表示にすることはできません。常に少なくとも1つは見えるようにしなければなりません。

あなたはこのすなわち作り付け日付フィルタに機能を利用するためにVBAを使用する場合、それははるかに高速かつ容易になります。 https://1drv.ms/x/s!Ah_zTnaUo4DzjhezQ3OTq9tq1APC

注: DateFilter

ここで私はちょうどそれを行うサンプルファイルがありますこの機能はRowFieldsまたはColumnFieldでのみ使用できます。したがって、私のコードはPageFieldsで動作しません。

ここでは、ピボット・フィールドをフィルタリングするインターバル・タイプとインターバル期間を選択できるようにする汎用ルーチンがあります。また、必要に応じて、前後にカウントする日付を選択することもできます。

Sub Pivots_FilterPeriod(sInterval As String, _ 
         lNumber As Long, _ 
         Optional vRelativeTo As Variant, _ 
         Optional pf As PivotField) 

    'Programmer:  Jeff Weir 
    'Contact:   [email protected] 
    'Description:  Lets you programatically filter a Pivot RowField or ColumnField by specifying 
    '     an interval type (e.g. days, weeks, months, quarters, years) 
    '     as well as an interval count (e.g. 7, -7) 
    '     If the optional vRelativeTo field is left blank, it counts back/foward from 
    '     the youngest/oldest item depending on whether lNumber is positive/negative 
    '     It leverages off the inbuilt DateFilters functionality, and as such does not 
    '     work on RowFields. 


    Dim dteDateAdd As Date 
    Dim dteFrom As Date 
    Dim dteTo As Date 

    On Error GoTo errhandler 

    If pf Is Nothing Then 
     On Error Resume Next 
     Set pf = ActiveCell.PivotField 
     On Error GoTo errhandler 
     If pf Is Nothing Then GoTo errhandler 
    End If 

    With pf 
     If .DataType = xlDate _ 
      And .Orientation <> xlPageField _ 
      And .Orientation <> xlDataField Then 

      If IsMissing(vRelativeTo) Or vRelativeTo = "" Then 
       .AutoSort xlAscending, "Date" 
       If lNumber > 0 Then 
        vRelativeTo = .PivotItems(1) 
       Else 
        vRelativeTo = .PivotItems(.PivotItems.Count) 
       End If 
      End If 

      Select Case UCase(sInterval) 
       Case "D", "DD", "DDD", "DDDD", "DAY", "DAYS": sInterval = "d" 
       Case "W", "WW", "WWW", "WWWW", "WEEK", "WEEKS": sInterval = "ww" 
       Case "M", "MM", "MMM", "MMMM", "MONTH", "MONTHS": sInterval = "m" 
       Case "Q", "QQ", "QQQ", "QQQQ", "QUARTER", "QUARTERS": sInterval = "q" 
       Case "Y", "YY", "YYY", "YYYY", "YEAR", "YEARS": sInterval = "yyyy" 
      End Select 

      dteDateAdd = DateAdd(sInterval, lNumber, vRelativeTo) 
      If lNumber > 0 Then 
       dteDateAdd = dteDateAdd - 1 
      Else 
       dteDateAdd = dteDateAdd + 1 
      End If 

      If dteDateAdd < vRelativeTo Then 
       dteFrom = dteDateAdd 
       dteTo = vRelativeTo 
      Else 
       dteFrom = vRelativeTo 
       dteTo = dteDateAdd 
      End If 

      With Application 
       .ScreenUpdating = False 
       .EnableEvents = False 
       .Calculation = xlCalculationManual 
      End With 

      .ClearAllFilters 
      .PivotFilters.Add2 _ 
       Type:=xlDateBetween, _ 
       Value1:=CStr(dteFrom), _ 
       Value2:=CStr(dteTo) 
     End If 
    End With 

errhandler: 
    With Application 
     .ScreenUpdating = True 
     .EnableEvents = True 
     .Calculation = xlCalculationAutomatic 
    End With 

End Sub 

さまざまなパラメータを使用して実際にどのように見えるかを示すスクリーンショットです。

これは、最新のデータから最後の5日間にフィルタリングする方法を示しています。

Last 5 days from most recent data

と記号を変更することで、それは我々が最も古いデータから最初の5日間たくなければならないことをうまくいきます記録上:

First 5 days from oldest records

あなたがそのrelativeToでフィールドに実際の日付を指定した場合、それは数値パラメータは正/ negatであるかどうかに応じて、そこから前方/バックカウントされますive。

Next 5 days from today

...と、ここで最後の5日間です:ここで私はこれを書いている今日の日付から次の5日間です

enter image description here

それはあなたが日かどうかを指定できます、週、四半期、月、または年。例えば、ここに戻って最新のレコードから数えて2週間です:

enter image description here

が、私はそれをトリガーするためにここにWorksheet_Changeイベントを使用していますが、あなたが好きなら、あなたはボタンにそれをフックすることができ、必要なパラメータを入力します。

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim bContinue As Boolean 
    If Not Intersect(Target, Range("Interval")) Is Nothing Then bContinue = True 
    If Not Intersect(Target, Range("Number")) Is Nothing Then bContinue = True 
    If Not Intersect(Target, Range("RelativeTo")) Is Nothing Then bContinue = True 
    If bContinue Then Pivots_FilterPeriod [Interval], [Number], [RelativeTo], Sheet1.PivotTables(1).PivotFields("Date") 

End Sub 
関連する問題