2011-12-15 92 views
0

是否有合并多个记录然后仅显示每列最高值的方法?例如:A2:A25 =姓名,B2 =等级1,C2 =等级2 ...等。 首先我删除重复的情况下有确切的重复。然后我排序Name。 可以根据列A的名称添加一些东西,以每个列的最高值显示每个名称? (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 2011-12-15 03:48:06

回答

0

记录一个Excel宏。选择第一列。点击高级过滤器。选择复制到位置并选择一个新的列说X.启用唯一过滤器。现在点击确定。现在查看vba源代码以获取代码以获取列中的唯一元素。现在将Low分配为0,Med分配为1,高分配为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