2011-12-15 2 views
0

여러 레코드를 병합 한 다음 각 열에 대해 가장 높은 값만 표시하는 방법이 있습니까? 예 : A2 : A25 = 이름, B2 = 등급 1, C2 = 등급 2 ... 등. 처음에는 정확한 중복이있는 경우 중복 된 것을 제거했습니다. 그런 다음 이름을 정렬합니다. 각 열의 가장 높은 값으로 각 이름을 한 번 표시하려면 열 A 이름을 기반으로이 코드에 뭔가를 추가 할 수 있습니까? = IF (B2 = "", "비어 있음", IF (B2 = "높음", "높음", IF (B2 = "Med", "Med", IF (B2 = "낮음" "))))여러 레코드에 대해 단일 값 반환

데이터 예

A1:name B1:Grade1 C1:Grade2...etc 
A2:Joe B2:High C3:Low 
A3:Joe B3:Med C3:High 
A4:Dan B4:Low C4:Med 
A5:Dan B5:Low C5:Low 

_ _Results : 조 Grade1 = 높은 Grade2 = 높은 댄 : Grade1 = 낮은 Grade2 = 메드

+0

excel-vba로 태그를 지정했지만 셀에 넣을 수식을 예로들 수 있습니다. 매크로 또는 수식을 원하십니까? – jswolf19

+0

이 결과를 어디에 표시 하시겠습니까? 몇 개의 열이 있습니까? 고등학교, 중학교, 중학교의 3 가지 성적 만 있습니까? VBA 솔루션으로 괜찮습니까? – Ian

답변

0

기록 엑셀 매크로입니다. 첫 번째 열을 선택하십시오. 고급 필터를 클릭하십시오. 위치로 복사를 선택하고 X로 새 열을 선택하십시오. 고유 필터 사용. 이제 확인을 클릭하십시오. 이제 vba 소스를 살펴보고 코드에서 고유 한 요소를 가져와야합니다. 이제 Low를 0, Med를 1, High를 2로 지정하십시오. 행을 반복하고 X 열의 각 요소에 해당하는 최대 등급 1, 최대 등급 2 등을 찾고 열 Y, Z 등을 채 웁니다. 새 최대 값을 찾으면 기존 값을 대체합니다. 이제 X, Y, Z 열에 필요한 데이터를 갖게됩니다. 다시 반복하여 원하는 형식으로 표시하십시오.

0

VBA 코드를 사용하기로 결정했습니다. 약간은 열성적이지만 일을 끝내게됩니다.

바로 가기를 가져 와서 문자열 대신 b 및 c 열을 만들었습니다. 스프레드 시트에서 조회 기능을 사용하여 해당 변환을 수행하거나 코드에 추가 체크를 추가 할 수 있습니다.

Sub find_high_values() 
' subroutine to find max values of columns b and c against names 
' assumes for simplicity that there are no more than 10 rows 
' assumes values being checked to be numbers, if they are strings, additional loops would need to be done 
Dim sName(10) As String, lBval(10) As Long, lCval(10) As Long 'arrays for original list 
Dim iCountN As Integer, iUnique As Integer, iUniqueCount As Integer 'counters 
Dim bUnique As Boolean 
Dim rStart As Range, rOutput As Range 'ranges on worksheet 
Dim lBmax(10) As Long, lCmax(10) As Long, sUniqueName(10) As String 'output arrays 

Set rStart = ActiveSheet.Range("d6") 'Cell immediately above the first name in list 
Set rOutput = ActiveSheet.Range("j6") 'cell reference for max value list 
iUniqueCount = 1 
For iCountN = 1 To 10 'set max counters to a min value 
    lBmax(iCountN) = 0 
    lCmax(iCountN) = 0 
Next 

For iCountN = 1 To 10 'step through each original row 
    sName(iCountN) = rStart.Offset(iCountN, 0).Value 
    lBval(iCountN) = rStart.Offset(iCountN, 1).Value 
    lCval(iCountN) = rStart.Offset(iCountN, 2).Value 
    bUnique = True 'Starter value, assume the name to be unique, changes to false if already in list 
    For iUnique = 1 To iCountN 'loop to check if it is a new name 
     If sUniqueName(iUnique) = sName(iCountN) Then bUnique = False 
    Next 
    If bUnique Then 'if new name, add to list of names 
     sUniqueName(iUniqueCount) = sName(iCountN) 
     iUniqueCount = iUniqueCount + 1 
    End If 
Next 
iUniqueCount = iUniqueCount - 1 'make the count back to total number of names found 
For iUnique = 1 To iUniqueCount 'loop through names 
    For iCountN = 1 To 10 'loop through all values 
     If sName(iCountN) = sUniqueName(iUnique) Then 
      If lBval(iCountN) > lBmax(iUnique) Then lBmax(iUnique) = lBval(iCountN) 
      If lCval(iCountN) > lCmax(iUnique) Then lCmax(iUnique) = lCval(iCountN) 
     End If 
    Next 
Next 

'output section 
rStart.Resize(1, 3).Select 
Selection.Copy 
rOutput.PasteSpecial xlPasteValues 

For iUnique = 1 To iUniqueCount 
    rOutput.Offset(iUnique, 0).Value = sUniqueName(iUnique) 
    rOutput.Offset(iUnique, 1).Value = lBmax(iUnique) 
    rOutput.Offset(iUnique, 2).Value = lCmax(iUnique) 
Next 

End Sub 
관련 문제