2013-08-05 4 views
1

Предположим, у меня есть данныеГруппа Значения в первенствовать по значению дубликата в колонке

Column1  Column2 
1   1000 
1   -2000 
1   3000 
2   2000 
2   -1000 
3   5000 
3   -4000

Я хочу, чтобы отобразить его как

Column1 Column2 Column3 
1   1000  3000 
2   2000 
3   5000

Я хочу, чтобы принимать только положительные значения от COLUMN2 где COLUMN1 имеют одинаковый (например, для 1 имеют 2 положительных значения. Я хочу отобразить их в формате, показанном выше.)

Как достичь этого с помощью ручных методов (формул) или с помощью VBA ?? Я написал код, где он принимает положительные значения из столбца 1, где column1.value = 1. Но как итерации с помощью следующих значений (т. Е. 2 ​​и 3)

Sheets("Sheet1").Select 
myvalue = Cells(2, 1).Value 
MsgBox myvalue 


Dim negativevalue(0 To 10) As Long 
Dim colum As Integer 
Dim row As Integer 

colum = 1 
row = 2 
i = 0 
While Cells(row, colum).Value = myvalue 
If (Cells(row, 2).Value < 0) Then 

MsgBox Cells(row, 2).Value 
negativevalue(i) = Cells(row, 2).Value 


End If 
+2

ты пытался что-нибудь с записью макросов инструмента? Какие формулы вы пробовали? Вам нужно показать, что вы сделали, чтобы мы могли помочь вам с конкретной проблемой, с которой вы столкнулись. – chancea

+0

Что не так в сводной таблице с отфильтрованными отрицательными значениями, 'column1' в виде строк,' column2' в качестве столбцов и сумма 'column2' в качестве данных? – Aprillion

+0

@Suresh Jambhalkar, этот код должен быть включен как обновление вашего вопроса ... и сделать его более легким для чтения. – neizan

ответ

2

Вот простой подход на основе формулы на ваш вопрос.

необходимы два набора формул, первый набор, чтобы создать список без дублирования различных значений из столбца 1 и второго набора, чтобы посмотреть и разместить положительные значения в колонке 2.

Формулы для создания список отдельных значений столбца 1 помещается в ячейку D2 и копируется по столбцу. Формула использует именованный диапазон для значений столбца 1. Если вы поместите его в другой столбец, скорректируйте $D1$D:D1 на колонку, которую вы используете, и убедитесь, что она относится к ячейке, расположенной выше, где вы поместите формулу. Например, если поместить формулу в ячейке C4, опорный столбец в формуле должна быть $C$3:C3

Formula to create list of distinct values from column 1 
Cell D2 =IFERROR(INDEX(Column1,MATCH(0,INDEX(COUNTIF($D$1:D1,Column1), 
      0,0),0)),"-") 

В столбце 2 поиска является формулой массива; в рабочем листе примера, он вводится в ячейку E2 (с использованием Ctrl - Shift - Введите комбинацию клавиш), а затем скопируйте его и переверните.

Array Formula to lookup and place column 2 values 
Cell E2 =IFERROR(INDEX(Column2,1/LARGE(IFERROR(1/((Column1=$D2)* 
      (Column2>=0)*ROW(INDIRECT("1:"&COUNTA(Column2)))),0), 
      COLUMNS($E$2:E$2)),1),"-") 

enter image description here

2

Возможно, это будет более короткий путь, но это работает. Выберите нужный диапазон и запустите следующий макрос:

Sub ProcessData() 
    'Sort the data 
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Selection.Cells(1, 1), _ 
     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    With ActiveWorkbook.Worksheets("Sheet1").Sort 
     .SetRange Selection 
     .Header = xlNo 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

    'Process data 
    Dim cl As Object, r As Integer, c As Integer, cNum As Integer, cSt As Integer 
    Dim first As Boolean, update As Boolean 
    r = Selection.Cells(1, 1).Row - 1 
    cNum = Selection.Cells(1, 2).Column + 2 
    cSt = cNum + 1 
    first = True 
    update = False 

    For Each cl In Selection.Cells.Columns(1).Cells 
     If cl.Offset(0, 1).Value >= 0 Then 
      update = False 
      If first Then 
       first = False 
       update = True 
      ElseIf cl.Value <> Cells(r, cNum).Value Then 
       update = True 
      End If 
      If update Then 
       r = r + 1 
       c = cSt 
       Cells(r, cNum).Value = cl.Value 
      End If 
      Cells(r, c).Value = cl.Offset(0, 1).Value 
      c = c + 1 
     End If 
    Next 
End Sub 
+0

Ваше решение работает абсолютно нормально. Благодарю. Можете ли вы предложить некоторые изменения в коде, который я написал? –

+0

Вам придется обернуть цикл 'while' с помощью цикла' while' или 'for' и т. Д. И изменить переменную' myValue' при выходе из внутреннего цикла. Существует бесконечное количество способов достичь того же, но почему бы просто не использовать мой ответ или @ chuff, если он работает для вас. – neizan

+0

Спасибо. Я продолжу решение –

Смежные вопросы