ID        Date         Code     Price
9202188   04/11/2014   212015   29,47
                       212026   30,5
9202190   03/11/2014   813012   99,47
                       814027   60,5

У меня есть эти данные в файле Excel (как пример). Каждая строка начинается с идентификационного номера и может иметь несколько кодов, связанных с ним. (Я получил эти данные со старого сайта, примерно в этом формате).

Так что в этом примере ID 9202188 имеет 2 кода с 2 ценами на 1 дату, и это, так сказать, один сгруппированный элемент.

Сейчас я пытаюсь, чтобы Excel сделал внешнюю границу вокруг всей группы, например так:

ID        Date         Code     Price
______________________________________
|9202188   04/11/2014   212015   29,47|
|_______________________212026___30,5_|
|9202190   03/11/2014   813012   99,47|
|_______________________814027___60,5_|

Может ли это быть автоматизировано для списка, скажем, 200 групп предметов (каждая из которых содержит не менее 2 или более строк, но всегда только 1 идентификационный номер)?

Затем мне также нужно иметь возможность сортировать группы по идентификатору, сохраняя строки вместе, но это другой вопрос.

2 ответа2

2

Этот макрос должен получить вам границы, которые вы хотите.

Sub wrap_border()
    Dim r As Long, br As Long, lColumns_Wide As Long, lColumn_With_Solid_Data As Long
    lColumns_Wide = 17
    lColumn_With_Solid_Data = 16
    With ActiveSheet
        For r = 2 To .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row
            If CBool(Len(.Cells(r, 1).Value)) Then
                If CBool(Len(.Cells(r + 1, 1).Value)) Then
                    br = r
                ElseIf CBool(Application.CountA(.Cells(r + 1, 1).Resize(Rows.Count - r, 1))) Then
                    br = .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row
                    br = Application.Evaluate("MIN(INDEX(ROW(" & (r + 1) & ":" & br & ")+NOT(LEN(A" & (r + 1) & ":A" & br & "))*1E+99,,))")
                Else
                    br = .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row + 1
                End If
                .Cells(r, 1).Resize(br - r, lColumns_Wide).BorderAround ColorIndex:=13, Weight:=xlThick
            End If
        Next r
    End With
End Sub

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

     BorderAround VBA

Параметры для изменения стиля границы с .BorderAround можно найти в Range.Метод BorderAround. Помните, что вы можете использовать Color:= или ColorIndex:= но не оба одновременно. Я нахожу, что с ColorIndex легче работать, если вы можете использовать ограниченную палитру. Вот таблица ColorIndex на выбор.

     ColorIndex Table

Что касается сортировки, вам нужно будет заполнить пустые ячейки в столбце A или использовать столбец Helper справа, чтобы помочь сохранить значения вместе.

Модификация: я добавил дополнительную функциональность, чтобы можно было установить ширину области границы. Это требует, чтобы один из столбцов, который не имеет пустых ячеек, также был идентифицирован. Смотрите строки 2 и 3 в исправленном коде.

0

Вот частичное решение с использованием условного форматирования

= НЕ (ЕПУСТО (В2))

= ЕПУСТО (В2)

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