Нужно написать макрос, который: 1) идёт по строкам, начиная с 13. 2) выполняет проверку: если столбец B пустой, то объединить ячейки с A по Z, выровнять содержимое по левому краю. (если не очень сложно, то дополнительно у строки сделать толстые внешние границы). И так для каждой такой найденной строки. (нужно понять как выйти из цикла).
(ну или может можно макрос написать оптимальнее. Не через цикл по строкам, а через поиск и выделение таких строк и дальше объединение + выравнивание. Это, наверное, должно быстрее работать, чем цикл).
Во вложении файл, который формируется сейчас - before.xls. И пример файла, который должен получиться после выполнения макроса - after.xls
Добрый день. Помогите, пожалуйста, с макросом.
Нужно написать макрос, который: 1) идёт по строкам, начиная с 13. 2) выполняет проверку: если столбец B пустой, то объединить ячейки с A по Z, выровнять содержимое по левому краю. (если не очень сложно, то дополнительно у строки сделать толстые внешние границы). И так для каждой такой найденной строки. (нужно понять как выйти из цикла).
(ну или может можно макрос написать оптимальнее. Не через цикл по строкам, а через поиск и выделение таких строк и дальше объединение + выравнивание. Это, наверное, должно быстрее работать, чем цикл).
Во вложении файл, который формируется сейчас - before.xls. И пример файла, который должен получиться после выполнения макроса - after.xlsfalazure123
Добрый день. На 3 строки долго не будет, можно даже не отключать обновление экрана. Вот, используя макрорекордер (обработка в чистом виде запись рекордера, специально ничего не выкидывал, только заменил selection на аргумент):
[vba]
Код
Option Explicit
Sub tt() Dim i&, lr& lr = Cells(Rows.Count, 26).End(xlUp).Row
Application.ScreenUpdating = False For i = 13 To lr If Len(Trim(Cells(i, 2))) = 0 Then обработка Cells(i, 1).Resize(, 26) End If Next Application.ScreenUpdating = True
End Sub
Sub обработка(rng)
With rng .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = False End With rng.Merge With rng .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = True End With rng.Borders(xlDiagonalDown).LineStyle = xlNone rng.Borders(xlDiagonalUp).LineStyle = xlNone With rng.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With rng.Borders(xlInsideVertical).LineStyle = xlNone rng.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
[/vba]
Добрый день. На 3 строки долго не будет, можно даже не отключать обновление экрана. Вот, используя макрорекордер (обработка в чистом виде запись рекордера, специально ничего не выкидывал, только заменил selection на аргумент):
[vba]
Код
Option Explicit
Sub tt() Dim i&, lr& lr = Cells(Rows.Count, 26).End(xlUp).Row
Application.ScreenUpdating = False For i = 13 To lr If Len(Trim(Cells(i, 2))) = 0 Then обработка Cells(i, 1).Resize(, 26) End If Next Application.ScreenUpdating = True
End Sub
Sub обработка(rng)
With rng .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = False End With rng.Merge With rng .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = True End With rng.Borders(xlDiagonalDown).LineStyle = xlNone rng.Borders(xlDiagonalUp).LineStyle = xlNone With rng.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With rng.Borders(xlInsideVertical).LineStyle = xlNone rng.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
Добрый день. На 3 строки долго не будет, можно даже не отключать обновление экрана. Вот, используя макрорекордер (обработка в чистом виде запись рекордера, специально ничего не выкидывал, только заменил selection на аргумент):
В том и дело , что строк может быть сколько угодно (выгружаются данные из системы). Это для примера скинул файлы.
Добрый день. На 3 строки долго не будет, можно даже не отключать обновление экрана. Вот, используя макрорекордер (обработка в чистом виде запись рекордера, специально ничего не выкидывал, только заменил selection на аргумент):
В том и дело , что строк может быть сколько угодно (выгружаются данные из системы). Это для примера скинул файлы.falazure123
Sub tt() Dim i&, lr&, ra As Range lr = Cells(Rows.Count, 26).End(xlUp).Row
For i = 13 To lr If Len(Trim(Cells(i, 2))) = 0 Then If ra Is Nothing Then Set ra = Cells(i, 1).Resize(, 26) Else Set ra = Union(ra, Cells(i, 1).Resize(, 26)) End If Next обработка ra End Sub
Sub обработка(rng) With rng .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = False End With rng.Merge True With rng .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = True End With rng.Borders(xlDiagonalDown).LineStyle = xlNone rng.Borders(xlDiagonalUp).LineStyle = xlNone With rng.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With rng.Borders(xlInsideVertical).LineStyle = xlNone rng.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
[/vba]
Есть ещё резерв - анализируем/перебираем массив. Ну это заметно сыграет если строк где-то более 10к уже...
Можно так ускориться:
[vba]
Код
Option Explicit
Sub tt() Dim i&, lr&, ra As Range lr = Cells(Rows.Count, 26).End(xlUp).Row
For i = 13 To lr If Len(Trim(Cells(i, 2))) = 0 Then If ra Is Nothing Then Set ra = Cells(i, 1).Resize(, 26) Else Set ra = Union(ra, Cells(i, 1).Resize(, 26)) End If Next обработка ra End Sub
Sub обработка(rng) With rng .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = False End With rng.Merge True With rng .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = True .ReadingOrder = xlContext .MergeCells = True End With rng.Borders(xlDiagonalDown).LineStyle = xlNone rng.Borders(xlDiagonalUp).LineStyle = xlNone With rng.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With rng.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With rng.Borders(xlInsideVertical).LineStyle = xlNone rng.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
[/vba]
Есть ещё резерв - анализируем/перебираем массив. Ну это заметно сыграет если строк где-то более 10к уже...Hugo