2

Привет, ребята, отец друзей спросил меня, знаю ли я, как выполнить задание в Excel, но я не так, чтобы помочь ему, я решил спросить здесь. Это то, что он пытается сделать.

У него есть лист Excel, который выглядит примерно так:

    A          B 
1   House 1    card 1 
2   House 1    card 2
3   House 1    card 3 
4   House 1    card 4 

Есть около 500 записей, похожих на это. Таким образом, вместо того, чтобы вводить и вручную брать каждую карточку и перемещать ее в первый ряд, а затем удалять другие записи Дома 1, есть какая-то функция, которая объединяет все элементы с одинаковыми именами и их последующие записи. В качестве визуального изображения он пытается превратить предыдущий пример в такой:

  A        B       C       D       E
1 House 1  card 1  card 2  card 3  card 4

Спасибо за любую помощь, которую может оказать любой.

1 ответ1

2

Если ваш список отсортирован по столбцу А, тогда этот метод даст вам то, что вы хотите.

Скопируйте список в столбце A в другой столбец.

Затем используйте Remove Duplicates, чтобы получить уникальный список:

Затем в первую ячейку рядом с первым элементом поместите:

=IF(COLUMN(A:A)>COUNTIF($A:$A,$E1),"",INDEX($B:$B,MATCH($E1,$A:$A,0)+COLUMN(A:A)-1))

Затем скопируйте столько столбцов, сколько наибольшее количество элементов. Затем скопируйте вниз в список.

Затем скопируйте и вставьте значения в новый лист или на себя.


Если вы хотите сделать это на месте; Я написал этот код для другого сайта, который останется безымянным. Он будет делать то, что вы хотите довольно быстро на месте:

Sub FOOO()
Dim inArr() As Variant
Dim outArr() As Variant
Dim ws As Worksheet
Dim cntrw As Long
Dim cntclm As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim rng As Range

Set ws = ActiveSheet

With ws
    Set rng = .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
    'find the max number column that will be needed in the output
    cntclm = ws.Evaluate("MAX(COUNTIF(" & rng.Address & "," & rng.Address & "))") + 1
    'find the number of rows that will be needed in the output.
    cntrw = ws.Evaluate("SUM(1/COUNTIF(" & rng.Address & "," & rng.Address & "))")
    'put the existing data into an an array
    inArr = rng.Resize(, 2).Value
    'resize output array to the extents needed
    ReDim outArr(1 To cntrw, 1 To cntclm)
    'put the first value in the first spot in the output
    outArr(1, 1) = inArr(1, 1)
    outArr(1, 2) = inArr(1, 2)
    'these are counters to keep track of which slot the data should go.
    j = 3
    k = 1
    'loop through the existing data rows
    For i = 2 To UBound(inArr, 1)
        'test whether the data in A has changed or not.
        If inArr(i, 1) = inArr(i - 1, 1) Then
            'if not put the value in B in the next slot and iterate to the next column
            outArr(k, j) = inArr(i, 2)
            j = j + 1
        Else
            'if change start a new line in the outarr and fill the first two slots
            k = k + 1
            j = 3
            outArr(k, 1) = inArr(i, 1)
            outArr(k, 2) = inArr(i, 2)
        End If
    Next i
    'remove old data
    .Range("A:B").Clear
    'place new data in its place.
    .Range("A1").Resize(UBound(outArr, 1), UBound(outArr, 2)).Value = outArr
End With
End Sub

До:

После:

ПРИМЕЧАНИЕ: оба метода требуют сортировки столбца А.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .