Всем привет. Прошу помочь добить макрос копирования со вставкой новых строк. Файл с тем что хочу получить вложил, там есть наброски макросов, но до конца они работу не доводят.
Поясню суть зачем это нужно: - часто приходится вставлять в готовые таблицы некие статичные данные, которые с двух сторон окружены ВПР-ами и после вставки формулы просто протягиваются. Не добавляем в конец, потому что так проще потом протянуть и не надо менять диапазоны в формулах и сводных.
Пытаюсь сделать универсальное решение - из любого места скопировал, в любое вставил. Решение делится на два этапа - одним макросом скопировал, другим вставил. Если можно обойтись без спец. копирования - будет круто.
Кажется я понял о чем шла речь, если с первого столбца листа тянуть будет косяк, Offset со старой версии забыл убрать. Ваш код пригодился, сваял с него версию для ленивых, правда работает пока криво, завтра надо, на свежую голову.
Код
Sub FillDown2()
lstr = 0
rng2 = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
For Each st In ActiveSheet.UsedRange.Columns
Set Rng = ActiveCell.CurrentRegion
If Rng.Cells.Count > 1 Then
n = Rng.Cells(1).Row + rng2 - ActiveCell.Row
r = Cells(Rows.Count, st.Column).End(xlUp).Row
lstr = IIf(lstr > r, lstr, r)
End If
If r < lstr Then
Cells(r, st.Column).AutoFill Destination:=Range(Cells(r, st.Column), Cells(lstr, st.Column)), Type:=xlFillValues
End If
Next st
End Sub
Ваш код тоже превосходно работает, но тестируя свой, подобной ошибки не заметил, хоть две строки выдели, хоть 10. Видимо потому что гоняю на данных с формулами, протягивание собственно для них и предназначено. Да и нет такого рефлекса у пользователей, выбирать по две строки, всегда она
Теперь осталось додумать мегаумное протягивание - так чтобы встав на любой ячейке в UsedRange макрос протянул все столбцы в нем (справа и слева) по самому длинному столбцу, без всяких выделений. Для совсем ленивых ж.....
Желающих оптимизировать что-то нет. Ну и ладно. Тестируя умное автозаполнение в уже усовершествованном виде нашел еще баг. Так как используется CurrentRegion очень плохо оно тянет по одиночным столбцам с разрывами. Вот в примере на скрине протянет только до 29908, а не до 29916:
В итоге пришел в выводу, что по настоящему умным оно будет тогда, когда будет определять самый длинный заполненный столбец в UsedRange и тянуть до его конца.Плюс тянуть нужно именно по заполненному, а не до конца UsedRange, где могут быть "пустые" строки. В итоге, с подсказки коллег по нюансу, получилось это:
Код
Sub SmartFillDown()
'Умное автозаполнение вниз
Dim rng As Range, n As Long
rng2 = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Set rng = ActiveCell.Offset(0, -1).CurrentRegion
If rng.Cells.Count > 1 Then
n = rng.Cells(1).Row + rng2 - ActiveCell.Row
On Error Resume Next
For Each cell In Selection
cell.AutoFill Destination:=cell.Resize(n, 1), Type:=xlFillValues
Next
End If
End Sub
Всем привет. Сегодня пришлось вплотную поработать с умным протягиваем, оказалось что оно не очень умное, т.к. в случае выделения нескольких смежных ячеек и желания протянуть их пачкой, оно протягивает только один столбец (крайний левый). Немного дополнил код, прошу дать оценку - нет ли каких рисков в нем. Если кто дополнит чем-нибудь полезным, можно реализовать в след. версии.
Код
Sub SmartFillDown()
'Умное автозаполнение вниз
Dim rng As Range, n As Long
Set rng = ActiveCell.Offset(0, -1).CurrentRegion
If rng.Cells.Count > 1 Then
n = rng.Cells(1).Row + rng.Rows.Count - ActiveCell.Row
On Error Resume Next
For Each cell In Selection
cell.AutoFill Destination:=cell.Resize(n, 1), Type:=xlFillValues
Next
End If
End Sub
Поскольку это где-то тут обсуждалось в открытом виде, надеюсь права автора не нарушаю
Отсутствие отмены действий макросов (без танцев с бубном). В бесплатно-простяцком OOO и LiO возможна отмена на точно такое же число шагов, как и для ручных операций, без лишних строчек кода.
Если пустые считать надо, тогда я согласен, оптимизация навредит. Но опционально аргумент все же можно ввести - считать непустые, и работать быстрее будет и Excel в ступор не уйдет, если пользователь захочет выделить пару-десяток столбцов.
Ох, как с вами сложно. Да найдет моя доработка 100500 строку, только перебирать она будет не миллион, а только ячейки с данными. Я не использую UsedRange.
Там логика функции - просуммировать/подсчитать кол-во ячеек выделенных цветом. То нужно или можно целый столбец это понятно, просто обходчик должен быть только по непустым ячейкам. Как там, так и там. Считать, а тем более суммировать пустые нелогично. Так вот функция там сперва начинает обход, а потом задает ограничения, а надо наоборот. В итоге если в столбце 5 заполненных ячеек - перебирает весь миллион.
Когда делаю в функции диапазон во весь столбец, Excel уходит в аут. Код смотрел - там перебор начинается раньше чем задаются ограничения, а надо бы наоборот. Сам то я поправил, но для других в новых версиях все же стоит оптимизировать.
Пишу надстройку для финансово-бухгалтерского отдела. Всякие плюшки, удобства. Брал за основу PLEX, от него осталось 20%, остальное выбросил за ненадобностью. Исписал три доп. вкладки ленты, 60 логистических, финансовых и общих формул. Добавил всякие полезности в почти во все контекстные меню типа "работай отдыхая"...Но вот идеи кончились.....((((
Подкиньте идей по плюшкам, так сказать макросам общего назначения, которые помогут одолеть рутину...
В 2010 есть стандартная функция сортировки, которая способна возвращать ранги, а в 2007 можно как-то исхитрится? Пробовал создавать вычисляемые поля с этой функцией, но эксель ругается и считать отказывается.
Sub TestEsc()
On Error GoTo CancelHandler
Application.EnableCancelKey = xlErrorHandler For i = 1 To 100000
Cells(i, 1) = "w"
Next
CancelHandler:
Application.EnableCancelKey = xlInterrupt
If Err.Number = 18 Then MsgBox "Вы нажали кнопку ESC или CTRL + BREAK"
End Sub