使用VBA使数据透视表的总和值仅基于日期吗?

时间:2018-08-22 04:03:50

标签: excel excel-vba

我有2张纸擅长。在工作表1上,我们有一个数据透视表1,可显示每个“帐户”以及每个帐户中所有交易的总和。在工作表2中,我在数据透视表1中引用了带有列(日期,帐户,值)的数据。我想创建一个脚本,在该脚本中,将从用户给定的输入日期开始运行脚本,并使数据透视表1求和直到给定日期的值。

这可以在vba之外进行吗?如果不是这样的话,我应该如何搜索才能开始类似的项目?

2 个答案:

答案 0 :(得分:0)

在这种情况下,恐怕唯一的方法是VBA,因为数据透视表过滤器不允许您选择单元格。

从VBA开始时,录制宏通常是开始的方式。在您的情况下,您可以记录在数据透视表中更改过滤器并将过滤器调整为所需的日期输入:

这里的问题是,当您在过滤器中输入日期时,VBA会添加一些空字符串,因此我不得不骗掉它们。

下面的代码以输入框开头,要求用户输入日期。然后,此日期将被更改为一个很好的字符串,供VBA在过滤器中使用。

Sub Macro2()

Dim a As Date
Dim Dayd, Monthd, Yeard As String

' a = Range("A1").Value          You can use this instead of the input box below
a = InputBox("Date here")

' Day The lines below find the date in the format "01" - "31" 
If Left(Mid(Str(Day(a)), 2, 2), 1) <> 1 And Left(Mid(Str(Day(a)), 2, 2), 1) <> 2 And Left(Mid(Str(Day(a)), 2, 2), 1) <> 3 Then
    Dayd = "0" & Right(Str(Day(a)), 1)
Else
    Dayd = Right(Str(Day(a)), 2)
End If

' Month  These lines find the months in the same way
If Left(Mid(Str(Month(a)), 2, 2), 1) <> 1 Then
    Monthd = "0" & Right(Str(Month(a)), 1)
Else
    Monthd = Right(Str(Month(a)), 2)
End If

' Year
Yeard = Right(Str(Year(a)), 4)

'This is testing if the date is in the format I want ex:"15.08.2018" (dd.mm.yyy)

MsgBox (Dayd & "." & Monthd & "." & Yeard)

'Below the code from the "Record Macro" 
    ActiveSheet.PivotTables("PivotTable2").PivotFields("SODATE").ClearAllFilters
    ActiveSheet.PivotTables("PivotTable2").PivotFields("SODATE").PivotFilters.Add2 _
        Type:=xlCaptionIsLessThan, Value1:=Dayd & "." & Monthd & "." & Yeard
End Sub

我试图添加笔记,请说出您是否需要更多说明

答案 1 :(得分:0)

@ Pierre44

感谢您的帮助,这使我开始研究googlefu之后可以查看数据透视过滤器字段,我可以拿出这段完全符合我需要的代码。

 ' loops through pivot table accounts and sets off the filters that are less than current date
Dim todaysdate As Date
todaysdate = Range("B2").value
Dim pff As PivotField
Dim pii As PivotItem
Set pff = ActiveSheet.PivotTables("Accounts_Pivot_Table").PivotFields("Date")
pff.ClearAllFilters
For Each pii In pff.PivotItems
    If IsDate(pii) Then
        If pii > todaysdate Then
            pii.Visible = False
        End If
    End If
Next