ไม่สามารถเพิ่ม CubeField / PivotField เป็นเขตข้อมูลใน VBA


0

ฉันกำลังทำงานกับมาโครที่ยาวมากสำหรับงานของฉันและฉันเพิ่งจะเสร็จ แต่นี่เป็นส่วนสุดท้ายและไม่ว่าฉันจะทำอะไรฉันก็ดูเหมือนจะไม่สามารถหาทางแก้ไขได้ ใน PivotTable นี้ฉันต้องมี "ผู้จัดการ" เป็นคอลัมน์และทุกอย่าง (เช่นทุกเดือน) ในส่วนค่าโดยมี "ค่า" เป็นแถว หลังจากทำการแก้ไขมันดูเหมือนว่าฟิลด์ทั้งหมดที่ลงทะเบียนเป็น CubeFields แทนที่จะเป็น PivotFields เมื่อฉันเรียกใช้งานนี้ทันทีที่ได้รับการ. Omentation = xlDataField มันจะพ่น "ข้อผิดพลาดรันไทม์ 5 ... การเรียกหรือการโต้แย้งของกระบวนการไม่ถูกต้อง" ฉันต้องตรวจสอบให้แน่ใจว่า DataFields เหล่านั้นมีค่าเฉลี่ยและอยู่ในรูปแบบตัวเลขเฉพาะ ไม่มีอะไรที่ฉันทำงานและคำแนะนำ / แก้ไข / การแก้ปัญหาใด ๆ ที่จะได้รับการชื่นชมอย่างมาก! ด้านล่างคือมาโครและลิงค์ดาวน์โหลดไปยังไฟล์เพื่อทำการแก้ไข

Dim pvtTable As PivotTable
Dim cubField As CubeField
Dim i As Long
Dim cubName As String

Set pvtTable = ActiveSheet.PivotTables(1)
For Each cubField In pvtTable.CubeFields
    For i = 1 To pvtTable.CubeFields.Count
        With pvtTable.CubeFields(i)
            If .Name = "[effRent_perBed].[Manager]" Then
                .Orientation = xlColumnField
           Else:
                .Orientation = xlDataField
                'has to be averaged
                'has to have number format of ##0.00
            End If

        End With
    Next
Next

นี่คือการแก้ไขที่ฉันพยายามทำโดยใช้เครื่องบันทึกแมโคร มันทำให้ฟิลด์ในเขตข้อมูลค่า แต่ไม่มีวิธีที่จะเปลี่ยนเป็นค่าเฉลี่ย มันแสดงรายการค่าทั้งหมดเป็น "1 (ตรวจสอบภาพเป็นภาพ)เมื่อฉันไปที่. Function = xlAverage จะมีข้อความระบุว่า Error 1004: ไม่สามารถตั้งค่าคุณสมบัติ Function ของคลาส PivotField ได้

                If Name = "[effRent_perBed].[Manager]" Then
                    .Orientation = xlColumnField
                Else:
                    With ActiveSheet.PivotTables(1)
                        .AddDataField ActiveSheet.PivotTables(1) _
                        CubeFields(cubName), _
                        "Average of " & cubName
                    End With

                    With ActiveSheet.PivotTables(1).PivotFields(cubName)
                        .Caption = "Average of " & cubName
                        .Function = xlAverage
                    End With

เมื่อฉันใช้ตัวบันทึกแมโครเพื่อเพิ่มบางอย่างลงในฟิลด์ข้อมูลฉันจะได้รับสิ่งนี้:

ActiveSheet.PivotTables("effRent_perBed_Pivot").CubeFields.GetMeasure _
    "[effRent_perBed].[Jan-16]", xlSum, "Sum of Jan-16"
ActiveSheet.PivotTables("effRent_perBed_Pivot").AddDataField ActiveSheet. _
    PivotTables("effRent_perBed_Pivot").CubeFields("[Measures].[Sum of Jan-16]"), _
    "Sum of Jan-16"
With ActiveSheet.PivotTables("effRent_perBed_Pivot").PivotFields( _
    "[Measures].[Sum of Jan-16]")
    .Caption = "Average of Jan-16"
    .Function = xlAverage
End With

นี่คือสำเนาของไฟล์ที่ฉันกำลังทำงานอยู่ มันแสดงให้เห็นตารางเดือยดิบและจากนั้นผลิตภัณฑ์สำเร็จรูป ฉันต้องทำสิ่งนี้สำหรับ 3 แผ่นดังนั้นฉันต้องหมุนเวียนกัน https://drive.google.com/uc?export=download&id=1NLGg8DVEMHnB2Ad7NAKWySevq8naqFjr

นี่คือการโพสต์ในฟอรั่มอื่น ๆ (ฉันต้องได้รับตามากในเรื่องนี้โดยเร็วที่สุด) https://www.excelforum.com/excel-programming-vba-macros/1222588-unable-to-add-cubefield- pivotfield-as-a-ข้อมูลภาคสนามใน vba.html # post4856940

https://www.mrexcel.com/forum/excel-questions/1046038-unable-add-cubefield-pivotfield-data-field-vba.html

https://www.ozgrid.com/forum/node/1200403


ฉันลงคะแนนให้คุณเพราะคุณโพสต์ข้อความนี้ในหลาย ๆ ฟอรัม ใช่คุณได้ชี้ให้เห็นแล้ว แต่ก็ยังไม่เป็นที่ยอมรับในจุดที่คนส่วนใหญ่ไม่อยากตอบคำถามของคุณ ทำไม? เพราะในขณะที่คุณอาจต้องการที่จะจับตามองในเรื่องนี้โดยเร็วที่สุดหากได้รับการตอบในหลาย ๆ สถานที่โดยหลาย ๆ คนคุณจะเสียเวลาในการมอง กรุณาเลือกหนึ่งฟอรั่มเท่านั้น โปรดอ่านexcelguru.ca/content.php?184สำหรับสาเหตุที่เป็นปัญหา
jeffreyweir

สำหรับคำถามของคุณวิธีที่ง่ายที่สุดในการแก้ไขปัญหาเช่นนี้คือการเริ่มการทำงานของตัวบันทึกแมโครเปลี่ยนการวางแนวของรหัสหนึ่งด้วยตนเองหยุดตัวบันทึกและดูรหัสที่ตัวบันทึกแมโครพ่นออกมา มันอาจจะให้ไวยากรณ์ที่ถูกต้องที่คุณต้องการ หากคุณยังหลงทางอยู่ให้โพสต์รหัสนั้นในคำถามเดิมของคุณ
jeffreyweir

@jeffreyweir นี่เป็นการโพสต์ครั้งแรกของฉันฉันไม่ทราบว่าการโพสต์ข้ามเป็นสิ่งต้องห้ามที่ยิ่งใหญ่ ฉันพยายามใช้เครื่องบันทึกหลายครั้งและเมื่อพยายามทำซ้ำและปรับขนาดรหัสนั้นมันไม่ทำงานอย่างถูกต้อง
Andrew Stahl

ฉันเข้าใจว่าคุณไม่สามารถทำให้ตัวบันทึกแมโครทำงานได้ แต่การโพสต์โค้ดที่สร้างขึ้นมาโครในคำถามของคุณเป็นความช่วยเหลือที่ดีสำหรับผู้ตอบเช่นฉันเพราะเรามักจะสามารถหาว่ามีอะไรผิดพลาดเพียงแค่มองรหัสนั้นและเปรียบเทียบกับสิ่งที่คุณทำ มิฉะนั้นเราต้องสร้าง PivotTable ตัวอย่างและทำตามขั้นตอนนี้ด้วยตัวเองซึ่งเป็น PITA จริง
jeffreyweir

เพิ่งทำการอัพเดท!
Andrew Stahl

คำตอบ:


0

คำถามของคุณยังสามารถทำอะไรต่อไปได้อีก ตัวอย่างเช่นคุณไม่ได้บอกว่าคุณกำลังสร้าง PivotTable ตั้งแต่เริ่มต้นแล้วเพิ่มเขตข้อมูลหรือไม่ว่าจะเป็นการเรียกใช้บน PivotTable ที่มีอยู่ซึ่งอาจมีเขตข้อมูลอยู่แล้ว

มีใครบางคนชี้ให้ฉันไปที่การแก้ปัญหาเป็ดยาง / โพสต์บล็อกและฉันจะชี้ให้คุณเช่นกันเพราะจะช่วยให้คนตอบถ้าพวกเขารู้ทุกอย่างที่เกี่ยวข้อง

ที่https://msdn.microsoft.com/en-us/vba/excel-vba/articles/pivottable-adddatafield-method-excelมันบอกว่าไวยากรณ์สำหรับ. adddatafield คือ AddDataField (Field, Caption, Function) ที่มีฟังก์ชันเป็น ไม่จำเป็น.

แล้วจะเกิดอะไรขึ้นถ้าคุณลองทำเช่นนี้?

If Name = "[effRent_perBed].[Manager]" Then
    .Orientation = xlColumnField
 Else:
    With ActiveSheet.PivotTables(1)
        .AddDataField ActiveSheet.PivotTables(1) _
            CubeFields(cubName), _
            "Average of " & cubName, _
            xlAverage
    End With
End if

มีปัญหาบางประการเกี่ยวกับการบล็อกโค้ดดั้งเดิมของคุณ ฉันไม่เข้าใจว่าทำไมคุณทั้งสองซ้ำซ้ำผ่านคอลเลกชัน CubeFields และซ้ำผ่านจำนวน cubefields เช่นบิตนี้:

For Each cubField In pvtTable.CubeFields
    For i = 1 To pvtTable.CubeFields.Count

ไม่ว่าจะเป็นเพียงแค่วนซ้ำทุกสิ่งโดยที่จัตุรัส Cubefields.count? คุณควรจะสามารถบอกได้ว่าสำหรับ i = 1 ถึง pvtTable.CubeFields.Count บิตและใช้การอ้างอิง cubField โดยตรง

ฉันคิดว่าสาเหตุที่รหัสของคุณล้มเหลวในการตั้งค่าการสรุปเป็น XLAverage เนื่องจากเมื่อคุณเพิ่มเขตข้อมูลลงในพื้นที่ข้อมูลชื่อจะเปลี่ยนไปอย่างมีประสิทธิภาพ คุณสามารถเห็นสิ่งนี้ได้หากคุณปล่อยให้ DataField อยู่และรันรหัสนี้:

Sub Macro1()
'
' Macro1 Macro
'
Dim pvtTable As PivotTable
Dim cubField As CubeField
Dim i As Long
Dim cubName As String

Set pvtTable = ActiveSheet.PivotTables(1)
For Each cubField In pvtTable.CubeFields
    Debug.Print cubField.Name
Next

End Sub

ที่จะพิมพ์ชื่อของฟิลด์ทั้งหมดไปที่หน้าต่างทันที (สมมติว่าคุณเปิดมัน) ที่จุดที่คุณจะเห็นว่าในขณะที่คุณจะมีผลลัพธ์สำหรับ [effRent_perBed] [ผู้จัดการ] นี่ไม่ใช่ดาต้าฟิลด์ DataField จะมีลักษณะคล้ายกับ [Measures] [Average of effRent_perBed]

และนั่นคือสาเหตุที่รหัสของคุณล้มเหลว: คุณยังคงอ้างถึงเขตข้อมูลที่น่าสนใจราวกับว่ามันยังเป็น CubeField แต่ทันทีที่คุณลองเพิ่มเข้าไปในพื้นที่ DataField ใหม่ DataField จะถูกสร้างขึ้นและนั่นคือสิ่งที่คุณต้องการเปลี่ยนการรวมสำหรับ

อย่างที่ฉันได้กล่าวไว้ข้างต้นคุณสามารถทำได้ในเวลาที่คุณสร้าง DataField


ส่วนสุดท้ายนั้นสมเหตุสมผลมาก เมื่อถึงจุดหนึ่งฉันกำลังตรวจสอบชื่อในหน้าต่างท้องถิ่นและสังเกตว่าหลังจากทุกฟิลด์มันพูดว่า "[การวัด]. [xlAverage ... ]" ตอนนี้ฉันเห็นหลังจากตรวจสอบเครื่องบันทึกมาโครที่เราเพิ่มฟิลด์การวัด . ณ จุดนี้ฉันต้องหาวิธีที่จะทำให้ไดนามิกนี้ทำงานในลูปดังนั้นฉันจึงสามารถเพิ่มหลายฟิลด์ได้ แต่ฮาร์ดไดรฟ์ของคอมพิวเตอร์ของฉันเสียชีวิตดังนั้นฉันจึงพยายามกอบกู้สิ่งที่ฉันสามารถทำได้ ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณทั้งหมด @jeffreyweir!
Andrew Stahl

ไม่มีปัญหา ... สิ่งนี้สร้างความสับสนให้กับผู้ประทับจิตคนที่ไม่ได้ฝึกหัด :-) อย่าลืมทำเครื่องหมายคำตอบของฉันว่าเป็นที่ยอมรับถ้ามันแก้ปัญหาให้คุณได้
jeffreyweir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.