Дата: Понедельник, 31.03.2014, 10:33 |
Сообщение № 1
Группа: Гости
Добрый день! В связи с необходимостью решения одной задачки начал изучать VBA в Excele и хочу сказать, мне очень понравилось. Читаю Слепцову. Пока я не дошел сам (через год наверное только) прошу помочь составить макрос для моей задачки. 1. В выделенном диапазоне строк со значениями от 1 до 10 необходимо вставить по одной пустой строке. В итоге должно получиться следующее по столбцу "А": пустая ячейка, 1, пустая ячейка, 2, ..., пустая ячейка, 10. 2. Данная операция должна применяться к любому выделенному диапазону, т.е. если мы выделим строки 45, 50-55, 100 и т.д., после запуска макроса будут вставлены по одной пустой строке перед каждой строкой в этом выделении.
Кроме данной задачки, есть и другая, более общая. Я записал макрос на основе повторяющихся действий на листе "Лист1". Как применить действие данного макроса одновременно на все листы в книге? У меня много таблиц с одинаковой структурой в каждой вкладке. Или придется для каждого листа запускать макрос с начала? Огромное спасибо за возможную помощь!
Добрый день! В связи с необходимостью решения одной задачки начал изучать VBA в Excele и хочу сказать, мне очень понравилось. Читаю Слепцову. Пока я не дошел сам (через год наверное только) прошу помочь составить макрос для моей задачки. 1. В выделенном диапазоне строк со значениями от 1 до 10 необходимо вставить по одной пустой строке. В итоге должно получиться следующее по столбцу "А": пустая ячейка, 1, пустая ячейка, 2, ..., пустая ячейка, 10. 2. Данная операция должна применяться к любому выделенному диапазону, т.е. если мы выделим строки 45, 50-55, 100 и т.д., после запуска макроса будут вставлены по одной пустой строке перед каждой строкой в этом выделении.
Кроме данной задачки, есть и другая, более общая. Я записал макрос на основе повторяющихся действий на листе "Лист1". Как применить действие данного макроса одновременно на все листы в книге? У меня много таблиц с одинаковой структурой в каждой вкладке. Или придется для каждого листа запускать макрос с начала? Огромное спасибо за возможную помощь!Мурад
Дата: Понедельник, 31.03.2014, 10:57 |
Сообщение № 2
Группа: Гости
Хотел бы добавить, что я не студент, которому дали домашнее задание и я пытаюсь на вашем труде получить себе оценку. Я отлично учился на языках Qbasic, Pascal и С+, но с Excel работал всегда только до уровня функций ВПР, ПСТР и Сводных таблиц. Только недавно начал обращать свое внимание на макросы, т.к. понимаю, что они очень пригодятся для людей, работающих с большими массивами данных.
Хотел бы добавить, что я не студент, которому дали домашнее задание и я пытаюсь на вашем труде получить себе оценку. Я отлично учился на языках Qbasic, Pascal и С+, но с Excel работал всегда только до уровня функций ВПР, ПСТР и Сводных таблиц. Только недавно начал обращать свое внимание на макросы, т.к. понимаю, что они очень пригодятся для людей, работающих с большими массивами данных.Мурад
Дата: Понедельник, 31.03.2014, 12:02 |
Сообщение № 3
Группа: Гости
Я логически представляю какой должна быть структура программы. В общем виде, в выделенном диапазоне программа должна рассматривать каждую строку отдельно и проводить операции пока не будет достигнута последняя строка диапазона. Т.е. надо использовать процедуру, допустим With Selection ... End With. В теле этой процедуры нужно присвоить строки (номера строк) какому-то массиву A(). Далее каждый аргумент массива (т.е. строку) проходит через следующее: значения ячеек сдвинуть вниз, скопировать формат из верхних ячеек в нижние. Вот только проблема. Как только мы сдвинем первую строку, номера строк в присвоенном диапазоне уже не будут соответствовать фактическим
Я логически представляю какой должна быть структура программы. В общем виде, в выделенном диапазоне программа должна рассматривать каждую строку отдельно и проводить операции пока не будет достигнута последняя строка диапазона. Т.е. надо использовать процедуру, допустим With Selection ... End With. В теле этой процедуры нужно присвоить строки (номера строк) какому-то массиву A(). Далее каждый аргумент массива (т.е. строку) проходит через следующее: значения ячеек сдвинуть вниз, скопировать формат из верхних ячеек в нижние. Вот только проблема. Как только мы сдвинем первую строку, номера строк в присвоенном диапазоне уже не будут соответствовать фактическим Мурад
Надо как-то зафиксировать строки исходного диапазона (выделения) в самом начале. После этого можно что угодно делать с выделением - зафиксированные объекты будут автоматически адекватно подстраиваться под вносимые изменения, например, под вставку дополнительных строк:
[vba]
Код
Sub test()
Dim selrows() As Range Dim row As Range Dim i As Integer Dim cnt As Integer
cnt = Selection.Rows.Count ReDim Preserve selrows(1 To cnt)
For Each row In Selection.Rows i = i + 1 Set selrows(i) = row Next
For i = 1 To cnt selrows(i).Insert Shift:=xlDown Next
End Sub
[/vba]
Надо как-то зафиксировать строки исходного диапазона (выделения) в самом начале. После этого можно что угодно делать с выделением - зафиксированные объекты будут автоматически адекватно подстраиваться под вносимые изменения, например, под вставку дополнительных строк:
[vba]
Код
Sub test()
Dim selrows() As Range Dim row As Range Dim i As Integer Dim cnt As Integer
cnt = Selection.Rows.Count ReDim Preserve selrows(1 To cnt)
For Each row In Selection.Rows i = i + 1 Set selrows(i) = row Next
For i = 1 To cnt selrows(i).Insert Shift:=xlDown Next
Дата: Понедельник, 31.03.2014, 13:57 |
Сообщение № 5
Группа: Гости
Gustav, спасибо! Представленный Вами способ применим только к непрерывному выделению. При выделении строк 2-4 и 8-10, допустим, и запуска макроса, вылетает ошибка 9 (вылет за пределы выделения)
Gustav, спасибо! Представленный Вами способ применим только к непрерывному выделению. При выделении строк 2-4 и 8-10, допустим, и запуска макроса, вылетает ошибка 9 (вылет за пределы выделения)Мурад
AlexM, что-то у меня что этот вариант, что предыдущий (с минус 1) уходят в глубокий зацикл. Причем, остановить по Ctrl-Break не сразу получается... Я вначале тоже пытался нечто подобное сваять, но отказался именно из-за аналогичного зацикливания...
P.S. А пример выполняется без проблем (первый раз), потому что выделение там было создано по одной строке Если выделить в одной области больше одной строки, то начинается...
AlexM, что-то у меня что этот вариант, что предыдущий (с минус 1) уходят в глубокий зацикл. Причем, остановить по Ctrl-Break не сразу получается... Я вначале тоже пытался нечто подобное сваять, но отказался именно из-за аналогичного зацикливания...
P.S. А пример выполняется без проблем (первый раз), потому что выделение там было создано по одной строке Если выделить в одной области больше одной строки, то начинается... Gustav
Gustav, вы - мастер. Ваша доработка не только вставляет пустые строки перед каждой строкой выделенного диапазона, но и сохраняет формат перемещаемых ячеек. AlexM, спасибо за старания! Но Ваш программный код не подходит. В случае непрерывного диапазона возникает ошибка бесконечности, в случае разделенных строк вставляется пустая строка один раз, затем курсор переходит в ячейку A1
Gustav, вы - мастер. Ваша доработка не только вставляет пустые строки перед каждой строкой выделенного диапазона, но и сохраняет формат перемещаемых ячеек. AlexM, спасибо за старания! Но Ваш программный код не подходит. В случае непрерывного диапазона возникает ошибка бесконечности, в случае разделенных строк вставляется пустая строка один раз, затем курсор переходит в ячейку A1Мурад
У меня Excel2003, не думаю, что у меня нет проблем по этой причине
ммм... а я как раз склонен подумать об этом, потому что у меня 2010... неужели в этом дело?! интересно-интересно...
Тем временем попробовал сделать через Collection. Не знаю, с какой версии они присутствуют в VBA по умолчанию, но я в 2010 вроде ничего специально не включал. Основное преимущество перед моим вторым способом - ничего не надо считать и перебирать области выделения:
[vba]
Код
Sub test3()
Dim selrows As New Collection Dim row As Range
For Each row In Selection.Rows selrows.Add row Next
У меня Excel2003, не думаю, что у меня нет проблем по этой причине
ммм... а я как раз склонен подумать об этом, потому что у меня 2010... неужели в этом дело?! интересно-интересно...
Тем временем попробовал сделать через Collection. Не знаю, с какой версии они присутствуют в VBA по умолчанию, но я в 2010 вроде ничего специально не включал. Основное преимущество перед моим вторым способом - ничего не надо считать и перебирать области выделения:
[vba]
Код
Sub test3()
Dim selrows As New Collection Dim row As Range
For Each row In Selection.Rows selrows.Add row Next
Также хотел спросить Вас, правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники. Спасибо!
Также хотел спросить Вас, правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники. Спасибо!Мурад
правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники
Вы выбрали правильный курс саморазвития в принципе - VBA А кто конкретно вас с ним познакомит - не так уж и важно. Мои самые первые бумажные источники - в далеком прошлом и я не помню, как они точно называются. В Библиотеке форума есть вполне достойная подборка книг, например, здесь: http://www.excelworld.ru/index/vba/0-12 . Среди прочих там есть мне весьма симпатичная: П. Эйткен "Интенсивный курс программирования в Excel за выходные" - простенько и со вкусом (правда, почему-то перестала работать ссылка на нее...)
правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники
Вы выбрали правильный курс саморазвития в принципе - VBA А кто конкретно вас с ним познакомит - не так уж и важно. Мои самые первые бумажные источники - в далеком прошлом и я не помню, как они точно называются. В Библиотеке форума есть вполне достойная подборка книг, например, здесь: http://www.excelworld.ru/index/vba/0-12 . Среди прочих там есть мне весьма симпатичная: П. Эйткен "Интенсивный курс программирования в Excel за выходные" - простенько и со вкусом (правда, почему-то перестала работать ссылка на нее...)