2017-12-22 31 views

답변

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

이것은 실제로 완벽합니다! 엄청 고마워. 나는 그것이 모두 잘 작동하는 방법을 따를 수있었습니다. 한 가지 질문은 myHeight의 모든 변수를 알지 못했다는 것입니다. 그리고 데이터 테이블이 자유형이라면 누구나 아무 것도 입력 할 수 없습니다. 그렇다면 "First Grade"를 반복하여 myHeight 배열을 채우고 다른 문자열이 여러 개일 수 있다고 가정하면 어떻게됩니까 – Kalarian

+0

그런 다음 별개 변수 목록을 myHeight 배열로 읽는 방법이 필요합니다. 또는 사전에 추가하는 피벗 팅 가능 소스 데이터의 값이있는 열을 루프 할 수 있습니다 (별개의 목록이 생성됩니다). 그런 다음 배열 대신 사전 키를 루프 할 수 있습니다. 시험을 치러 붙어 있다면 예를 들어 드리겠습니다. – QHarr

+1

그래, 내가 실제로 가지고 있다고 생각해. 아래의 y를 사용하여 값을 할당 할 수 있습니다. 나는 모든 도움에 감사한다! 각 pi에 대해 pvt.PivotFields ("Height").PivotItems y = pi.Name 다음 pi – Kalarian

0

내가 몇 단계 비 VBA 솔루션을 제공 할 것입니다 : 그 후

enter image description here

-enter image description here

에서 피벗 테이블보기 당신이 그것을 해결할 수 먼저 스위치를 최대 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에 쉽게 적응시킬 수 있다고 생각하지만 가장 깨끗하지는 않을 것이다.

+0

실제로 데이터 표에 열을 추가하는 데 실제로 도움이됩니다! 덕분에 – Kalarian

+0

나는 그것을 기쁘게 생각합니다, 내 대답을 upvote하시기 바랍니다;) – Pierre44