아래 첨부 된 스크린 샷에서 x를 사용하여 "First Grade"의 "Short"중 12.50 %를 얻습니다. 그러나 "First Grade"필드에서 가장 큰 값을 찾고 이름을 반환하기 위해이를 확장하려고합니다. "First Grade"에서는 예를 들어 "Tall"이됩니다.피벗 테이블의 하위 필드에 대해 설정된 데이터 요소에서 가장 높은 숫자를 얻는 방법?
0
A
답변
1
Sub PivotTest()
Dim pvt As PivotTable: Set pvt = Sheets("Sheet2").PivotTables("PivotTable1")
x = pvt.GetPivotData("Count Of Height", "Grade", "First Grade", "Height", pvt.PivotFields("First Grade").PivotItems(1)).Value
End Sub
피벗 테이블의 스크린 샷은 그래서 당신은 다음과 같이 주변에 바이올린 수 있지만 그것은 당신에게 작업 할 모양을 제공합니다. 오타에 대한 사과는 현재 무료로 타이핑 할 수 없기 때문에 가능합니다.
GetMaxInfo
서브는 을 호출합니다.이 함수는 Grade
을 인수로 취해서 최대 수를 찾은 높이 설명이 포함 된 배열을 반환합니다. "Tall"및 카운트 값 자체. 이들은 함수 호출 후에 (0)과 (1) 인덱스에 의해 액세스됩니다.
함수 MaxHeightInfo
지정된 Grade
에 대한 정보를 검색 할 GetPivotData
함수를 사용하여 발견 한 가장 높은 값으로 설정 maxCount
. 이 값이 maxHeight
변수에있는 높이 설명을 저장합니다.
Option Explicit
Public Sub GetMaxInfo()
Msgbox MaxHeightInfo("First Grade")(0)
Msgbox MaxHeightInfo("First Grade")(1)
Msgbox MaxHeightInfo("Second Grade")(0)
Msgbox MaxHeightInfo("Second Grade")(1)
End Sub
Public Function MaxHeightInfo(ByVal myGrade As String) As Variant
Dim myHeight()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet2") 'change as appropriate
Dim pvt As PivotTable
Set pvt = ws.PivotTables("PivotTable1")
myHeight = Array("Short","Average","Tall")
Dim currHeight As Long
Dim maxCount As Double
Dim maxHeight As String
maxCount = 0
maxHeight = vbNullString
Dim testVal As Double
For currHeight = LBound(myHeight) To UBound(myHeight)
testVal = pvt.GetPivotData("Count of Height"),"Grade", myGrade,"Height", myHeight(currHeight)).Value
If testVal > maxCount Then
maxCount = testVal
maxHeight = myHeight(currHeight)
End If
Next currHeight
MaxHeightInfo = Array(maxHeight, maxCount)
End Function
0
내가 몇 단계 비 VBA 솔루션을 제공 할 것입니다 : 그 후
에서 피벗 테이블보기 당신이 그것을 해결할 수 먼저 스위치를 최대 if 및 인덱스가 두 기준으로 일치 : 예 :
{=MAX(IF(H3:H8="First Grade";J3:J8))}
=>이 배열 수식은 1 학년의 최대 신장을 제공합니다. 그런 다음 첫 번째 학년의 최대 높이를 검색 할 수 있습니다 이중 기준 지수의 일치와 : 함께
{=INDEX(H3:J8;MATCH(1;(H3:H8="First Grade")*(J3:J8=*Cell of the maxIf*);0);2)}
또는 전체 식 이상 :
{=INDEX(H3:J8;MATCH(1;(H3:H8="First Grade")*(J3:J8=MAX(IF(H3:H8="First Grade";J3:J8)));0);2)}
내 엑셀에 큰 작동합니다. 나는 이것을 VBA에 쉽게 적응시킬 수 있다고 생각하지만 가장 깨끗하지는 않을 것이다.
이것은 실제로 완벽합니다! 엄청 고마워. 나는 그것이 모두 잘 작동하는 방법을 따를 수있었습니다. 한 가지 질문은 myHeight의 모든 변수를 알지 못했다는 것입니다. 그리고 데이터 테이블이 자유형이라면 누구나 아무 것도 입력 할 수 없습니다. 그렇다면 "First Grade"를 반복하여 myHeight 배열을 채우고 다른 문자열이 여러 개일 수 있다고 가정하면 어떻게됩니까 – Kalarian
그런 다음 별개 변수 목록을 myHeight 배열로 읽는 방법이 필요합니다. 또는 사전에 추가하는 피벗 팅 가능 소스 데이터의 값이있는 열을 루프 할 수 있습니다 (별개의 목록이 생성됩니다). 그런 다음 배열 대신 사전 키를 루프 할 수 있습니다. 시험을 치러 붙어 있다면 예를 들어 드리겠습니다. – QHarr
그래, 내가 실제로 가지고 있다고 생각해. 아래의 y를 사용하여 값을 할당 할 수 있습니다. 나는 모든 도움에 감사한다! 각 pi에 대해 pvt.PivotFields ("Height").PivotItems y = pi.Name 다음 pi – Kalarian