В файле excel, в котором столбец A заполняется разными датами, сортируется в порядке возрастания, макрос должен генерировать приглашение пользователя, которое запрашивает дату. Затем макрос должен вставить строку между двумя датами, которые меньше и больше даты, заданной пользователем.
До сих пор я только предлагал пользователю указать определенную строку, ниже которой макрос вставляет новую строку. Может ли кто-нибудь помочь мне со следующими шагами?
Создан 04 фев. 16 2016-02-04 19:17:23 mr_bungles
Если это уже отсортирован все, что вам нужно сделать, это итерацию через колонку и найти дату, которая меньше и вставить строку до указанной даты. – Taelsin 04 фев. 16 2016-02-04 19:21:48
Правда, это облегчает, спасибо. Однако, поскольку я довольно новичок в VBA, мне было интересно, можете ли вы помочь мне с правильными функциями/синтаксисом, чтобы сделать это . – mr_bungles 04 фев. 16 2016-02-04 19:38:42
Конечно. Я отведу его в ответ. – Taelsin 04 фев. 16 2016-02-04 19:55:08
@mr_bungles Извините, что я не был частью этого конвоя, я писал макрос для моего ответа. Я включил много комментариев, поэтому он должен служить в качестве учебника, а также инструментом. – Lopsided 04 фев. 16 2016-02-04 21:06:51
2 ответа
Претензии к Таелсину за его ответ, но я заметил несколько вопросов с его макросом (например, не существует учета недопустимого формата даты, введенного пользователем).
Плюс, я полагал, что вы, возможно, захотите на самом деле узнать, что именно происходит с кодом. Итак, я создал следующую подпрограмму с большим количеством комментариев и объяснений. Надеюсь, он тебя хорошо.
Создан 04 фев. 16 2016-02-04 21:03:08 Lopsided
Как я уже говорил в комментариях, я бы просто итерацию через колонку даты, пока вы не найти дату, которая больше (я сказал меньше в комментариях, но если это возрастающий порядок большой дата будет ко дну).
Возможно, вам потребуется больше проверки ошибок, но это должно сделать трюк.
Создан 04 фев. 16 2016-02-04 20:10:05 Taelsin
В данном практическом примере приведен код макроса для умной вставки пустых строк между ячейками. Пошаговая инструкция как вставлять строки между объединенными и необъединенными ячейками одновременно для любой таблицы.
Макрос для вставки строк с определенной высотой
В таблице отчета по продажам в розничных точках содержаться объединенные ячейки, как показано ниже на рисунке:
Необходимо экспонировать группы ячеек для каждого штата. Для этого мы добавим по одной пустой строке между каждой группой розничных точек. При этом не имеет значение будет ли содержать группа объединенные ячейки или нет. Ведь некоторые группы состоят из одной строки. А также дополнительно уменьшим высоту этих пустых строк, чтобы внешний вид таблицы был стильным. Выполнить вручную все эти действия: выделение отдельных групп ячеек, вставка между ними пустых строк, а потом изменение высоты для этих же строк – это не рационально использование сил и времени. Особенно если таблица имеет десятки тысяч строк. Лучше написать свой макрос, который сам автоматически и молниеносно выполнит эту рутинную работу за Вас.
Перейдите в режим редактора макросов Visual Basic (ALT+F11):
Создайте в нем новый модуль с помощью инструмента: «Insert»-«Module». А потом запишите в него VBA-код самого макроса:
Sub VstavkaStrok()
Dim i As Long
Dim pustroka As Long
For i = Selection.Rows.Count To 2 Step -1
pustroka = Selection(i, 1).Row + 1
ActiveSheet.Rows(pustroka).Insert xlShiftDown
ActiveSheet.Rows(pustroka).RowHeight = 7
ActiveSheet.Rows(pustroka).Borders(xlInsideVertical). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeLeft). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeRight). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Interior. _
ColorIndex = xlColorIndexNone
i = i — Selection(i, 1).MergeArea.Rows.Count + 1
Next
End Sub
Теперь если мы хотим вставить по одной пустой строке между каждой объединенной и необъединенной ячейкой, которые находиться в столбце A? Тогда а в таблице отчета по продажам выделяем диапазон ячеек A:D18 и запускаем наш макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«VstavkaStrok»-«Выполнить». После запуска макроса таблица будет выглядеть как показано на рисунке:
Сначала в коде объявлены две переменные:
- i – переменная выполняет роль счетчика в цикле.
- pustroka – переменная будет хранить в себе очередной номер для каждой строки выделенного диапазона.
В макросе находиться цикл, который запускает целый ряд инструкций для каждой строки в выделенном диапазоне ячеек. Направление цикла идет с нижней строки выделения к верхней.
- В первой инструкции мы присваиваем для переменной pustroka номер строки которая находиться под текущей строкой.
- Следующая инструкция добавляет пустую строку с высотой в 7 пикселей.
- Удаляются в добавленной строке все вертикальные границы, а также заливка.
- Уменьшается значение переменной i на количество строк, которые охватывает текущая объединенная ячейка, находящаяся в первом столбце выделенного диапазона.
Умная вставка строк с помощью макроса
Если же мы хотим экспонировать только самые большие группы. Допустим Вы желаете сделать так, чтобы макросом были вставлены пустые строки только после объединенных ячеек в столбце A, которые охватывают много строк. И не вставлять пустые строки после необъединенных ячеек или тех объединенных ячеек, которые охватывают не более 1-ой строки. Тогда после строки в коде макроса где описано начало цикла добавляем строку кода с условной инструкцией:
If Selection(i, 1).MergeArea.Rows.Count <> 1 Then
Также перед инструкцией конца цикла Next следует вставить инструкцию конца условия – End If.
Обратите внимание! Параметр условия для игнорирования объединенных ячеек с определенным количеством озвучиваемых строк можно будет даже настраивать, изменяя число после оператора сравнения.
Такая модификация кода макроса внутри цикла будет следить за тем применять ли ряд инструкций к текущей строке или игнорировать их на данном этапе прохода по срокам. Если же текущая строка не содержит необъединенной ячейки или объединенная ячейка охватывает более чем 1-ну строку, тогда для нее применяться все инструкции форматирования. Полная версия модифицированного года выглядит так:
Sub VstavkaStrok1()
Dim i As Long
Dim pustroka As Long
For i = Selection.Rows.Count To 2 Step -1
If Selection(i, 1).MergeArea.Rows.Count <> 1 Then
pustroka = Selection(i, 1).Row + 1
ActiveSheet.Rows(pustroka).Insert xlShiftDown
ActiveSheet.Rows(pustroka).RowHeight = 7
ActiveSheet.Rows(pustroka).Borders(xlInsideVertical). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeLeft). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeRight). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Interior. _
ColorIndex = xlColorIndexNone
i = i — Selection(i, 1).MergeArea.Rows.Count + 1
End If
Next
End Sub
Результат автоматического форматирования таблицы отчета с учетом новых условий в коде макроса:
Как видите с помощью макросов таблицы любых объемов данных можно форматировать в один клик мышкой.
Я пытаюсь скопировать целую строку по номеру индекса и вставить ее в другую строку с другим номером индекса, когда выполняется определенное условие (я знаю, что проблема не связана с условной логикой). Я думаю о чем-то вроде этого:
Логика работает так, как предполагалось, но никакие строки не вставлены. Я пошел шаг за шагом и уверен, что проблема не в логике.
macros vba excel-vba excel
3 ответа
3 Решение Ajeet Shah [2016-06-16 11:32:00]
Я предполагаю, что вы хотите скопировать Rows(i) и вставить их как значение в Rows(lastRow) . Итак, вам нужно заменить эту строку
с этими двумя строками:
если вы хотите скопировать Rows(lastRow) и вставить их как значение в Rows(i) .
Редактировать:
Чтобы вставить все (формулы + значения + форматы), используйте тип вставки как xlPasteAll .
ваш код работает для меня
поэтому просто добавьте точку останова. Rows(lastRow) =.Rows(i).Value инструкцию, а затем запросить все значения соответствующих переменных в окне Immediate, например:
в то время как вы могли
add Option Explicit оператор в самом верху вашего модуля кода
это заставит вас объявить все переменные и, таким образом, приведет к некоторой дополнительной работе, но вы получите погашение с гораздо большим контролем над использованием переменных и орфографическими ошибками, тем самым сохраняя время отладки
dim для хранения индекса строк с Long типом, для обработки индекса строк выше 32767
избегать внутреннего цикла, используя метод Resize() объекта диапазона