Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Вставка пустых строк в выбранном диапазоне - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Вставка пустых строк в выбранном диапазоне
Мурад Дата: Понедельник, 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:33
Мурад Дата: Понедельник, 31.03.2014, 10:57 | Сообщение № 2
Группа: Гости
Хотел бы добавить, что я не студент, которому дали домашнее задание и я пытаюсь на вашем труде получить себе оценку. Я отлично учился на языках Qbasic, Pascal и С+, но с Excel работал всегда только до уровня функций ВПР, ПСТР и Сводных таблиц. Только недавно начал обращать свое внимание на макросы, т.к. понимаю, что они очень пригодятся для людей, работающих с большими массивами данных.
 
Ответить
СообщениеХотел бы добавить, что я не студент, которому дали домашнее задание и я пытаюсь на вашем труде получить себе оценку. Я отлично учился на языках Qbasic, Pascal и С+, но с Excel работал всегда только до уровня функций ВПР, ПСТР и Сводных таблиц. Только недавно начал обращать свое внимание на макросы, т.к. понимаю, что они очень пригодятся для людей, работающих с большими массивами данных.

Автор - Мурад
Дата добавления - 31.03.2014 в 10:57
Мурад Дата: Понедельник, 31.03.2014, 12:02 | Сообщение № 3
Группа: Гости
Я логически представляю какой должна быть структура программы. В общем виде, в выделенном диапазоне программа должна рассматривать каждую строку отдельно и проводить операции пока не будет достигнута последняя строка диапазона. Т.е. надо использовать процедуру, допустим With Selection ... End With. В теле этой процедуры нужно присвоить строки (номера строк) какому-то массиву A(). Далее каждый аргумент массива (т.е. строку) проходит через следующее: значения ячеек сдвинуть вниз, скопировать формат из верхних ячеек в нижние.
Вот только проблема. Как только мы сдвинем первую строку, номера строк в присвоенном диапазоне уже не будут соответствовать фактическим %)
 
Ответить
СообщениеЯ логически представляю какой должна быть структура программы. В общем виде, в выделенном диапазоне программа должна рассматривать каждую строку отдельно и проводить операции пока не будет достигнута последняя строка диапазона. Т.е. надо использовать процедуру, допустим With Selection ... End With. В теле этой процедуры нужно присвоить строки (номера строк) какому-то массиву A(). Далее каждый аргумент массива (т.е. строку) проходит через следующее: значения ячеек сдвинуть вниз, скопировать формат из верхних ячеек в нижние.
Вот только проблема. Как только мы сдвинем первую строку, номера строк в присвоенном диапазоне уже не будут соответствовать фактическим %)

Автор - Мурад
Дата добавления - 31.03.2014 в 12:02
Gustav Дата: Понедельник, 31.03.2014, 13:38 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Надо как-то зафиксировать строки исходного диапазона (выделения) в самом начале. После этого можно что угодно делать с выделением - зафиксированные объекты будут автоматически адекватно подстраиваться под вносимые изменения, например, под вставку дополнительных строк:

[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]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеНадо как-то зафиксировать строки исходного диапазона (выделения) в самом начале. После этого можно что угодно делать с выделением - зафиксированные объекты будут автоматически адекватно подстраиваться под вносимые изменения, например, под вставку дополнительных строк:

[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]

Автор - Gustav
Дата добавления - 31.03.2014 в 13:38
Мурад Дата: Понедельник, 31.03.2014, 13:57 | Сообщение № 5
Группа: Гости
Gustav, спасибо!
Представленный Вами способ применим только к непрерывному выделению. При выделении строк 2-4 и 8-10, допустим, и запуска макроса, вылетает ошибка 9 (вылет за пределы выделения)
 
Ответить
СообщениеGustav, спасибо!
Представленный Вами способ применим только к непрерывному выделению. При выделении строк 2-4 и 8-10, допустим, и запуска макроса, вылетает ошибка 9 (вылет за пределы выделения)

Автор - Мурад
Дата добавления - 31.03.2014 в 13:57
Gustav Дата: Понедельник, 31.03.2014, 14:10 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Представленный Вами способ применим только к непрерывному выделению. При выделении строк 2-4 и 8-10, допустим, и запуска макроса, вылетает ошибка

"А пожалуйста!" (с) О чем говорят мужчины - добавим цикл по областям (areas):
[vba]
Код
Sub test2()

     Dim selrows() As Range
     Dim area      As Range
     Dim row       As Range
     Dim i         As Integer
     Dim cnt       As Integer
         
     For Each area In Selection.Areas
         cnt = cnt + area.Rows.Count
     Next
     ReDim Preserve selrows(1 To cnt)
      
     For Each area In Selection.Areas
         For Each row In area.Rows
             i = i + 1
             Set selrows(i) = row
         Next
     Next
      
     For i = 1 To cnt
         selrows(i).Insert Shift:=xlDown
     Next
      
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Представленный Вами способ применим только к непрерывному выделению. При выделении строк 2-4 и 8-10, допустим, и запуска макроса, вылетает ошибка

"А пожалуйста!" (с) О чем говорят мужчины - добавим цикл по областям (areas):
[vba]
Код
Sub test2()

     Dim selrows() As Range
     Dim area      As Range
     Dim row       As Range
     Dim i         As Integer
     Dim cnt       As Integer
         
     For Each area In Selection.Areas
         cnt = cnt + area.Rows.Count
     Next
     ReDim Preserve selrows(1 To cnt)
      
     For Each area In Selection.Areas
         For Each row In area.Rows
             i = i + 1
             Set selrows(i) = row
         Next
     Next
      
     For i = 1 To cnt
         selrows(i).Insert Shift:=xlDown
     Next
      
End Sub
[/vba]

Автор - Gustav
Дата добавления - 31.03.2014 в 14:10
AlexM Дата: Понедельник, 31.03.2014, 14:22 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4517
Репутация: 1130 ±
Замечаний: 0% ±

Excel 2003
Может быть так подойдет?[vba]
Код
Sub Macros()
Dim iCell As Range
For Each iCell In Selection.Rows
       Rows(iCell.row).EntireRow.Insert
Next
[A1].Select
End Sub
[/vba]
К сообщению приложен файл: ___.xls (19.5 Kb)



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.


Сообщение отредактировал AlexM - Понедельник, 31.03.2014, 14:48
 
Ответить
СообщениеМожет быть так подойдет?[vba]
Код
Sub Macros()
Dim iCell As Range
For Each iCell In Selection.Rows
       Rows(iCell.row).EntireRow.Insert
Next
[A1].Select
End Sub
[/vba]

Автор - AlexM
Дата добавления - 31.03.2014 в 14:22
Gustav Дата: Понедельник, 31.03.2014, 15:01 | Сообщение № 8
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
AlexM, что-то у меня что этот вариант, что предыдущий (с минус 1) уходят в глубокий зацикл. Причем, остановить по Ctrl-Break не сразу получается... Я вначале тоже пытался нечто подобное сваять, но отказался именно из-за аналогичного зацикливания...

P.S. А пример выполняется без проблем (первый раз), потому что выделение там было создано по одной строке :) Если выделить в одной области больше одной строки, то начинается... :(


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 31.03.2014, 15:24
 
Ответить
СообщениеAlexM, что-то у меня что этот вариант, что предыдущий (с минус 1) уходят в глубокий зацикл. Причем, остановить по Ctrl-Break не сразу получается... Я вначале тоже пытался нечто подобное сваять, но отказался именно из-за аналогичного зацикливания...

P.S. А пример выполняется без проблем (первый раз), потому что выделение там было создано по одной строке :) Если выделить в одной области больше одной строки, то начинается... :(

Автор - Gustav
Дата добавления - 31.03.2014 в 15:01
Мурад Дата: Понедельник, 31.03.2014, 15:09 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Gustav, вы - мастер. Ваша доработка не только вставляет пустые строки перед каждой строкой выделенного диапазона, но и сохраняет формат перемещаемых ячеек.
AlexM, спасибо за старания! Но Ваш программный код не подходит. В случае непрерывного диапазона возникает ошибка бесконечности, в случае разделенных строк вставляется пустая строка один раз, затем курсор переходит в ячейку A1
 
Ответить
СообщениеGustav, вы - мастер. Ваша доработка не только вставляет пустые строки перед каждой строкой выделенного диапазона, но и сохраняет формат перемещаемых ячеек.
AlexM, спасибо за старания! Но Ваш программный код не подходит. В случае непрерывного диапазона возникает ошибка бесконечности, в случае разделенных строк вставляется пустая строка один раз, затем курсор переходит в ячейку A1

Автор - Мурад
Дата добавления - 31.03.2014 в 15:09
AlexM Дата: Понедельник, 31.03.2014, 15:38 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4517
Репутация: 1130 ±
Замечаний: 0% ±

Excel 2003
Gustav, У меня не зацикливается и несколько раз то же работает. У меня Excel2003, не думаю, что у меня нет проблем по этой причине.



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.
 
Ответить
СообщениеGustav, У меня не зацикливается и несколько раз то же работает. У меня Excel2003, не думаю, что у меня нет проблем по этой причине.

Автор - AlexM
Дата добавления - 31.03.2014 в 15:38
Gustav Дата: Понедельник, 31.03.2014, 16:00 | Сообщение № 11
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
У меня 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

     For Each row In selrows
         row.Insert xlDown
     Next

End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
У меня 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

     For Each row In selrows
         row.Insert xlDown
     Next

End Sub
[/vba]

Автор - Gustav
Дата добавления - 31.03.2014 в 16:00
Мурад Дата: Понедельник, 31.03.2014, 16:22 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Также хотел спросить Вас, правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники. Спасибо!
 
Ответить
СообщениеТакже хотел спросить Вас, правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники. Спасибо!

Автор - Мурад
Дата добавления - 31.03.2014 в 16:22
Gustav Дата: Вторник, 01.04.2014, 10:23 | Сообщение № 13
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники

Вы выбрали правильный курс саморазвития в принципе - VBA :) А кто конкретно вас с ним познакомит - не так уж и важно. Мои самые первые бумажные источники - в далеком прошлом и я не помню, как они точно называются. В Библиотеке форума есть вполне достойная подборка книг, например, здесь: http://www.excelworld.ru/index/vba/0-12 . Среди прочих там есть мне весьма симпатичная: П. Эйткен "Интенсивный курс программирования в Excel за выходные" - простенько и со вкусом (правда, почему-то перестала работать ссылка на нее...)

P.S. Вот, выковырял ссылку из HTML-кода: http://dfiles.ru/files/u51d2ndtu


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Вторник, 01.04.2014, 10:33
 
Ответить
Сообщение
правильный ли я выбрал курс саморазвития: Л.Д. Слепцова "Программирование на VBA в Microsoft Office 2010"? Посоветуйте свои источники

Вы выбрали правильный курс саморазвития в принципе - VBA :) А кто конкретно вас с ним познакомит - не так уж и важно. Мои самые первые бумажные источники - в далеком прошлом и я не помню, как они точно называются. В Библиотеке форума есть вполне достойная подборка книг, например, здесь: http://www.excelworld.ru/index/vba/0-12 . Среди прочих там есть мне весьма симпатичная: П. Эйткен "Интенсивный курс программирования в Excel за выходные" - простенько и со вкусом (правда, почему-то перестала работать ссылка на нее...)

P.S. Вот, выковырял ссылку из HTML-кода: http://dfiles.ru/files/u51d2ndtu

Автор - Gustav
Дата добавления - 01.04.2014 в 10:23
Мурад Дата: Вторник, 01.04.2014, 11:51 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
премного благодарен, Gustav!
 
Ответить
Сообщениепремного благодарен, Gustav!

Автор - Мурад
Дата добавления - 01.04.2014 в 11:51
Мурад Дата: Среда, 09.04.2014, 14:20 | Сообщение № 15
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Скажите пожалуйста. Вот я набрал код, пользуясь примером Gustav:
[vba]
Код
Sub test()
      
     Dim selrows As New Collection
     Dim row     As Range
     For Each row In Selection.Rows
         If row = пустая строка Then
         selrows.Remove row
         End If
     Next
     
End Sub
[/vba]

Каким образом сделать условие проверки строки на "пустоту", чтобы удалить разряженность?
 
Ответить
СообщениеСкажите пожалуйста. Вот я набрал код, пользуясь примером Gustav:
[vba]
Код
Sub test()
      
     Dim selrows As New Collection
     Dim row     As Range
     For Each row In Selection.Rows
         If row = пустая строка Then
         selrows.Remove row
         End If
     Next
     
End Sub
[/vba]

Каким образом сделать условие проверки строки на "пустоту", чтобы удалить разряженность?

Автор - Мурад
Дата добавления - 09.04.2014 в 14:20
Gustav Дата: Среда, 09.04.2014, 15:37 | Сообщение № 16
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Каким образом сделать условие проверки строки на "пустоту", чтобы удалить разряженность?

Извиняюсь за тавтологию, но на эту тему есть целая "готовая" тема: http://www.excelworld.ru/forum/3-48-1


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 09.04.2014, 15:41
 
Ответить
Сообщение
Каким образом сделать условие проверки строки на "пустоту", чтобы удалить разряженность?

Извиняюсь за тавтологию, но на эту тему есть целая "готовая" тема: http://www.excelworld.ru/forum/3-48-1

Автор - Gustav
Дата добавления - 09.04.2014 в 15:37
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!