VBA에서 CubeField/PivotField를 데이터 필드로 추가할 수 없습니다.

VBA에서 CubeField/PivotField를 데이터 필드로 추가할 수 없습니다.

저는 제 업무를 위해 아주 긴 매크로 작업을 하고 있고 이제 막 끝났습니다. 하지만 이것이 마지막 부분이고 제가 무엇을 하든 해결책을 찾을 수 없는 것 같습니다. 이 피벗 테이블에서는 "관리자"를 열로, 값 섹션에 "값"을 행으로 사용하여 다른 모든 항목(예: 모든 월)을 포함해야 합니다. 이리저리 살펴보니 모든 필드가 PivotFields 대신 CubeFields로 등록된 것 같습니다. 이것을 실행하면 .Orientation = xlDataField에 도달하자마자 "런타임 오류 5...잘못된 프로시저 호출 또는 인수"가 발생합니다. 또한 해당 DataField가 평균화되고 특정 숫자 형식인지 확인해야 합니다. 제가 하는 일은 아무 것도 작동하지 않으며, 안내/수정/해결 방법을 알려주시면 대단히 감사하겠습니다! 아래는 땜질용 매크로와 파일 다운로드 링크입니다.

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에 도달하면 오류 1004: PivotField 클래스의 Function 속성을 설정할 수 없습니다라고 표시됩니다.

                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-data-field-in-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

답변1

귀하의 질문은 여전히 ​​​​더 ​​구체화하는 것과 관련이 있습니다. 예를 들어 처음부터 피벗 테이블을 만든 다음 필드를 추가하는지 또는 이미 필드가 있을 수 있는 기존 피벗 테이블에서 실행되는지 여부는 알 수 없습니다.

방금 누군가가 나에게 다음을 가리켰습니다.러버덕 문제 해결/ 블로그 게시물, 그리고 저는 여러분에게도 이를 지적할 것입니다. 왜냐하면 사람들이 관련된 모든 것을 알고 있다면 대답하는 데 도움이 되기 때문입니다.

~에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 컬렉션을 반복하고 큐브 필드 수를 반복하는 이유를 이해할 수 없습니다. 즉, 이 비트:

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

Cubefields.count의 제곱으로 모든 것을 반복하는 것이 아닌가요? For i = 1 To 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].[Manager]에 대한 결과가 표시되지만 이는 데이터 필드가 아님을 알 수 있습니다. DataField는 [Measures].[Average of effRent_perBed]와 같습니다.

이것이 바로 코드가 실패한 이유입니다. 여전히 CubeField인 것처럼 관심 필드를 참조하고 있었습니다. 그러나 이를 DataFields 영역에 추가하자마자 새로운 DataField가 생성되고그건집계를 변경해야 하는 항목입니다.

위에서 말했듯이 DataField를 생성할 때 이 작업을 수행할 수 있습니다.

관련 정보