Добрый день, уважаемые знатоки VBA! Нужна помощь в написании макроса, который: 1. удаляет строки в которых с 1 по 3 столбец нет записей 2. и если в 5-м столбце стоит прочерк (-) то удалить и верхнюю строку
Имеется макрос, который хорошо отрабатывал, но сейчас к сожалению строки в которых нет записи ОБЪЕДИНЕНЫ и я не могу сообразить как подправить макрос да плюс в нем нет пункта 2.
Файл прикрепляю
Спасибо
Добрый день, уважаемые знатоки VBA! Нужна помощь в написании макроса, который: 1. удаляет строки в которых с 1 по 3 столбец нет записей 2. и если в 5-м столбце стоит прочерк (-) то удалить и верхнюю строку
Имеется макрос, который хорошо отрабатывал, но сейчас к сожалению строки в которых нет записи ОБЪЕДИНЕНЫ и я не могу сообразить как подправить макрос да плюс в нем нет пункта 2.
grh, к примеру в столбце А объединены строки 5 и 6, в столбцах В и С тоже объединены строки 5 и 6, а в столбцах F и G эти строки не объединены и что с ними делать, если удалять будем строку 6?
grh, к примеру в столбце А объединены строки 5 и 6, в столбцах В и С тоже объединены строки 5 и 6, а в столбцах F и G эти строки не объединены и что с ними делать, если удалять будем строку 6?Kuzmich
Имеется макрос, который хорошо отрабатывал, но сейчас к сожалению строки в которых нет записи ОБЪЕДИНЕНЫ
Этот макрос и сейчас присутствует в прикрепленном файле-примере.
Повторю еще раз: 1. если ЗРИТЕЛЬНО пустая строка до столбца F, то удаляем ВСЮ строку (включая не объединенные ячейки); 2. если ЗРИТЕЛЬНО пустая строка до столбца F, да еще плюс мы видим в столбце F ЭТОЙ ЖЕ строки прочерк (-), то удаляем и эту строку и строку выше (в примере Строительный мусор); 3. если есть возможность, подкорректировать номера по порядку, т.к. если удалять как описано в п.2 то нарушается нумерация (при большой таблице проблема).
Файл как есть и НИЖЕ как должно быть прилагаю. Прошу в этом файле обратить внимание на строки удаленные Строительного мусора и окончательную нумерацию слева.
P.S. В качестве ПРИМЕРА в прикрепленном файле удаляются из таблицы следующие строки:
- 6 - 8 - 10 - 12 - 14 и так как в этой строке в столбце F стоит прочерк (-), то удаляется и вышестоящая строка, т.е. 13 - 13 - 16
Так получилось, что удаляются строки четные, но на это нельзя ориентироваться, так как в другой таблице пустые строки могут быть по нечетным.
Имеется макрос, который хорошо отрабатывал, но сейчас к сожалению строки в которых нет записи ОБЪЕДИНЕНЫ
Этот макрос и сейчас присутствует в прикрепленном файле-примере.
Повторю еще раз: 1. если ЗРИТЕЛЬНО пустая строка до столбца F, то удаляем ВСЮ строку (включая не объединенные ячейки); 2. если ЗРИТЕЛЬНО пустая строка до столбца F, да еще плюс мы видим в столбце F ЭТОЙ ЖЕ строки прочерк (-), то удаляем и эту строку и строку выше (в примере Строительный мусор); 3. если есть возможность, подкорректировать номера по порядку, т.к. если удалять как описано в п.2 то нарушается нумерация (при большой таблице проблема).
Файл как есть и НИЖЕ как должно быть прилагаю. Прошу в этом файле обратить внимание на строки удаленные Строительного мусора и окончательную нумерацию слева.
P.S. В качестве ПРИМЕРА в прикрепленном файле удаляются из таблицы следующие строки:
- 6 - 8 - 10 - 12 - 14 и так как в этой строке в столбце F стоит прочерк (-), то удаляется и вышестоящая строка, т.е. 13 - 13 - 16
Так получилось, что удаляются строки четные, но на это нельзя ориентироваться, так как в другой таблице пустые строки могут быть по нечетным.grh1
Sub iMergeCellsDelete() Dim iBeginRow As Long Dim iLastRow As Long Application.DisplayAlerts = False iLastRow = Cells(Rows.Count, "G").End(xlUp).Row iBeginRow = Columns(1).Find("1", , xlValues, xlWhole).Row Range(Cells(iBeginRow, "A"), Cells(iLastRow, "E")).UnMerge For i = iLastRow - 1 To iBeginRow Step -1 If IsEmpty(Cells(i, "E")) And Cells(i, "F") <> "-" Then Rows(i).Delete Else If Cells(i, "F") = "-" Then Rows(i).Delete Rows(i - 1).Delete i = i - 1 End If End If Next Columns("C").Delete Columns("B").AutoFit Range("A" & iBeginRow) = 1 Range("A" & iBeginRow).DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Stop:=Cells(Rows.Count, "F").End(xlUp).Row - iBeginRow, Trend:=False Application.DisplayAlerts = True End Sub
[/vba]
Потестируйте [vba]
Код
Sub iMergeCellsDelete() Dim iBeginRow As Long Dim iLastRow As Long Application.DisplayAlerts = False iLastRow = Cells(Rows.Count, "G").End(xlUp).Row iBeginRow = Columns(1).Find("1", , xlValues, xlWhole).Row Range(Cells(iBeginRow, "A"), Cells(iLastRow, "E")).UnMerge For i = iLastRow - 1 To iBeginRow Step -1 If IsEmpty(Cells(i, "E")) And Cells(i, "F") <> "-" Then Rows(i).Delete Else If Cells(i, "F") = "-" Then Rows(i).Delete Rows(i - 1).Delete i = i - 1 End If End If Next Columns("C").Delete Columns("B").AutoFit Range("A" & iBeginRow) = 1 Range("A" & iBeginRow).DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Stop:=Cells(Rows.Count, "F").End(xlUp).Row - iBeginRow, Trend:=False Application.DisplayAlerts = True End Sub
Kuzmich, скачайте файл с моего сообщения № 3, и если вставите туда Ваш код, то пока ничего не получается.
Я подсмотрел код у sboy применил и мне понравилось - всего две строчки.
Сам код: [vba]
Код
Sub udalenie_strok()
For x = Cells(Rows.Count, 1).End(xlUp).Row To 5 Step -1 If Cells(x, 4).Value = "" Then Rows(x).Delete
Next x
End Sub
[/vba] Проверьте работу кода в прикрепленном файле 01.
Если добавляю две строчки кода, а именно
[vba]
Код
x = x - 1 If Cells(x, 5).Value = "-" Then Rows(x - 1).Delete
[/vba]
чтобы удалить строку на одну выше строки, в которой в столбце Е (5) стоит тире.
Получается такой код:
[vba]
Код
Sub udalenie_strok()
For x = Cells(Rows.Count, 1).End(xlUp).Row To 5 Step -1 If Cells(x, 4).Value = "" Then Rows(x).Delete x = x - 1 If Cells(x, 5).Value = "-" Then Rows(x - 1).Delete
Next x
End Sub
[/vba]
Но в этом случае отрабатывается только код, по удалению вышестоящей строчки где тире. Что-то неправильно наверно делаю. Перепробовал ставить эту строку кода и выше и ниже - ничего не получается. Может здесь нужен какой-то цикл или еще что. Подскажите как прикрутить эти две строчки, чтобы ВСЁ работало.
Kuzmich, скачайте файл с моего сообщения № 3, и если вставите туда Ваш код, то пока ничего не получается.
Я подсмотрел код у sboy применил и мне понравилось - всего две строчки.
Сам код: [vba]
Код
Sub udalenie_strok()
For x = Cells(Rows.Count, 1).End(xlUp).Row To 5 Step -1 If Cells(x, 4).Value = "" Then Rows(x).Delete
Next x
End Sub
[/vba] Проверьте работу кода в прикрепленном файле 01.
Если добавляю две строчки кода, а именно
[vba]
Код
x = x - 1 If Cells(x, 5).Value = "-" Then Rows(x - 1).Delete
[/vba]
чтобы удалить строку на одну выше строки, в которой в столбце Е (5) стоит тире.
Получается такой код:
[vba]
Код
Sub udalenie_strok()
For x = Cells(Rows.Count, 1).End(xlUp).Row To 5 Step -1 If Cells(x, 4).Value = "" Then Rows(x).Delete x = x - 1 If Cells(x, 5).Value = "-" Then Rows(x - 1).Delete
Next x
End Sub
[/vba]
Но в этом случае отрабатывается только код, по удалению вышестоящей строчки где тире. Что-то неправильно наверно делаю. Перепробовал ставить эту строку кода и выше и ниже - ничего не получается. Может здесь нужен какой-то цикл или еще что. Подскажите как прикрутить эти две строчки, чтобы ВСЁ работало.grh1
Kuzmich, извините я Вас не понял. В сообщении 1 пример был с лишним столбцом. Я Ваш код подогнал под таблицу без этого лишнего столбца - всё работает отлично.
Протестирую на большом списке и если что-то не получится - отпишусь.
Спасибо Вам большое.
Kuzmich, извините я Вас не понял. В сообщении 1 пример был с лишним столбцом. Я Ваш код подогнал под таблицу без этого лишнего столбца - всё работает отлично.
Протестирую на большом списке и если что-то не получится - отпишусь.