Так что я исследовал это некоторое время, но я, кажется, бью стену. Я признаю - я однажды успешно сделал это, сделал учебник для моих коллег - тогда я и никто другой не смогли повторить результаты. Я немного компетентен в Excel, но в VBA и кодировании в целом я все еще новичок (поэтому приношу свои извинения, если я упускаю что-то очевидное).

Я использовал код VBA из этого вопроса:Как объединить значения из нескольких строк в одну строку в Excel?

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
        c.Offset(,3) = c.Offset(1,3)
        c.Offset(1).EntireRow.Delete
End If

Next

End Sub

Это сработало успешно один раз. Я попробовал это снова, через час, и когда я запускаю тот же код - ничего не происходит. Я нажимаю кнопку запуска, и все выглядит одинаково.

Я впал в отчаяние и попробовал другой код в ранее упомянутом вопросе, но это не сработало бы с тем, как мои данные настроены / первоначальный автор все равно предпочел исходную формулу.

Ниже приведен пример данных, с которыми я работаю. Кто-нибудь есть какие-либо предложения или выявить какие-либо очевидные ошибки с моей стороны?

Кроме того, я не обеспокоен перезаписью данных в NON COURSE ID.

2 ответа2

0

Я верю, что это сделает то, что вы ищете. Это почти то же самое, что и оригинал, но я добавил немного пуха, чтобы сделать его более понятным и легче модифицировать.

Sub CombineRowsRevisited()

    Dim c As Range
    Dim i As Integer
    Dim PersonID, REAScore, WRTScore, startDate, courseID as integer

    'Columns as I understand them (subtracting one from the actual column in the sheet)
    PersonID = 0    'personid is in column 1  etc..
    '...
    startDate = 1
    courseID = 2
    REAScore = 3    
    WRTScore = 4
    ESSScore = 5


    'Looping through each record
    For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))

      'If personID on this record is the same as the personID on the next record
      If c.Offset(0, PersonID ) = c.Offset(1, PersonID ) Then

            'blindly overwrite startDate and courseID with the value from the next row
            c.offset(1, startDate ) = c.Offset(0, startDate)
            c.offset(1, courseID) = c.offset(0, courseID)

            'only copy the scores if they are not null
            if c.offset(0, REAScore).value <> vbNull then c.offset(1, REAScore) = c.offset(0, REAScore)
            if c.offset(0, WRTScore).value <> vbNull then c.offset(1, WRTScore) = c.offset(0, WRTScore)
            if c.offset(0, ESSScore).value <> vbNull then c.offset(1, ESSScore) = c.offset(0, ESSScore)

            'Just added this to delete the next row when a match is found
            c.entireRow.Delete
      End If
    Next

End Sub
0

Я бы использовал Power Query Add-In для удовлетворения этого требования. Запрос может начинаться с существующей таблицы Excel. Я бы использовал команду Group By, чтобы определить нужную вам "объединяющую" логику.

http://office.microsoft.com/en-au/excel-help/group-rows-in-a-table-HA103993875.aspx?CTT=5&origin=HA103993930

Я бы доставил результат в таблицу Excel.

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