Страницы: 1
RSS
Отладка макроса добавления строк
 
Через макрорекордер записал макрос, который добавляет нужный столбец пустые строки для последующего заполнения. Таким образом пополняется диапазон переменных для выпадающего списка. Нужна доработка, пока не знаю как то сделать:  
1. Добавление заданного кол-ва строк;  
2. Ссылка не на предыдущий, а на конкретный лист (ИМЯ).  
 
Исходный код такой:    
Sub Добавление ()  
   ActiveSheet.Previous.Select  
   Range("B1").Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlUp).Select  
   ActiveWindow.SmallScroll Down:=-6  
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove  
   Range("C1").Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlDown).Select  
   Selection.End(xlUp).Select  
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove  
End Sub
 
Sub dob2()  
Dim iLastRow As Long, i As Long  
iLastRow = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row  
For i = 1 To 5  
Sheets(2).Rows(iLastRow).Insert Shift:=xlDown  
Next  
End Sub  
 
Тут и лист - Sheets(2), и количество For i = 1 To 5
 
Можно так, почти в одну строку всё записать (практически тот же код):  
 
Sub dob3()  
Dim i As Long  
For i = 1 To 5: Sheets(2).Rows(Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row).Insert Shift:=xlDown: Next  
End Sub
 
Или так, в одну:  
 
Sub dob4()  
Sheets(2).Rows(Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row).Resize(5).Insert Shift:=xlDown  
End Sub
 
Игорь, привет. Это ты с кем сейчас разговаривал?:-) Поздравляю, знаешь за что.
Я сам - дурнее всякого примера! ...
 
Спасибо :)  
Да так, от жары не сразу лучший вариант находится...
 
У тебя от жары, у меня от усталости - всякое бывает. Но мы, вроде, отлично помогаем друг-другу. Дополняем, так сказать. Мне это нравится.:-)
Я сам - дурнее всякого примера! ...
 
Все здорово, спасибо за помощь. Но не совсем то.  
Креплю пример: здесь необходимо добавить заданное кол-во строк (видимо при помощи ) в нужный диапазон. Указанные диапазоны поименованы и сделаны спонтом динамическими. т.е. добавлять нужно не строки целиком, а фактически ячейки в данные диамазоны: диапазон "ФИО" и "№Группы". После корректного добавления укаханного кол-ва ячеек, пополняется список Номеров Групп, выбирая который на соседнем листе мы получаем список сотрудников Группы. УСЁ!.  
Пожалуйста, еще немного помощи......
 
Непонятно, где задано количество добавляемых строк? Всегда надо 5 добавить в самый низ? Легко - замените 2 на 4:  
Sheets(2).Rows(Sheets(2).Cells(Rows.Count, 4).End(xlUp).Row).Resize(5).Insert Shift:=xlDown  
И вообще как этот процесс должен выглядеть целиком?  
Можно, например, встать на ячейку, ниже которой надо добавлять строки, запустить код, заполнить инпутбокс числом, и столько строк ниже добавится. Так?  
И почему нельзя добавлять сроки целиком? На листе ведь больше ничего нет, чему бы это мешало. А диапазоны расширяются. Оба.
 
Хотя с другой стороны - зачем это всё нужно?  
Ведь потом эти списки надо заполнять. Если вручную - заполните их на стороне, скопируйте и вставьте внутрь со сдвигом вниз. Никаких макросов не надо, стандартный функционал.
 
Я бы по-другому сделал: пользователь дописывает или удаляет значения в диапазонах имен, потом дает команду "обновить имена".  
Ессно, обновляются только имена, ссылающиеся на данный лист.  
Замечен небольшой глюк: после работы макроса не работает выпадающий список имен на этом листе. На другом работает.
 
Что-то вроде тогда так надо:  
 
   Application.Goto Reference:="Номер_группы"  
   Range(Selection, Selection.End(xlDown)).Select  
   ActiveWorkbook.Names.Add Name:="Номер_группы", RefersToR1C1:=Selection  
 
Может без selection можно сделать?
 
Ложная тревога :)  
Просто после нажатия на кнопку фокус остается на кнопке. Если кликнуть на листе, фокус переходит к листу и выпадающий список имен работает.  
Можно запретить кнопке перехватывать фокус - прописать в свойствах или в макросе, но тогда эффект будет только после второго нажатия:  
 
Private Sub CommandButton1_Click()  
Dim nm As Name, r As Range  
CommandButton1.TakeFocusOnClick = False   'запрет перехвата фокуса  
On Error GoTo err_range  
For Each nm In Me.Parent.Names  
   Set r = nm.RefersToRange  
   If r.Parent.Name = Me.Name Then       'проще и, наверно, быстрее чем Intersect  
       Set r = Range(r.Cells(1), Cells(Me.Rows.Count, r.Column).End(xlUp))  
       nm.RefersTo = "=" & r.Address  
   End If  
resume_here:  
Next  
Exit Sub  
 
err_range:  
Resume resume_here  
End Sub
 
Извиняюсь, я не тот код смотрел, в модуле...
 
Да, но это только для конкретной задачи. Если на листе есть другие имена, которые не надо продлевать? Их вероятно надо заносить в исключения.
 
Это я извиняюсь, оставил в книге дерьмокод макрорекордера :)  
Я просто первый раз работал с Names.  
А с другими именами все в порядке - если к ним ничего не дописано и не удалено, они не изменятся.  
Единственное требование - ниже диапазона имени в столбце нельзя ничего писать, т.к. новым диапазоном имени считается диапазон от первой ячейки старого диапазона до последней непустой ячейки в этом столбце.  
 
В общем вот.
 
спасибо за живой интерес проявленный к данной теме. В действительности в примере представлен лишь фрагмент данных для конкретной задачи.  
 
На листе Справочник в столбцах будут лежать разные данные, по этому нельзя вставлять строки целиком и лишь ячейки.  
 
Полагаю что идея использовать инпутбокс для точного определения кол-ва вставляемых ячеек была актуальной.
 
А мне кажется, что идея Казанского лучше - одним кликом обновляются все именные диапазоны этого листа. В любой столбец дописали данные, нажали кнопку - готово. Только следить, чтобы под этим диапазоном ничего небыло написано. Зато между и выше - пишите, что угодно.  
Не надо отслеживать, какой код запускать (или вводить название диапазона). Не надо вводить число добавляемых ячеек. Одна кнопка! Можно вообще на изменение листа повесить.
 
Друзья помогите не могу разобраться    
Надо добавить строку макросом если новое значение    
Написал макрос и чето он у меня не идет
 
Tikr, какое отношение имеет ваш вопрос к этой старой теме?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Саш, а что не так? :-)
 
эээ... просто интересно :)  
если чел поюзал поиск (оч.хорошо!), нашел похожую тему (отлично!!), попробовал разобраться-переделать-приспособить (белиссимо!!!), не получилось - спрашивает.  
 
здесь я этого не вижу.  
поэтому и спросил.  
 
пс. "потому что тоже про Excel" - тоже ответ :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
На мой взгляд всё нормально: тема "Отладка макроса добавления строк", у автора та же проблема... Не придирайся с утра :-)
 
окей :)  
 
второй цикл:  
For r = k To 2 Step -1  
 If Cells(r, 4) <> Cells(r - 1, 4) Then Rows®.Insert Shift:=xlDown  
Next r  
 
пс. а с Case'ом вы перемудрили :)  
посмотрите его синтаксис в справке.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Спасибо за ответ, все работает  
Оказывается все так просто, почему я сам не догадался ))
 
потому что все с опытом приходит. )  
я, к примеру, тоже только на этом форуме узнал, что вместо вашего первого цикла можно (и лучше!) писать так:  
 
k = [d1].End(xlDown).Row
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Страницы: 1
Читают тему
Наверх