2011-12-15 3 views
0

Есть ли способ объединить несколько записей, а затем отобразить только самое высокое значение для каждого столбца? Пример: A2: A25 = имена, B2 = Grade1, C2 = Grade2 ... и т. Д. Сначала я удалил дубликаты, если есть точные дубликаты. Затем я сортирую имя. Может ли что-то добавить к этому коду на основе столбцов A-names, чтобы отображать каждое имя один раз с наибольшим значением из каждого столбца? = IF (B2 = "", "Empty", IF (B2 = "High", "High", IF (B2 = "Med", "Med", IF (B2 = "Low", "Low" «))))возвращать отдельные значения для нескольких записей

Пример данных

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 = высокий, Dan: Grade1 = низкий Grade2 = Мед

+0

Вы отмечаете excel-vba, но вы приводите пример, который является формулой, которую вы бы поставили в ячейку. Вам нужен макрос или формула? – jswolf19

+0

Где вы хотите, чтобы этот результат отображался? Сколько столбцов будет? Есть ли только 3 класса (высокий, низкий, средний)? Вы в порядке с решением vba? – Ian

ответ

0

записать Excel макросов. Выберите первый столбец. Нажмите расширенный фильтр. Выберите копию в местоположение и выберите новый столбец «X». Включите уникальный фильтр. Теперь нажмите «ОК». Теперь посмотрите на источник vba, чтобы получить код для получения уникальных элементов в столбце. Теперь назначьте значение Low равным 0, Med - 1, высокий - 2. перебирать строки и находить максимальный класс 1, максимальный класс2 и т. д., соответствующий каждому элементу в столбце X, и заполнять столбцы 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