저는 제 업무를 위해 아주 긴 매크로 작업을 하고 있고 이제 막 끝났습니다. 하지만 이것이 마지막 부분이고 제가 무엇을 하든 해결책을 찾을 수 없는 것 같습니다. 이 피벗 테이블에서는 "관리자"를 열로, 값 섹션에 "값"을 행으로 사용하여 다른 모든 항목(예: 모든 월)을 포함해야 합니다. 이리저리 살펴보니 모든 필드가 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
답변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를 생성할 때 이 작업을 수행할 수 있습니다.