2016-09-08 9 views
1

ImはVBAで非常に新しいものです。私は私のプロジェクトについて説明します。セルからピボットテーブルに日付を挿入してフィルタとして使用する

フィルタリングする情報がたくさんあるExcelシートがあります。現時点では私のコードは次のようになります。

With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields(_ 
     "CREATION_DATE") 
     .Orientation = xlPageField 
     .Position = 1 
    End With 

ActiveSheet.PivotTables("Tableau croisé dynamique2").AddDataField ActiveSheet. _ 
    PivotTables("Tableau croisé dynamique2").PivotFields("AMOUNT"), _ 
    "Nombre de AMOUNT", xlCount 

With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("STATUS") 
    .Orientation = xlRowField 
    .Position = 1 
End With 

With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields(_ 
    "VENDOR_NAME") 
    .Orientation = xlRowField 
    .Position = 2 
End With 

With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields(_ 
    "INVOICE_NUM") 
    .Orientation = xlRowField 
    .Position = 3 
End With 

With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields(_ 
    "Nombre de AMOUNT") 
    .Caption = "Somme de AMOUNT" 
    .Function = xlSum 
End With 

ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields(_ 
    "CREATION_DATE").CurrentPage = "08/09/2016" 

このコードは、日付2016年8月9日にフィルタリングするために抽出するために動作します。 ここで、コードを起動する前にピボットテーブルにこの日付を取得させたいと思います。

しかし、私が望む日付を変更するたびにコードに入る必要はありません。

ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields(_ 
     "CREATION_DATE").CurrentPage = "A1" 

私は、セル「A1」に「2016年9月9日」書くしかし、私は、デバッグエラーを取得しています: 例:

私はこのような何かをしたいと思います。

+0

'.CurrentPage =範囲( "A1")Value2' ...あなたは'その周りに) 'CDate関数を(ラップする必要があるかもしれません。 –

+0

あなたの責任感ありがとうございますが、うまくいきません。 Cdate()をラップするとどういう意味ですか? ActiveSheet.PivotTables( "Tableaucroisédynamique2")。PivotFields(_ "CREATION_DATE")。CurrentPage = Range(CDate( "'Sheet_date'!A1"))。値2 – Thistlepower

+0

スコットは、 CurrentPage = Range( "A1").Value2'は動作しません。 '... .CurrentPage = CDate(Range( "A1").Value2) 'を使用してください。しかし、実際には文字列が必要な場合がありますので、Scottの提案がどちらもうまくいかない場合は、 '.CurrentPage = Format(CDate(Range(" A1 ").Value2)、" dd/mm/yyyy ")'(または "mm/dd/yyyy" - その日付がどの形式であるかによって異なります)。 – YowE3K

答えて

0

いくつかのテストの後、原因を見つけました(Excelブックで)。それはピボットフィールドのフォーマットに関連していた "CREATION_DATE"、私はそれが働いた次のセクションを追加しました。

Set PvtFld = PvtTbl.PivotFields("CREATION_DATE") 
With PvtFld 
    .Orientation = xlPageField 
    .NumberFormat = "dd/mm/yyyy" ' << this line 
    .Position = 1 
End With 

そして完全なコードのために:。

Sub PivotFilterDate() 

Dim PvtTbl    As PivotTable 
Dim PvtFld    As PivotField 

' set your Pivot Table (after created) to a variable 
Set PvtTbl = Sheets("PivotSpanish").PivotTables("Tableau croisé dynamique2") 

' Set "CREATION_DATE" to a Pivot Field variable 
Set PvtFld = PvtTbl.PivotFields("CREATION_DATE") 
With PvtFld 
    .Orientation = xlPageField 
    .NumberFormat = "dd/mm/yyyy" 
    .Position = 1 
End With 

' you can modify your code to change all field setting, like following 2: 
With PvtTbl.PivotFields("STATUS") 
    .Orientation = xlRowField 
    .Position = 1 
End With 

With PvtTbl.PivotFields("VENDOR_NAME") 
    .Orientation = xlRowField 
    .Position = 2 
End With 

' clear previous filters 
PvtFld.ClearAllFilters 

' --- trapping errors --- 
' added a Boolean Flag to trap scenarios where no Pivot Item found that matches the value in Cell A1 
Dim PvtItemExists  As Boolean 

PvtItemExists = False 

' check all Pivot items in Pivot Field ("CREATION_DATE") 
For Each PvtItem In PvtFld.PivotItems 
    ' check if current Pivot Item equals the value in Cell A1 
    If PvtItem.Value = CStr(CDate(Range("D1").Value)) Then 
     PvtItemExists = True 
     Exit For 
    End If 

Next PvtItem 

If PvtItemExists Then 
    PvtFld.CurrentPage = CStr(CDate(Range("D1").Value)) 
Else 
    MsgBox "No data matches for date " & CDate(Range("D1").Value) & " in Pivot Table", vbCritical 
End If  

End Sub 
+0

ありがとうございました! 私はそれを動作させました! – Thistlepower

+0

@Thistlepowerあなたは歓迎です、答えとマークアップしてくださいupvote –

関連する問題