Excel vba макрос автоматическое заполнение таблицы из другой таблицы
Всем нам приходится - кому реже, кому чаще - повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую "рутинную составляющую" - одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.
Макрос - это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.
Способ 1. Создание макросов в редакторе Visual Basic
Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно - редактор программ на VBA, встроенный в Microsoft Excel.
- В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис - Макрос - Редактор Visual Basic(Toos - Macro - Visual Basic Editor).
- В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)
:
К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:
Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:
-
Обычные модули - используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert - Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:
Обычный макрос, введенный в стандартный модуль выглядит примерно так:
Давайте разберем приведенный выше в качестве примера макрос Zamena:
С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно.
Способ 2. Запись макросов макрорекордером
Макрорекордер - это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:
- Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу - запись останавливается.
- Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
- Если во время записи макроса макрорекордером вы ошиблись - ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) - во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.
Чтобы включить запись необходимо:
- в Excel 2003 и старше - выбрать в меню Сервис - Макрос - Начать запись(Tools - Macro - Record New Macro)
- в Excel 2007 и новее - нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)
Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:
- Имя макроса - подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
- Сочетание клавиш - будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис - Макрос - Макросы - Выполнить(Tools - Macro - Macros - Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
- Сохранить в. - здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
- Эта книга - макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
- Новая книга - макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
- Личная книга макросов - это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.
После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .
Запуск и редактирование макросов
Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или - в старых версиях Excel - через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) :
- Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
- Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
- Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.
Создание кнопки для запуска макросов
Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:
Кнопка на панели инструментов в Excel 2003 и старше
Откройте меню Сервис - Настройка (Tools - Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый "колобок" - Настраиваемую кнопку (Custom button) :
Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:
Кнопка на панели быстрого доступа в Excel 2007 и новее
Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :
Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:
Кнопка на листе
Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:
- В Excel 2003 и старше - откройте панель инструментов Формы через меню Вид - Панели инструментов - Формы (View - Toolbars - Forms)
- В Excel 2007 и новее - откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)
Выберите объект Кнопка (Button) :
Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.
Создание пользовательских функций на VBA
Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция - только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).
Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert - Module и введем туда текст нашей функции:
Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка - Функция) в категории Определенные пользователем (User Defined) :
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
Доброго времени суток!
Это моя первая сложная работа с макросами. Части поставленной задачи не могу разобрать. Помогите, пожалуйста, записать код макроса на следующую таблицу. На листах 1 и 2 есть данные, которые постоянно пополняются. На листе 3 должна формироваться таблица с объединенными данными с этих двух листов по номеру заказа. ФИО могут отличаться на этих двух листах, тогда по ячейкам в обобщенной таблице факта и плана может быть "пусто".
Еще на листе 4 есть таблица данных, из которой также по данным номера заказа будет формироваться таблица на листе 5. Из всплывающего списка в ячейке А2 будет выбираться номер заказа, и по этому номеру будет заполняться таблица. К датам легко применима формула СУММАЕСЛИ, но! К заказчику и № договора ее применить нельзя. Может быть есть другая формула, которую можно применить, или же макросом записать такое действие?
Буду благодарна Вашей помощи.
Доброго времени суток!
Это моя первая сложная работа с макросами. Части поставленной задачи не могу разобрать. Помогите, пожалуйста, записать код макроса на следующую таблицу. На листах 1 и 2 есть данные, которые постоянно пополняются. На листе 3 должна формироваться таблица с объединенными данными с этих двух листов по номеру заказа. ФИО могут отличаться на этих двух листах, тогда по ячейкам в обобщенной таблице факта и плана может быть "пусто".
Еще на листе 4 есть таблица данных, из которой также по данным номера заказа будет формироваться таблица на листе 5. Из всплывающего списка в ячейке А2 будет выбираться номер заказа, и по этому номеру будет заполняться таблица. К датам легко применима формула СУММАЕСЛИ, но! К заказчику и № договора ее применить нельзя. Может быть есть другая формула, которую можно применить, или же макросом записать такое действие?
Буду благодарна Вашей помощи. Искра
Это моя первая сложная работа с макросами. Части поставленной задачи не могу разобрать. Помогите, пожалуйста, записать код макроса на следующую таблицу. На листах 1 и 2 есть данные, которые постоянно пополняются. На листе 3 должна формироваться таблица с объединенными данными с этих двух листов по номеру заказа. ФИО могут отличаться на этих двух листах, тогда по ячейкам в обобщенной таблице факта и плана может быть "пусто".
Еще на листе 4 есть таблица данных, из которой также по данным номера заказа будет формироваться таблица на листе 5. Из всплывающего списка в ячейке А2 будет выбираться номер заказа, и по этому номеру будет заполняться таблица. К датам легко применима формула СУММАЕСЛИ, но! К заказчику и № договора ее применить нельзя. Может быть есть другая формула, которую можно применить, или же макросом записать такое действие?
Буду благодарна Вашей помощи. Автор - Искра
Дата добавления - 13.11.2013 в 23:31Имеем базу данных (список, таблицу - называйте как хотите) с информацией по платежам на листе Данные:
Задача: быстро распечатывать приходно-кассовый ордер (платежку, счет-фактуру. ) для любой нужной записи выбранной из этого списка. Поехали!
Шаг 1. Создаем бланк
На другом листе книги (назовем этот лист Бланк) создаем пустой бланк. Можно самостоятельно, можно воспользоваться готовыми бланками, взятыми, например, с сайтов журнала "Главный Бухгалтер" или сайта Microsoft. У меня получилось примерно так:
В пустые ячейки (Счет, Сумма, Принято от и т.д.) будут попадать данные из таблицы платежей с другого листа - чуть позже мы этим займемся.
Шаг 2. Подготовка таблицы платежей
Прежде чем брать данные из таблицы для нашего бланка, таблицу необходимо слегка модернизировать. А именно - вставить пустой столбец слева от таблицы. Мы будем использовать для ввода метки (пусть это будет английская буква "икс") напротив той строки, данные из которой мы хотим добавить в бланк:
Шаг 3. Связываем таблицу и бланк
Для связи используем функцию ВПР (VLOOKUP) - подробнее про нее можно почитать здесь. В нашем случае для того, чтобы вставить в ячейку F9 на бланке номер помеченного "x" платежа с листа Данные надо ввести в ячейку F9 такую формулу:
Т.е. в переводе на "русский понятный" функция должна найти в диапазоне A2:G16 на листе Данные строку, начинающуюся с символа "х" и выдать нам содержимое второго столбца этой строки, т.е. номер платежа.
Аналогичным образом заполняются все остальные ячейки на бланке - в формуле меняется только номер столбца.
В итоге должно получиться следующее:
Шаг 4. Чтобы не было двух "х".
Если пользователь введет "х" напротив нескольких строк, то функция ВПР будет брать только первое найденное значение. Чтобы не было такой многозначности, щелкните правой кнопкой мыши по ярлычку листа Данные и выберите Исходный текст (Source Code) . В появившееся окно редактора Visual Basic скопируйте следующий код:
Этот макрос не дает пользователю ввести больше одного "х" в первый столбец.
Помогите доработать медленный макрос (см.файл макрос Nik035) или возможно кто то предложит альтернативный более шустрый вариант кода для моей задачи:
сам в этом совсем не разбираюсь
В эксель есть две таблицы
Левая - ОБЩАЯ исходная где есть все наименования и по которой идет отбор в СВОДНУЮ и только из тех строк для которых в ОБЩЕЙ проставлено какое то значение в графе - кол-во.
т.е. выбор по условию кол-во ЗНАКОВ в графе (графа Кол. > 0) не всегда знаки это число может быть что то типа 1* или * с форматированием в цвет (бел) для отображения пустой строки
В левой ОБЩЕЙ таблице будет порядка 200-300 наименований из которых по условию (графа Кол. > 0) строки копируются в СВОДНУЮ таблицу справа.
Сводную перед заполнением наверно нужно предварительно очищать.
Я так понимаю макрос из файла тормозит на переносе форматирования текста из ОБЩЕЙ таблицы, в принципе если по другому ускорить работу макроса не получится (кроме как убрав копирование этого форматирования текста) то можно этим пожертвовать или хотя бы оставить форматирование только для графы обозначение.Всем откликнувшимся, заранее ОГРОМНОЕ спасибо!
Макрос для копирования информации с одного листа в другой по условию
Приветствую ВАС,повелители Excel. Сил больше нет парсить это всё руками. Помогите написать.Формула для копирования части данных из одной ячейки в другую - MS Excel
Здравствуйте Прошу вас о помощи Есть строка, она может быть любой длины. Из нее требуется.Макрос для переноса данных из одной таблицы в другую
Всем привет. Нужно сделать макрос для заполнения двух столбцов одной таблицы данными из другой. Из.Макрос копирования ячеек по условию в Excel
Здравствуйте господа программисты! Столкнулся с непосильной задачей. Знания в написании макросов.Макрос копирования ячеек по условию в Excel
Здравствуйте господа программисты! Столкнулся с непосильной задачей. Знания в написании макросов.может можно как то сделать что бы копирование было не по отдельным ячейкам, а сразу по строкам типа:
rng.Range(Cells(rw, 1), Cells(rw, 6)).Copy Cells(cnt, 12)Создать массив чего? и куда его скопировать
В файле задан диапазон ARM? но не знаю то это или не то? и если то то куда его нужно скопировать?
Так же попутный вопрос как сделать что бы в сводной таблице отображались значения как текст а не формула (если она будет в общей таблице)?Добавлено через 9 минут
макрос модифицировал. стало значительно лучшетеперь проблема в другом. работает нормально пока он в пустом файле без других листов.
При переносе листа в другой файл с наличием других диапазонов (печати, ВПР и т.д.) он отказывается работать. как быть?
то же самое происходит если листы из другого файла перенести в данный файл с макросом.
По итогу мне нужен общая книга эксель из нескольких листов в том числе с данным макросомДобавлено через 7 минут
я совсем не специалист в макросах и поэтому предполагаю что проблема в наличии других разделов.
Возможно что это и не такceatv,
почему пункты 5.11 и 5.12 повторяются 2 раза, оба с количествомвидимо и КИП , не имеющий количества , надо переносить, если он возглавляет группу строк с количеством
Спасибо за вопросы. может хоть так получится найти проблему
учитывая что не совсем понимаю действий макроса (только по пояснениям для каждой строки) и то с натяжкой
про п. 5.11 и 5.12 наверно имеется ввиду 5 и 6?
5. Dim rw As Integer ' номер строки в именованном диапазоне
6. Dim cl As Integer ' номер столба в именованном диапазонеп.6 - удалил. в отдельном файле макрос работает нормально, в другом файле с другими не привязанными к данному макросу диапазонами - не работает
Добавлено через 1 час 14 минут
Совсем нет ни каких предложений. что может быть не так в макросе? почему он не хочет работать в другом файле при наличии других именованных диапазонов с ним не связанных?ceatv, Давайте пройдёмся по теории.
1. Скорость
1.1 Каждое одно обращение к диапазону ячеек кушает время одинаковое вне зависимости от числа ячеек в данном диапазоне.
1.2. Когда число обращений переваливает за 100 - время обработки начинает измеряться секундами.
1.3. Обработка даже очень больших массивов в памяти занимает доли секунды.То есть считать чохом лист с миллионом заполненных ячеек в массив = доли секунды.
Читать его поячеечно = доли секунды * кол-во ячеек = могут быть десятки минут при больших объемах
Обрабатывать данные миллиона ячеек, беря/сохраняя их из/в массивы - доли секунды
Обрабатывать те же миллионы, читая/записывая в цикле каждый раз значения из/в ячейки = десятки минут, если не часы.Соответственно, если объём данных велик - оптимально считать всё в массив, обработать, подготовить выходной массив и залить его в нужный диапазон ячеек - такие программы отрабатывают даже на нескольких миллионах ячеек за время моргания глазом.
Вот только, если в каждой ячейке использовано разное форматирование частей текста, разные шрифты, наклон, выделение жирным и т.п. - это в массив не запишется: там только текст. Поэтому всю красивость таким образом быстро не перенести, как ни старайся, а только через Copy-Paste. Здесь тоже можно уменьшить число обращений к ячейкам, постаравшись копировать максимально крупными регионами.
Вот, например ниже ещё чуть более быстрый копировщик из вашего кода, который накапливает счётчик строк для копирования, пока не встретится пустая строка, и только потом переносит диапазон между пустыми строками в новое место. Если бы в нём ещё и количество не читать каждый раз из ячеек, а один раз считать в массив и потом перебирать элементы массива - было бы ещё быстрее.2. Добавление листов и сбой работы макроса.
Когда у вас более одного листа, нельзя обращаться просто к Range или Cells. Нужно указывать лист, на котором эти Range и Cells обретаются. Например: Sheets(1).Range(Sheets(1).Cells(2,5),Sheets(1).Cells(50,12)) .Value = .
Или Sheets("ваше_имя_листа").Cells(2,12).Value = .А если вы открываете одновременно более одного файла Excel, то надо конкретизировать к какому WorkBooks() относятся ваши листы:
WorkBooks("test.xlsx").Sheets(1).Range.Вот пример, который должен работать при наличии нескольких листов:
Добрый день!
В написании макросов я новичок. По долгу службы надо было оптимизировать работу, поэтому пришлось приложить усилия и что-то наваять.Смысл работы нижеприведенного макроса следующий:
1) первым действием макрос вытягивает из листа "Реестр операций" на лист "Cash flow"(данный лист является основным)
2) затем выполняется цикл по суммированию (с помощью суммеслимн) и заполнению определенных диапозонов на листе "Cash flow" . Данные для суммирования также берутся из листа "Реестр операций".Подскажите, как можно оптимизировать цикл по заполнению ячеек, поскольку сейчас выполнение макроса занимает от 3 до 5 мин. Как можно его ускорить, либо быть может заменить имеющийся цикл For next на другую более быструю структуру.
Ниже приведен макрос.
Option Explicit
Sub Rachet()Dim vItem, avArr, li As Long
ReDim avArr(1 To Rows.Count, 1 To 1)Dim k As Integer, i As Integer, j As Integer
Dim a, b, c, d, e As Range
Dim Sum(1 To 18) As Long
Dim Name As String
Dim Shape As Shape
Dim sheet1, sheet2 As WorksheetSet sheet1 = Worksheets("Cash flow")
Set sheet2 = Worksheets("Реестр операций")
Set a = sheet2.Range("H3:H999000")
Set b = sheet2.Range("F3:F999000")
Set c = sheet2.Range("C3:C999000")
Set d = sheet2.Range("L3:L999000")
Set e = sheet2.Range("G3:G999000")'Блок №1 - вытаскивает уникальные значение "Статей затрат" на лист Кэшфло
With New Collection
On Error Resume Next
For Each vItem In b.Value
.Add vItem, CStr(vItem)
If Err = 0 Then
li = li + 1: avArr(li, 1) = vItem
Else: Err.Clear
End If
Next
End With
If li Then sheet1.[C8].Resize(li).Value = avArr'Блок №2 - заполнение ячеек с помощью формулы СУММЕСЛИМН на листе Кэшфло
For j = 1 To 70
k = 3
For i = 4 To 35
Sum(1) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 7, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 7, 2) & "*")
Cells(j + 7, i) = Sum(1)Sum(2) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 79, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 79, 2) & "*")
Cells(j + 79, i) = Sum(2)Sum(3) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 150, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 150, 2) & "*")
Cells(j + 150, i) = Sum(3)Sum(4) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 223, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 223, 2) & "*")
Cells(j + 223, i) = Sum(4)Sum(5) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 294, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 294, 2) & "*")
Cells(j + 294, i) = Sum(5)Sum(6) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 367, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 367, 2) & "*")
Cells(j + 367, i) = Sum(6)Sum(7) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 442, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 442, 2) & "*")
Cells(j + 442, i) = Sum(7)Sum(8) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 513, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 513, 2) & "*")
Cells(j + 513, i) = Sum(8)Sum(9) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 589, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 589, 2) & "*")
Cells(j + 589, i) = Sum(9)Sum(10) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 660, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 660, 2) & "*")
Cells(j + 660, i) = Sum(10)Sum(11) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 736, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 736, 2) & "*")
Cells(j + 736, i) = Sum(11)Sum(12) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 807, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 807, 2) & "*")
Cells(j + 807, i) = Sum(12)Sum(13) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 883, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 883, 2) & "*")
Cells(j + 883, i) = Sum(13)Sum(14) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 954, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 954, 2) & "*")
Cells(j + 954, i) = Sum(14)Sum(15) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 1027, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 1027, 2) & "*")
Cells(j + 1027, i) = Sum(15)Sum(16) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 1098, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 1098, 2) & "*")
Cells(j + 1098, i) = Sum(16)Sum(17) = Application.WorksheetFunction.SumIfs(a, b, sheet1.Cells(j + 1176, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 1176, 2) & "*")
Cells(j + 1176, i) = Sum(17)Sum(18) = Application.WorksheetFunction.SumIfs(e, b, sheet1.Cells(j + 1247, 3), c, sheet1.Cells(2, k + 1), d, "*" & sheet1.Cells(j + 1247, 2) & "*")
Cells(j + 1247, i) = Sum(18)Читайте также: