excel वीबा के साथ पिवट तालिका को छानने



vba activex (1)

मेरे पास एक चार्ट है जो डेटा को एक धुरी सारणी से लेता है जिसमें मेरे पास दैनिक डेटा है मैं activeX बटन बनाने की कोशिश कर रहा हूं ताकि यह डेटा को आरओएएल लेबल के रूप में फ़िल्टर कर सके, यह देखने के लिए कि पिछले हफ्ते और पिछले महीने में मेरा डेटा कैसे व्यवहार हुआ

तो, अब तक मेरे पास क्या है और यह काम नहीं कर रहा है:

निजी उप weekbtn1_Click () Dim I as Integer

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

अंत उप

मैंने यह 42005 रखा है क्योंकि यह आखिरी तारीख है कि मेरे पास 1/1/2015 डेटा है ... मैं सोच रहा था कि सभी आंकड़ों को "झूठे" के रूप में फ़िल्टर करना संभव था और फिर मुझे जो सच्चाई चाहिए, लेकिन यह काम नहीं करता है!

क्या कोई मेरी मदत कर सकता है?


पिवोटफिल्ड में सभी आइटम छिपाना संभव नहीं है आपको हमेशा कम से कम एक दृश्यमान छोड़ना होगा

इनबिल्ट दिनांक फिल्टर कार्यक्षमता का लाभ उठाने के लिए यदि आप वीबीए का उपयोग करते हैं तो यह बहुत तेज़ और आसान होगा:

यहां एक नमूना फाइल है जहां मैं ऐसा करता हूं: https://1drv.ms/x/s?Ah_zTnaUo4DzjhezQ3OTq9tq1APC

ध्यान दें कि यह कार्यक्षमता केवल RowFields या ColumnFields पर उपलब्ध है। तो नीचे मेरा कोड पेजफिल्ड पर काम नहीं करेगा।

यहां एक सामान्य रूटीन है जो आपको अंतराल प्रकार और अंतराल की अवधि को चुनने देता है जो आप पिवट फ़ील्ड को फ़िल्टर करना चाहते हैं, साथ ही वैकल्पिक रूप से वह दिनांक चुनें जिसे आप आगे / पीछे से गिनना चाहते हैं।

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 दिनों में कैसे फ़िल्टर किया जाए:

और हस्ताक्षर बदलकर, यह काम करता है कि हमें रिकॉर्ड के सबसे पुराने आंकड़ों से पहले 5 दिन चाहिए:

यदि आप उस रिलेटिवटो फ़ील्ड में एक वास्तविक दिनांक निर्दिष्ट करते हैं, तो यह संख्या / पैरामीटर पॉजिटिव / नेगेटिव है या इस पर निर्भर करता है। आज की तिथि से अगले 5 दिनों में यह लिखा है कि मैं इसे लिखता हूं:

... और यह पिछले 5 दिन है:

यह आपको यह निर्दिष्ट करने देगा कि क्या आप दिन, सप्ताह, क्वार्टर, महीनों या वर्षों चाहते हैं। उदाहरण के लिए, पिछले 2 सप्ताह में सबसे हाल के रिकॉर्ड की गिनती हुई है:

मैं इसे ट्रिगर करने के लिए यहां एक वर्कशीटशैंज इवेंट का उपयोग कर रहा हूं, लेकिन अगर आप चाहें, तो आप इसे बटन पर हुक कर सकते हैं, और इसे इच्छित पैरामीटर फ़ीड कर सकते हैं।

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