Макрос для автозаполнения ячеек 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 шт?

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

Содержание

  • Автозаполнение в VBA
  • Автозаполнение с использованием возрастающих чисел
  • Автозаполнение с использованием месяцев
  • Автозаполнение с использованием xlFillCopy
  • Автозаполнение с использованием xlFlashFill

В этой статье показано, как использовать автозаполнение в VBA.

Автозаполнение — отличный инструмент в Excel, когда данные являются повторяющимися или последовательными (например, дни недели, даты, месяцы года и т. Д.). Обычно мы заполняем первую пару ячеек необходимыми данными, а затем используем автозаполнение для копирования необходимых данных в выбранный диапазон.

Все это можно сделать с помощью макроса VBA.

Автозаполнение с использованием возрастающих чисел

Во-первых, в нашем коде мы можем объявить две переменные Range.

Selection1 — это диапазон данных для автозаполнения, например 1 и 2.

Selection2 — это весь диапазон для автозаполнения, это включает первый диапазон плюс пробелы для автозаполнения.

Затем мы используем метод AutoFill, чтобы заполнить второй диапазон выбора.

123456789101112131415 Публичная подписка MyAutoFill ()Автор easyexcel.net’Объявить переменные диапазонаВыбор яркости 1 как диапазонВыбор затемнения 2 как диапазон’Установить переменные диапазона = их соответствующие диапазоныУстановить selection1 = Sheet1.Range («A1: A2»)Установить selection2 = Sheet1.Range («A1: A12»)’Автозаполнениеselection1.AutoFill Destination: = selection2Конец подписки

Затем мы можем запустить макрос для диапазона автозаполнения (A1: A12).

Когда мы используем метод автозаполнения, мы можем выбрать тип автозаполнения, которое мы хотим выполнить. В приведенном выше примере мы не указали тип автозаполнения, что означает, что использовался тип по умолчанию — в данном случае увеличивая числа на 1 в каждой строке.

Автозаполнение с использованием месяцев

Макрос для автозаполнения с использованием месяцев почти идентичен макросу, который используется для приращения чисел, за одним важным исключением.

1234567891011 Public Sub AutoFillMonths ()Автор easyexcel.net’Объявить переменные диапазонаВыбор яркости 1 как диапазонВыбор затемнения 2 как диапазон’Установить переменные диапазона = их соответствующие диапазоныУстановить selection1 = Sheet1.Range («A1: A2»)Установить selection2 = Sheet1.Range («A1: A12»)’Автозаполнение месяцевНазначение автозаполнения: = selection2, Type: = xlFillMonthsКонец подписки

Когда мы указываем тип автозаполнения, нам предоставляется выбор из нескольких констант Excel. Если мы не укажем это значение, Excel определит тип данных для заполнения из исходных данных.

Однако Excel может выбирать стандартные серии, такие как месяцы, дни недели и инкрементные числа, без необходимости использовать аргумент Тип.

Автозаполнение с использованием xlFillCopy

Если мы хотим использовать макрос автозаполнения для копирования информации в новые ячейки, мы можем использовать константу xlFillCopy.

1234567 Общедоступная подпрограмма AutoFillCopy ()Выбор затемнения1 как диапазонВыбор затемнения2 как диапазонУстановите Selection1 = Sheet1.Range («A1: A1»)Установите Selection2 = Sheet1.Range («A1: A12»)Selection1.AutoFill Назначение: = Selection2, Тип: = xlFillCopyКонец подписки

Запуск этого макроса скопирует данные из диапазона («A1») вниз в диапазон («A1: A12»), а не автоматически заполнит ячейки последующими месяцами с «января».

Автозаполнение с использованием xlFlashFill

Когда нам нужно преобразовать текст в столбцы в Excel, мы можем либо использовать параметр «Текст в столбцы», либо параметр, называемый «Flash Fill». Это чрезвычайно полезно в VBA.

Возьмем для примера следующие данные:

Мы можем ввести фамилию «Толли» в ячейку B2, а затем использовать макрос для Flash-заполнения остальных данных.

1234567 Подложка FlashFill ()Выбор затемнения1 как диапазонВыбор затемнения2 как диапазонУстановите Selection1 = Range («B2: B2»)Установить Selection2 = Range («B2: B15»)Selection1.AutoFill Назначение: = Selection2, Тип: = xlFlashFillКонец подписки

Затем мы можем повторить это для столбцов C, D и E, чтобы получить оставшиеся данные.

1234567891011 Установить Selection1 = Range («C2: C2»)Установить Selection2 = Range («C2: C15»)Selection1.AutoFill Назначение: = Selection2, Тип: = xlFlashFillУстановить Selection1 = Range («D2: D2»)Установить Selection2 = Range («D2: D15»)Selection1.AutoFill Назначение: = Selection2, Тип: = xlFlashFillУстановить Selection1 = Range («E2: E2»)Установите Selection2 = Range («E2: E15»)Selection1.AutoFill Назначение: = Selection2, Тип: = xlFlashFill

Затем каждый столбец заполнится соответствующими данными на основе значения в строке 2.

Вы поможете развитию сайта, поделившись страницей с друзьями

Понравилась статья? Поделить с друзьями:
  • Макрос для word что это
  • Макрос для word удаление лишних пробелов
  • Макрос для word ссылки
  • Макрос для word скачать бесплатно
  • Макрос для word печать