मैंने एक मैक्रो बनाया है जो एसएपी से जुड़ता है, अपना काम करता है, प्रतिक्रिया प्राप्त करता है और इसे स्प्रेडशीट पर लिखता है। मुद्दा यह है कि इससे पहले कि स्क्रिप्ट ऐसा कर सके, मुझे क्लस्टर द्वारा डेटा की आवश्यकता है।

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

मैंने एक पिवट टेबल बनाया और मास्टर कुंजी को कॉलम पर रखा, ताकि मैं मास्टर कुंजी द्वारा ग्राहक कोड देख सकूं।

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

मुझे जो करने की ज़रूरत है वह फ़ाइल से सभी मास्टर कुंजी प्राप्त करें (ऐसा किया गया) और, जिस स्थान पर मैं फंस गया हूं, उसे लूप के अंदर एक बार छिपाने और दिखाने के लिए इसका इस्तेमाल करें। उदाहरण के लिए (एमके मास्टर कुंजी के लिए खड़ा है):

Customer MK1 MK2 MK3 MK4
   X      1
   Y          1
   Z          1
   A      1

तो मैं एमके 1 को फ़िल्टर करता हूं, इसके लिए ग्राहक कोड प्राप्त करता हूं, एसएपी चीज चलाता हूं, पिवट पर वापस जाता हूं, अगले मौजूदा कोड को फ़िल्टर करता हूं, ग्राहक कोड प्राप्त करता हूं, एसएपी चलाता हूं और फिर से करता हूं।

If Range("A2") <> "" Then

    Range("A1").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(-1, 1).Select
    Range(Selection, Selection.End(xlUp)).FillDown

    FILTRO2 = ActiveCell

    Range("A1").Select

            Do While ActiveCell <> ""

                FILTRO = ActiveCell

                Sheets("Dinâmica").Activate

                ActiveWorkbook.RefreshAll

                With ActiveSheet.PivotTables("Tabela dinâmica2").PivotFields("Chave")
                    .PivotItems(Split(FILTRO2.Value, ",")).Visible = False
                    .PivotItems(FILTRO).Visible = True
                End With

जैसा कि उपरोक्त कोड पर देखा गया है, मैं एक मृत अंत पर हूं। बिल्कुल काम नहीं कर रहा है।

1
Rodrigo Kroehn 26 जून 2019, 22:27

1 उत्तर

सबसे बढ़िया उत्तर

आप Pivotitem.Visible द्वारा दृश्यमान प्रत्येक "मास्टरकी" को स्विच कर सकते हैं।
कृपया ध्यान रखें, कि हमेशा कम से कम 1 पिवटम को दृश्यमान रहना होता है।

परिणामी दृश्यमान "ग्राहकों" को PivotField.DataRange से पढ़ा जा सकता है, जो उस पिवटफील्ड के सभी दृश्यमान पिवटों का प्रतिनिधित्व करता है। आप उस श्रेणी सेल को सेल द्वारा संबोधित कर सकते हैं या किसी सरणी को उसका मान निर्दिष्ट कर सकते हैं।

Private Sub FilterMasterkeys()
    Dim pt As PivotTable
    Dim pfCustomer As PivotField
    Dim pfMasterkey As PivotField
    Dim i As Long
    Dim c As Range ' a cell

    Set pt = ActiveWorkbook.Sheets("Dinâmica").PivotTables("Tabela dinâmica2")
    pt.RefreshTable

    Set pfCustomer = pt.RowFields(1)
    Set pfMasterkey = pt.ColumnFields("Chave")

    ' hide all masterkeys except first
    pfMasterkey.PivotItems(1).Visible = True
    For i = 2 To pfMasterkey.PivotItems.Count
        pfMasterkey.PivotItems(i).Visible = False
    Next i

    ' set each masterkey visible and get corresponig customers
    For i = 1 To pfMasterkey.PivotItems.Count - 1
        pfMasterkey.PivotItems(i).Visible = True
        Debug.Print "Masterkey " & pfMasterkey.PivotItems(i).Caption & " is used by ",
        For Each c In pfCustomer.DataRange.Cells
            Debug.Print c.Value,
        Next c
        Debug.Print

        pfMasterkey.PivotItems(i + 1).Visible = True
        pfMasterkey.PivotItems(i).Visible = False
    Next i

    ' get the last one also
    Debug.Print "Masterkey " & pfMasterkey.PivotItems(i).Caption & "is used by ",
    For Each c In pfCustomer.DataRange.Cells
        Debug.Print c.Value,
    Next c
    Debug.Print

End Sub

यदि आपको सभी संबंधित ग्राहकों को सरणी के रूप में चाहिए, तो अगली मास्टरकी को दृश्यमान स्विच करने के बाद इसका उपयोग करें:

Dim arrCustomers() As Variant
arrCustomers = pfCustomer.DataRange.Value
0
Asger 27 जून 2019, 14:58