Макросы excel для автозаполнения

Умное автозаполнение вниз и вправо

До сих пор иногда с улыбкой вспоминаю один из своих первых выездных корпоративных тренингов лет 10 назад.

Представьте: огромный как футбольное поле опенспейс-офис российского представительства международной FMCG-компании. Шикарный дизайн, дорогая оргтехника, дресс-код, экспаты курлыкают по углам — вот это вот все :) В одной из переговорок начинаю двухдневный тренинг продвинутого уровня по текущей тогда версии Excel 2003 для 15 ключевых сотрудников экономического департамента вместе с их руководителем. Знакомимся, расспрашиваю их о бизнес-задачах, проблемах, прошу показать несколько типовых рабочих файлов. Показывают километровой длины выгрузки из SAP, простыни отчетов, которые они по этому всему делают и т.д. Ну, дело знакомое — мысленно прикидываю темы и тайминг, подстраиваюсь под аудиторию. Краем глаза замечаю, как один из участников, демонстрируя кусочек своего отчета, терпеливо тянет ячейку с формулой вниз за черный крестик в правом нижнем углу на несколько тысяч строк, потом проскакивает с лету конец таблицы, тянет обратно и т.д. Не выдержав, прерываю его кёрлинг мышью по экрану и показываю двойной щелчок по черному крестику, объясняя про автозаполнение вниз до упора. 

Вдруг понимаю, что в аудитории подозрительно тихо и все как-то странно на меня смотрят. Незаметно окидываю себя взглядом где могу — все ОК, руки-ноги на месте, ширинка застегнута. Мысленно отматываю назад свои последние слова в поисках какой-нибудь жуткой оговорки — не было ничего криминального, вроде бы. После этого главный в группе молча встает, жмет мне руку и с каменным лицом говорит: «Спасибо, Николай. На этом тренинг можно закончить.»

Ну, короче говоря, выяснилось, что никто из них не имел понятия про двойной щелчок по черному крестику и автозаполнение. Как-то исторически так сложилось, что некому им было показать такую простую но нужную штуку. Тянули всем отделом формулы вручную на тысячи строк, бедолаги. И тут я. Сцена маслом. Руководитель отдела потом очень просил название их компании никому не озвучивать :)

Несколько раз потом были похожие ситуации, но только с отдельными слушателями — большинство сейчас эту функцию, конечно, знает. 

smart-autofill2.pngВопрос в другом. После первой радости от освоения столь прекрасной функции большинство пользователей доходит до понимания того, что у автоматического копирования формул двойным щелчком по черному кресту (маркеру автозаполнения) есть при всех положительных моментах и отрицательные:

  • Копирование не всегда происходит до конца таблицы. Если таблица не монолитная, т.е. в соседних столбцах есть пустые ячейки, то не факт, что автозаполнение сработает до конца таблицы. Скорее всего процесс остановится на ближайшей пустой ячейке, не дойдя до конца. Если ниже по столбцу есть занятые чем-то ячейки, то автозаполнение остановится на них совершенно точно.
  • При копировании портится дизайн ячеек, т.к. по-умолчанию копируется не только формула, но еще и формат. Для исправления надо щелкать по кнопке параметров копирования и выбирать Только значения (Fill without format).
  • Не существует быстрого способа также удобно протянуть формулу не вниз, а вправо, кроме как тянуть вручную. Двойной щелчок по черному крестику — это только вниз.

Давайте попробуем исправить эти недостатки с помощью простого макроса.

Нажмите сочетание клавиш левый Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer). Вставьте новый пустой модуль через меню Insert — Module и скопируйте туда текст этих макросов:

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
        ActiveCell.AutoFill Destination:=ActiveCell.Resize(n, 1), Type:=xlFillValues
    End If
End Sub

Sub SmartFillRight()
    Dim rng As Range, n As Long
    Set rng = ActiveCell.Offset(-1, 0).CurrentRegion
    If rng.Cells.Count > 1 Then
        n = rng.Cells(1).Column + rng.Columns.Count - ActiveCell.Column
        ActiveCell.AutoFill Destination:=ActiveCell.Resize(1, n), Type:=xlFillValues
    End If
End Sub

Такие макросы:

  • умеют заполнять не только вниз (SmartFillDown), но и вправо (SmartFillRight)
  • не портят формат ниже- или справа стоящих ячеек — копируется только формула (значение)
  • игнорируют пустые соседние ячейки и копирование происходит именно до конца таблицы, а не до ближайшего разрыва в данных или первой занятой ячейки.

Для пущего удобства можно назначить этим макросам сочетания клавиш, используя кнопку Макросы — Параметры (Macros — Options) там же на вкладке Разработчик (Developer). Теперь достаточно будет ввести нужную формулу или значение в первую ячейку столбца и нажать заданное сочетание клавиш, чтобы макрос автоматически заполнил весь столбец (или строку):

smart-autofill.gif

Красота.

P.S. Частично проблема с копированием формул до конца таблицы была решена в Excel 2007 с появлением «умных таблиц». Правда, не всегда и не везде они уместны. И вправо Excel самостоятельно копировать так и не научился.

Ссылки по теме

  • Что такое макросы, как их использовать, где брать код на Visual Basic и куда его вставлять.
  • Умные таблицы в Excel 2007-2013
  • Копирование формул без сдвига ссылок

Автозаполнение ячеек в заданном диапазоне с помощью метода Range.AutoFill. Синтаксис, параметры, примеры автозаполнения из кода VBA Excel.

Определение

Определение метода Range.AutoFill:

AutoFill — это метод объекта Range, который выполняет автозаполнение ячеек в указанном диапазоне.

Синтаксис

Синтаксис метода Range.AutoFill:

Expression.AutoFill (Destination, Type)

Expression — выражение (переменная), возвращающее объект Range.

Параметры

Параметры метода Range.AutoFill:

Параметр Описание
Destination Диапазон ячеек, который необходимо заполнить. В него должен быть включен исходный диапазон (Expression). Обязательный параметр.
Type Константа из коллекции XlAutoFillType, задающая тип автозаполнения. Необязательный параметр.

Константа из коллекции XlAutoFillType указывает, как должен быть заполнен целевой диапазон (Destination) в зависимости от содержимого диапазона исходных данных (Expression). По умолчанию используется константа xlFillDefault (0), когда приложение Excel само определяет значения и форматы, используемые для заполнения целевого диапазона.

Примеры с Range.AutoFill

Примеры автозаполнения целевых диапазонов из кода VBA Excel с помощью метода AutoFill объекта Range.

Пример 1

Автозаполнение указанного диапазона (Destination), состоящего из нескольких строк и столбцов, данными одной ячейки (Expression) в зависимости от ее расположения в целевом диапазоне:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Sub Primer1()

    ‘Удаляем границы ячеек, если уже были запуски кода

    Range(«A1:E20»).Borders.LineStyle = xlNone

    ‘Ячейка Expression в верхнем левом углу Destination

    Range(«A1») = 111

    Range(«A1»).AutoFill Range(«A1:E5»)

    Range(«A1:E5»).Borders(xlEdgeBottom).LineStyle = True

    ‘Ячейка Expression в нижнем левом углу Destination

    Range(«A10») = 222

    Range(«A10»).AutoFill Range(«A6:E10»)

    Range(«A6:E10»).Borders(xlEdgeBottom).LineStyle = True

    ‘Ячейка Expression в верхнем правом углу Destination

    Range(«E11») = 333

    Range(«E11»).AutoFill Range(«A11:E15»)

    Range(«A11:E15»).Borders(xlEdgeBottom).LineStyle = True

    ‘Ячейка Expression в нижнем правом углу Destination

    Range(«E20») = «444»

    Range(«E20»).AutoFill Range(«A16:E20»)

End Sub

Целевые диапазоны для наглядности разделены горизонтальными линиями. Ячейка (Expression) может находиться только по углам целевого диапазона (Destination), иначе будет сгенерирована ошибка.

Пример 2

Горизонтальное автозаполнение указанного диапазона (Destination) последовательностью чисел, месяцев и дней недели:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Sub Primer2()

    ‘Удаляем границы ячеек, если уже были запуски кода

    Range(«A1:L4»).Borders.LineStyle = xlNone

    ‘Автозаполнение строки единицами

    Range(«A1») = 1

    Range(«A1»).AutoFill Range(«A1:L1»)

    Range(«A1:L1»).Borders(xlEdgeBottom).LineStyle = True

    ‘Автозаполнение строки последовательностью натуральных чисел

    Range(«A2») = 1

    Range(«B2») = 2

    Range(«A2:B2»).AutoFill Range(«A2:L2»)

    Range(«A2:L2»).Borders(xlEdgeBottom).LineStyle = True

    ‘Одновременное заполнение одной строки последовательностью

    ‘месяцев и второй строки — днями недели

    Range(«A3») = «Январь»

    Range(«A4») = «Понедельник»

    Range(«A3:A4»).AutoFill Range(«A3:L4»)

End Sub

Пример 3

Вертикальное автозаполнение указанного диапазона (Destination) последовательностью дат:

Sub Primer3()

    ‘Автозаполнение столбца датами, начиная с текущей

    Range(«A1») = Date

    Range(«A1»).NumberFormat = «DD.MM.YYYY»

    Range(«A1»).AutoFill Range(«A1:A20»)

    ‘Автозаполнение столбца датами в обратном порядке

    Range(«B20») = Date

    Range(«B20»).NumberFormat = «DD.MM.YYYY»

    Range(«B20»).AutoFill Range(«B1:B20»)

End Sub


I am trying to use macro recorder in Excel to record a macro to fill down a column of cells, however because the fill down each time is a different number of cells it either fills down to short or too long and this seems to be because the macro identifies the cell range and its fixed.

Is there anyway that I can get it to fill down to the last populated neighbouring cell. E.g. AutoFill down column E until it reaches the last populated row in column D. I have looked at some examples on here but the code all looks very different so not sure if it can be done with macro recorder or I have to get someone to write some code or is it something that has to be done manually?

This is the code that I have in the macro.

ActiveCell.FormulaR1C1 = _
        "=IF(MONTH(RC[-1])>3,"" ""&YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1])+1,2),"" ""&YEAR(RC[-1])-1&""-""&RIGHT(YEAR(RC[-1]),2))"
    Selection.AutoFill Destination:=Range("E2:E1344")
    'Selection.AutoFill Destination:=Range("E2:E1344")
    Range("E2:E1344").Select

If anyone can help i’d be extremely grateful

pnuts's user avatar

pnuts

58k11 gold badges85 silver badges137 bronze badges

asked Aug 28, 2013 at 12:38

user2725363's user avatar

Untested….but should work.

Dim lastrow as long

lastrow = range("D65000").end(xlup).Row

ActiveCell.FormulaR1C1 = _
        "=IF(MONTH(RC[-1])>3,"" ""&YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1])+1,2),"" ""&YEAR(RC[-1])-1&""-""&RIGHT(YEAR(RC[-1]),2))"
    Selection.AutoFill Destination:=Range("E2:E" & lastrow)
    'Selection.AutoFill Destination:=Range("E2:E"& lastrow)
    Range("E2:E1344").Select

Only exception being are you sure your Autofill code is perfect…

answered Aug 28, 2013 at 12:46

Vasim's user avatar

VasimVasim

3,0123 gold badges34 silver badges56 bronze badges

3

This example shows you how to fill column B based on the the volume of data in Column A. Adjust «A1» accordingly to your needs. It will fill in column B based on the formula in B1.

Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 1).Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown

answered Aug 28, 2013 at 12:49

xQbert's user avatar

xQbertxQbert

34.5k2 gold badges40 silver badges62 bronze badges

2

ActiveCell.Offset(0, -1).Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 1).Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown

answered Aug 13, 2014 at 16:17

chris gagnon's user avatar

Студворк — интернет-сервис помощи студентам

Здравствуйте, не могу разобраться в весьма простой с виду проблеме.
Создаю для неопытных, еще более не опытных чем я, пользователей не хитрое поле ввода данных. Данные представляют собой строки с цифрами, всего 74 так называемых ПКП. Каждая ПКП включает в себя 6 строк 3 из которых должен в ручную заполнить заполняющий, а остальное при помощи макроса автозаполняется формулами.

кнопка макроса находится внизу «CB3….», в верхней части страницы приведено описание используемых формул.
Проблема 1.
на каждом ПКП всегда разное количество столбцов, но не больше 200, исходя из опыта (в целом не важно сколько их). По этому при обычном заполнении формулами строки ячеек, данные для которых отсутствуют, возникает #ЗНАЧ!, это мешает при дальнейшей работе. По не понятной мне причине для 2х заполняемых строк все работает, а для 3й, почему-то нет, все равно выскакивает объявление. (см. приложенный фаил)

Проблема 2.
Алгоритм макроса написан для ПКП 1, как задать повторение алгоритма для заполнения оставшихся 73 шт?

Буду очень благодарен за помощь или за полезные ссылки или обучающие материалы по теме.

Макросы для автозаполнения формы

zyoger

Дата: Понедельник, 21.02.2022, 10:19 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Всем привет!!
Прошу помощи с макросами. Макросы простые. Требуется заполнить ячейки согласно условию (проставить дату, добавить значение). Подробная информация указана в файле в примечаниях. Заранее спасибо.

К сообщению приложен файл:

8393159.xlsx
(16.1 Kb)

 

Ответить

Nic70y

Дата: Понедельник, 21.02.2022, 11:20 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 8136


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

Sub number___()
    u = Cells(Rows.Count, «a»).End(xlUp).Row
    v = Range(«b» & u).Value
    If v = «» Then
        Range(«b» & u) = 52
    Else
        MsgBox «Нет данных в A!»
    End If
End Sub
Sub date___()
    u = Cells(Rows.Count, «a»).End(xlUp).Row
    v = Range(«c» & u).Value
    If v = «» Then
        Range(«c» & u) = Format(Date, «dd.mm.yyyy»)
    Else
        MsgBox «Нет данных в A!»
    End If
End Sub

[/vba]конечную дату не понял

К сообщению приложен файл:

15.xlsm
(22.8 Kb)


ЮMoney 41001841029809

 

Ответить

zyoger

Дата: Понедельник, 21.02.2022, 11:39 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Nic70y, спасибо, практически то что нужно. Только не совсем так заполняет как надо. Заполняется только последняя строка, а надо что бы все строки были заполнены (скрин во вложении).
По поводу конечной даты, она должна рассчитываться следующим образом:
если «тип резерва (столбец Е)» = 2, то дата должна быть «31.12.2049»
если «тип резерва (столбец Е)» = 3, то дата должна быть «текущая дата + 3 месяца» (если сегодня 21.02.2022 то итоговая дата должна быть: 21.05.2022)
если «тип резерва (столбец Е)» = 22, то дата должна быть «текущая дата + 1 месяца» (если сегодня 21.02.2022 то итоговая дата должна быть: 21.03.2022)
если «тип резерва (столбец Е)» = 99, то дата должна быть «текущая дата + 2 месяца» (если сегодня 21.02.2022 то итоговая дата должна быть: 21.04.2022)

К сообщению приложен файл:

3491864.png
(117.3 Kb)

 

Ответить

zyoger

Дата: Понедельник, 21.02.2022, 11:58 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Nic70y, еще парочка вопросов :)
1. Можно ли сделать макрос который разные форматы ячеек в столбце А меняет на один, а именно «общий, без форматирования». Данные которые приходится копировать в столбец А бывают «Число в этой ячейке отформатировано как текст, или перед ним стоит апостроф.»
2. И макрос который будет сохранять данный файл на рабочем столе с именем «Шаблон Gold_’текущая дата. xlsx'», в формате xlsx (без поддержки макросов).

 

Ответить

Nic70y

Дата: Понедельник, 21.02.2022, 12:08 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 8136


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

zyoger, а зачем три макроса, может одним обойдемся?
[vba]

Код

Sub u__()
    Application.ScreenUpdating = False
    u = Cells(Rows.Count, «a»).End(xlUp).Row
    a = Date
    f = Year(a)
    g = Month(a)
    h = Day(a)
    For Each c In Range(«a2:a» & u)
        If c <> «» And c.Offset(0, 1) = «» Then
            c.Offset(0, 1) = 52
        End If
        If c <> «» And c.Offset(0, 2) = «» Then
            c.Offset(0, 2) = Format(a, «dd.mm.yyyy»)
        End If
        If c <> «» And c.Offset(0, 3) = «» Then
            x = c.Offset(0, 4)
            If x = 2 Then c.Offset(0, 3) = Format(DateSerial(2049, 12, 31), «dd.mm.yyyy»)
            If x = 3 Then c.Offset(0, 3) = Format(DateSerial(f, g + 3, h), «dd.mm.yyyy»)
            If x = 22 Then c.Offset(0, 3) = Format(DateSerial(f, g + 1, h), «dd.mm.yyyy»)
            If x = 99 Then c.Offset(0, 3) = Format(DateSerial(f, g + 2, h), «dd.mm.yyyy»)
        End If
        Range(«a» & c.Row).NumberFormat = «General»
    Next
    Application.ScreenUpdating = True
End Sub

[/vba]

К сообщению приложен файл:

15-1-.xlsm
(23.9 Kb)


ЮMoney 41001841029809

 

Ответить

zyoger

Дата: Понедельник, 21.02.2022, 12:34 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Nic70y, Да согласен, логичнее сделать одним макросом.
Подскажите, возможно ли еще реализовать следующее:
1. Можно ли сделать макрос который разные форматы ячеек в столбце А меняет на один, а именно «общий, без форматирования». Данные которые приходится копировать в столбец А бывают «Число в этой ячейке отформатировано как текст, или перед ним стоит апостроф.»
2. И макрос который будет сохранять данный файл на рабочем столе с именем «Шаблон Gold_’текущая дата. xlsx'», в формате xlsx (без поддержки макросов).

 

Ответить

Nic70y

Дата: Понедельник, 21.02.2022, 13:19 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 8136


Репутация:

1999

±

Замечаний:
0% ±


Excel 2010

добавьте
[vba]

Код

        Range(«a» & c.Row).NumberFormat = «General»
        Range(«a» & c.Row) = Range(«a» & c.Row).Value

[/vba]
это уже совсем другая тема,
нужно создавать ее — новую


ЮMoney 41001841029809

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Макросов в excel по выгрузке данных
  • Макросы excel для openoffice
  • Макрос удаляющий листы excel
  • Макросов microsoft word скачать бесплатно для windows 10
  • Макросы excel для android