Сообщения

Сообщения за 2015

Функции рабочего листа и скорость расчетов

В прошлом посте мы упоминали, что скорость расчетов встроенных функций Excel больше скорости самостоятельно созданных функций на VBA.Однако ситуация не всегда так однозначна. Встроенными средствами VBA можно создавать пользовательские функции которые будут работать гораздо быстрее встроенных, используя другие алгоритмы расчетов. Особенно сильное различие получается при составлении сложных формул. В Excel одну и ту же задачу можно решить несколькими способами, в зависимости от квалификации пользователя и текущих задач. Так же и в VBA. Помимо этого в VBA можно производить расчеты непосредственно в программном коде, не обращаясь к ячейкам. Такие расчеты проходят в тысячи раз быстрее, т.к. операция обращения к ячейкам рабочего листа является очень медленной. Рассмотрим на конкретном примере. Создадим пользовательскую функцию рабочего листа, задачей которой будет подсчет уникальных значений в заданном массиве.Такой прямо встроенной функции нет, однако задачу можно решить следующей формул

Программирование собственных формул рабочего листа

Изображение
Часто в Excel возникает необходимость запрограммировать собственные расчетные формулы, т.к. пакет доступных формул не содержит необходимых. Задачу конечно можно решить штатными средствами расчетов- комбинацией элементарных операций, но если такие формулы приходится применять часто, запомнить и воспроизводить их постоянно будет очень трудоемко и долго. К тому же это предъявляет высокие требование к пользователю, производящему расчеты - он должен обладать равными знаниями со всеми ключевыми пользователями и сложные расчеты нельзя будет перепоручить оператору. Поясним на примере о чем может идти речь. В логистике существует ряд формул расчета оптимальных размеров заказа, для моделей с дефицитом, для случаев выполнения заявок, не выполнения заявок. Например, формула расчета максимального размера дефицита определяется по формуле: где, С0 - стоимость подачи заказа D - годовой спрос Ch - издержки хранения одной единицы товара Sb - стоимость отсутствия запасов В нормальном виде это

Создание консолидированного отчета

Рассмотрим пример еще одной полезной пакетной обработки. Допустим вам как сотруднику множество подразделений присылает однотипные отчеты и вашей задачей является собрать их в одни файл и переслать руководителю. Либо же вы руководитель, и собираете подобные консолидированные отчеты от подчиненных. Т.е. это простая рутинная работа - скопировать данные из одного файла и вставить его в консолидирующий и так 30 раз. Для этого случая можно сделать пакетную обработку - сохранить все нужные к обработке файлы в одной папке - программа сама создаст сводный файл и проведет копирование однотипных данных из всех файлов в папке в этот файл. Как всегда важная деталь - файл из которого вы будете запускать этот макрос не должен находится в этот папке, чтобы его преждевременное открытие не вызвало ошибку. Макрос нужно запускать из любого другого открытого файла. Приведем код Sub Консолидация()     ' Макрос создает книгу и последовательно вставляет на одноименные листы     ' данные из все

Запуск макросов в автоматическом режиме по расписанию

Изображение
При наличии множества пакетных обработок файлов может быть очень удобным назначить им автоматическое выполнение по расписанию. Пакетные обработки могут выполняться через интервалы, друг за другом, без участия пользователей (в ночное время при включенном ПК). Это избавляет от необходимости присутствия оператора для запуска обработок, экономит время на их ожидание. Можно сделать так, что к началу рабочего дня обработчики уже создадут готовые отчеты и пользователям останется только проверить их. Автоматический запуск из закрытого Excel не возможен. Из ситуации есть два выхода - оставить открытой книгу Excel из которой будут вызываться обработки по расписанию либо воспользоваться внешним vbs-скриптом для этой задачи. который сам по сути является макросом. Макросы для планировщика придется немного изменить - нужно создавать их так, чтобы макрос не запрашивал никаких дополнительных окон и не просил от пользователя никаких действий. Т.е. если применяется пакетная обработка, то в коде макрос

Пакетная обработка отчетов

Изображение
В задачах автоматизации массовых обработок часто стоит задача обработки множества отчетов однотипным образом (разные подразделения, филиалы). Чтобы не обрабатывать каждый такой отчет отдельно можно создать типовой обработчик одного файла, а затем вставить его в процедуру обработки множества файлов. Приведем пример. Нам нужно обработать файлы Продажи блюд производства с отгрузками по 20-ти ГМ. Их можно выгрузить в одну папку, добавив в конце имени файла название города или ГМ и запустить макрос, который обработает все 20 файлов без участия пользователя. Ранее мы уже разработали обработчик одного файла под названием Simple_Relise. Теперь Необходимо вставить его в макрос, который пройдет по всем файлам в папке и применит к ним этот обработчик. Приведем код. Запускать его нужно из любого файла НЕ находящегося в этой папке. Sub ГрупповаяОбработка()     ' запрашиваем пути к папкам с файлами, функция открывает окно выбора папки     InvoiceFolder$ = GetFolderPath     Dim coll A

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

Изображение
Для того что разрабатываемые нами макросы были доступны из любого документа Excel и желательно в виде понятного пользовательского меню необходимо создавать надстройки. Изначально макрос нужно создавать в тех файлах, в которых он должен работать, чтобы отладить его работу и убедиться что все выполняется как нужно. Затем, когда код готов его можно перенести с специально созданную книгу для кодов, из которой делается надстройка. В этой книге мы собираем все коды, создает элементы меню, привязываем их к макросам и компилируем книгу в настройку. Саму книгу следует хранить с расширением .xlsm. Надстройки имеют расширение .xlam  после компиляции не редактируются. Рассмотрим пример. У нас уже есть готовый код отчета средняя себестоимость комплексов. Скопируем этот код в новую книгу, назвав ее Учет Производства в обычный модуль VBA. Затем в эту же книгу пропишем установщик меню с привязкой к макросу. Установщик меню записывается в модуль книги (это важно): Код установщика имеет следую

Создание контрольных листов

Контрольные листы в VBA создаются также как в ООО но со своими объектами. Едиственное что при вставке формул нужно помнить - если формулу вставляете на английском, то можно использовать свойство .Formula, а если на русском: .FormulaLocal: Sub ControlL() Worksheets("Лист6").Range("a1") = "Показатель" Worksheets("Лист6").Range("b2") = "Значение" Worksheets("Лист6").Range("a2") = "Кол-во позиций не СП ГМ в ВП Готовой продукции" Worksheets("Лист6").Range("a3") = "Кол-во штучных позиций в ВП Готовой продукции, списанных дробным числом" ' и т.д.... Worksheets("Лист6").Range("b2").Formula ("=COUNTA('Не СП ГМ в ВП Готовой продукции'.C2:C65536)") Worksheets("Лист6").Range("b3").Formula ("=SUM('Штучные позиции в ВП ГП'.M2:M65536)") ' и т.д.... Worksheets("Лист6").Range(&quo

Использование сложной функции If Then со многими ElseIf

Функция If ElseIf  d VBA работает точно также как и в ООО, только со другими именами объектов: Sub DellCell() n = Sheets("Sheet1").Range("A1").CurrentRegion.Rows.Count For I = n To 2 Step -1 text1 = Cells(I, 8) If Left(text1, 12) = "Производство" Then Cells(I, 3) = "" Cells(I, 5) = "" Cells(I, 6) = "" Cells(I, 7) = "" ElseIf Left(text1, 7) = "Пекарня" Then Cells(I, 4) = "" Cells(I, 5) = "" Cells(I, 6) = "" Cells(I, 7) = "" ElseIf Left(text1, 8) = "Столовая" Then Cells(I, 3) = "" Cells(I, 4) = "" Cells(I, 6) = "" Cells(I, 7) = "" End If Next I End Sub

Использование функции Go To при построении сводных таблиц

Оператор GoTo в VBA используется точно также как и в ООО. Единственное, что сочетание GoTo пишется слитно и можно не использовать оператор Then, а сразу GoTo: Sub CreatePivotTable() ActiveWorkbook.Worksheets.Add after:=Worksheets("Sheet1") Worksheets(2).Name = "Сводная" oshipka = Worksheets("Sheet1").Range("A1").Value If oshipka = "" Then GoTo Line 'Объявляем переменные     Dim objTable As PivotTable, objField As PivotField     'Выбираем лист и первую ячейку в нем по которому будет строиться сводная     ActiveWorkbook.Sheets("Sheet1").Select     Range("A1").Select     'Создаем сводную     Set objTable = ActiveWorkbook.Sheets("Sheet1").PivotTableWizard     'Определяем Поле строк и Поле столбцов     'Поле строк (по заголовку нужного столбца)     Set objField = objTable.PivotFields("Дата операции")     objField.Orientation = xlRowField     'Поле столбца (по

Сохранение данных в разные файлы

В VBA сохранение данных в разные файлы осуществляется проще чем в ООО. Здесь можно обойтись без удаления листов с последующей отменой, а заняться прямым копированием нужных листов во вновь создаваемую книгу, с последующим ее сохранением. Рассмотрим аналогичный код получения файла ГМ Месяц списания из файла Данные для проводок. Нам из второго файла нужны два первых листа, затем перенеся их в новый файл. сохраним с именем по данным ячеек A1 и B1: Sub SaveSheet() Dim NewWb As Workbook 'Заносим имя текущей книги в переменную n = ActiveWorkbook.Name 'Создаем новую книгу с 1-м пустым листом Set NewWb = Workbooks.Add(1) 'Активируем старую книгу Windows(n).Activate 'Указываем массивом листы, которые хотим скопировать Sheets(Array("Списание ГП", "Списание сырья")).Copy Before:=Workbooks(NewWb.Name).Sheets(1) ' Отключаем любые окна предупреждений Application.DisplayAlerts = False ' Удаляем существовавший пустой лист Sheets("Лист1&q

Отправка отчетов по электронной почте

Несмотря на широкую распростаненность и популярность Excel отправка электронных писем из него весьма не типична и не удобна. Без MS Outlook очень ограниченна. Есть некоторые устаревшие методы полноценной отправки, правда они не оставляют копий таких писем, требуют указания в коде программы личных данных почты и паролей, что может быть небезопасно. Поэтому рассмотрим только один подходящий пример отправки письма через используемый нами Mozilla Thunderbird (в VBA нет понятия почтового клиента по умолчанию в отличие от OOO, поэтому отправка из него настолько затруднена). Sub SMail() Dim addrRassl ' Пишем адрес, на который хотим отправить, можно указать несколько через массив или 'оставить поле пустым addrRassl = "example@mail.ru" Dim oShell Dim oThisBook As Workbook Set oThisBook = ThisWorkbook 'Определяем полный адрес вызова программы почтового клиента 'На вашем компьютере (в вашей системе) он может быть другим ' Указываем тему сообщения с текуще

Создание выпадающего списка значений

Список выпадающих значений в VBA создается еще проще чем в ООО. Значения указываются в одной формуле просто через зяпятую. Пример в следующем коде: Sub Valid() With Range("L2:L1000").Validation     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _     xlBetween, Formula1:="Ошибочное перемещение позиции не по акту заборки,Неверное МХ в операции внутреннего перемещения,Ошибка при заведении операции инвентаризации,Новое сырье, отправлен запрос на привязку,Сырье, не используемое в производстве, Нарушение привязки позиции к рецептам в БД, отправлен запрос на исправление" End With End Sub

Использование двойного цикла for to next

Использование двойного цикла в VBA аналогично использованию его в ООО. Отличие лишь в том что объект Cell в OOO и Cell в VBA определяют столбец и строку наоборот (но вы это уже должны были заметить). Т.е. вместо  .getcellbyposition(6,i).Value будет Cell(i,6).Value. Рассмотрим пример по применению заливки к ячейкам в зависимости от условий, который мы рассматривали в блоге OOO. Sub Cveta() LastRow = Cells(Rows.Count, 1).End(xlUp).Row     For i = LastRow To 2 Step -1     For j = 0 To 6     text1 = Cells(i, 6).Value     If text1 < -5000 Then     Cells(i, j).Interior.Color = vbYellow         ElseIf text1 > 5000 Then         Cells(i, j).Interior.Color = vbRed        End If        End If    Next i    Next j    End Sub End Sub

Комбинации ЕСЛИ(ИЛИ) и ЕСЛИ(И) и их использование в проверке и фильтрации

Данные комбинации используются точно также, как и ООО, с едиственным различием, что формулы можно писать по-русски и в VBA нам удобнее протягивать сверху вниз. В Остальном формула и код абсолютно идентичны: Sub IfOr() Worksheets(1).Range("L2").FormulaLocal = "=ЕСЛИ(ИЛИ(G2 =" & Chr(34) & "Утиль производства ГМ" & Chr(34) & ";G2 =" & Chr(34) & "Анализы СЭС" & Chr(34) & ";G2 =" & Chr(34) & "Игредиенты производства АР" & Chr(34) & ";G2 =" & Chr(34) & "Ингредиенты производства ГМ" & Chr(34) & ";G2 =" & Chr(34) & "Сертификация" & Chr(34) & ";G2 =" & Chr(34) & "Дегустация" & Chr(34) & ");1;0)" n = Sheets("Sheet1").Range("H1").CurrentRegion.Rows.Count Worksheets(1).Range("L2").AutoFill Destination:=Worksheets(1).Range("L2

Фильтрация по сдвоенному условию. Функция СЦЕПИТЬ

Аналогом функции Concatenate ООО в Экселе является функция сцепить. Она также может применяться для формирования сдвоенных условий для фильтрации, создания сложных уникальных ключей для постановки и фильтрации. Sub Concat() Worksheets(1).Range("L2").FormulaLocal = "=СЦЕПИТЬ(F2;G2)" n = Sheets("Sheet1").Range("H1").CurrentRegion.Rows.Count Worksheets(1).Range("L2").AutoFill Destination:=Worksheets(1).Range("H2:H" & n), Type:=xlFillDefault Worksheets(1).Range("L1") = "Уникаль" End Sub Данный код является аналогом кода из поста ООО. Он сцепляется строки Название контрагента и Название типа операции в файле Реестр документов по МХ в отдельном столбце.

Функция ПОИСК для поиска текста внутри предложений

Как и в ООО, в Excel есть функция для поиска значений внутри текстовых строк, в русской локализации ПОИСК. Рассмотрим пример использования подобной фукнции для тех же целей. Вставку формулы будем сразу запускать с ЕСЛИ и ЕОШИБКА, чтобы убирать ошибочные !ЗНАЧ, в тех ячейках где искомые данные не найдены. Следующий пример ищет значения "Краснодар" в столбце Полное название МХ (откуда) в операции. При нахождении выдает 1, иначе 0: Sub Sear() Worksheets(1).Range("G2").FormulaLocal = "=ЕСЛИ(ЕОШИБКА(ПОИСК(" & Chr(34) & "Краснодар" & Chr(34) & ";K2)) ;0;1)" n = Sheets("Sheet1").Range("F1").CurrentRegion.Rows.Count Worksheets(1).Select Worksheets(1).Range("G2").AutoFill Destination:=Worksheets(1).Range("G2:G" & n), Type:=xlFillDefault Worksheets(1).Range("G1") = "Поиск значения" End Sub

Определение месяца формирования документа

Определение месяца и года формирования документа в VBA абсолютно аналогично подобной операции в ООО, отличие только в названиях объектов рабочего листа, а функции те же: Sub Mon() Select Case Month(Worksheets("Sheet1").Range("A2").Value) Case 1 Data = "январь" Case 2 Data = "февраль" Case 3 Data = "март" Case 4 Data = "апрель" Case 5 Data = "май" Case 6 Data = "июнь" Case 7 Data = "июль" Case 8 Data = "август" Case 9 Data = "сентябрь" Case 10 Data = "октябрь" Case 11 Data = "ноябрь" Case 12 Data = "декабрь" End Select Dim GM GM = Data & " " & Year(Worksheets("Sheet1").Range("A2")) End Sub

Создание первой простой обработки

Создадим аналог обработки. которую мы использовали для OOO в VBA (формирование отчета средняя серебристость комплексов). Ниже приведен полный код макроса с комментариями. Разбивка на подмодули, в отличие от ООО не проводилась, весь макрос заключен в одну программу. Код рассмотреть самостоятельно. Sub Simple_Relise() With Worksheets("Sheet1")             .Range("A1:AF65536").AutoFilter             .Range("A1:AF65536").AutoFilter Field:=4, Criteria1:="Столовая для персонала" End With 'Вставляем новый лист после листа Sheet1 ActiveWorkbook.Worksheets.Add after:=Worksheets("Sheet1") 'Даем ему имя Торговый зал Worksheets(2).Name = "Столовая для персонала" 'Копируем отфильтрованный диапазон в первую ячейку вставленного листа Worksheets("Sheet1").Range("A1:AF65536").Copy Worksheets("Столовая для персонала").Range("A1") 'Чуть расширим макрос - теперь мы хотим удалит

Использование функции ВПР

Рассмотрим моменты использования аналога функции VLOOKUP OOO - ВПР в эксель. Как и с предыдущим приложением использовать ее без функций ЕСЛИ и ЕОШИБКА не очень удобно, потом придется убирать ошибочные значения, поэтому будем задавать их сразу. Следующий код копирует из файла Рецепты коды в файл Реестр товарных позиций по МХ, затем с помощью функции ВПР в столбце I проверяет массив данных на рецепт. Sub VPR() 'Скопировать нужный диапазон в новую книгу Range("A1:A65535").Copy FileSpec = ThisWorkbook.Path & "\" & "Реестр документов по МХ.xls" Workbooks.Open FileSpec 'Вставляем новый лист ActiveWorkbook . Worksheets . Add after := Worksheets (" Sheet 1") Worksheets(2).Name = " Постановка " ' Вставляем данные ActiveSheet.Paste ‘ Дадим имя вставленному диапазону Worksheets (2). Range (" A 1: A 65536"). Name = "постановка" ‘Вставляем формулу. Если вы хотите вставлять в VBA

Автоматическое открытие файла

Опустим в текущем рассмотрении функцию AddFile из OOO т.к. в экселе копирование данных из одной книги в другую производится намного проще. Сразу перейдем к так называемой автоматической обработке. Sub Openfil() ' Здесь расположен код обработки текущего документа.... ' Когда обработка завершена проводим необходимые действия по переносу данных 'Выделить диапазон который необходимо скопировать Range("A1:R65535").Copy FileSpec = ThisWorkbook.Path & "\" & "Реестр документов для ГК.xls" Workbooks.Open FileSpec 'Выделить начальную ячейку в которую необходимо вставить скопированные данные ActiveWorkbook.Worksheets.Add after:=Worksheets("Лист1") Worksheets(2).Name = "Подстановка" 'Вставить данные ActiveSheet.Paste 'Определим для примера некоторый именованный диапазон Worksheets(2).Range("A1:B65536").Name = "постановка" ' Дальнейшая обработка End Sub Как видно из примера

Сохранение файла с заданным именем

В VBA решается парой строк: Sub SaveAs() ThisFile = ThisWorkbook.Path & "\" & "Проверка операций внутренние перемещения" & " " & Range("A2").Value & ".xlsm"     ActiveWorkbook.SaveAs Filename:=ThisFile End Sub Можно подробнее раскрыть строку с именем файла ThisFile ThisWorkbook.Path & "\" & - эта строка указывает на то, что файл нужно сохранить в той же папке, что и открытий текущий файл & " " & - конкатенация - вставляет пробел после основного имени файла и последующих добавлений (не обязательно) Range("A2").Value & - в имя файла часто нужно включить содержимое какой либо ячейки ".xlsm" - и в конце добавить нужное расширение (обычно .xlsx или .xls). Если добавлений не использовать строка сократиться до: ThisFile = ThisWorkbook.Path & "\" & "Проверка операций внутренние перемещения.xlsm"

Подбитие сумм столбцов

Подведение итогов столбца  в VBA реализуется просто. первая ячейка с данными (без заголовка) нам известна, нужно определить программно последнюю ячейку столбца, конвертировать этот диапазон в адрес  и вставить в виде формулы: Sub SummColumn()     s = Cells(Rows.Count, 3).End(xlUp).Row   Set oRange = Range(Cells(2, 3), Cells(s, 3))   Cells(s + 1, 3).Formula = "=SUM(" & oRange.Address & ")" End Sub Данный код вставляет итоговые данные под столбец Сумма реестра документов, суммируя данные со 2-й до последней заполненной ячейки. Формула вставляется "живая" с абсолютной адресацией. Если живые формулы не нужны, а просто значение итога, реализация еще проще: Sub SummColumn2() Cells(s + 1, 3) = WorksheetFunction.Sum(Range("С:С")) End Sub Задача. Подведите итоги ранее рассчитанного столбца Сумма без НДС в файле Реестр документов.

Альтернативный способ фильтрации циклом for next

Рассмотрим аналогию фильтрации в ООО циклом for next в реализации VBA. В следующем примере мы удалим строки с данными цехов производства и пекарни из файла Реестр документов. Sub DelStringFor() 'Определяем последнюю заполненную ячейку диапазона (нижнюю границу) LastRow = Cells(Rows.Count, 1).End(xlUp).Row Указываем первую ячейку, до которой будет работать цикл (без заголовка - 2 ячейка) FirstRow = 2 ' Создаем цикл от последней ячейки до первой  For i = lLastRow To FirstRow Step -1 text1 = Cells(i, 5).Value ' Нам нужно удалить строки содержащие данные цехов производства и пекарни  If Trim(Left(text1, 12)) = "Производство" OR Trim(Left(text1, 7)) = "Пекарня" Then ' Удаляем строки  Rows(i).Delete ' Закрываем условие и цикл  End If  Next i End Sub Задача. Удалите из файла Реестр документов циклом строки содержащие ПРОГАС, ПРОБАК, ПРООВ. Не забудьте что для большей надежности оператор Left нужно подкреплять опер

Наборы операций с данными рабочего листа

Продублируем наборы операций которые мы рассматривали для ООО в VBA. Вставка и удаление столбцов и строк: Sub InsDel     Worksheets("Sheet1").Columns("C:C").Insert     Worksheets("Sheet1").Columns("C:C").Delete     Worksheets("Sheet1").Rows("1:1").Insert     Worksheets("Sheet1").Rows("1:1").Delete End Sub Метод Insert отвечает за вставку, Delete за удаление. Несколько смежных столбцов или строк можно вставить и удалить лишь указав в данном коде это условие: Sub InsDel2     Worksheets("Sheet1").Columns("A:C").Insert     Worksheets("Sheet1").Columns("A:C").Delete     Worksheets("Sheet1").Rows("1:10").Insert     Worksheets("Sheet1").Rows("1:10").Delete End Sub Автоширина для столбцов указывается с явным указанием необходимых примером следующего кода: Sub AutoF Worksheets("Sheet1").Columns("A

Сортировка

Сортировка диапазона в VBA выполняется всего парой строк. Для сортировки по возрастанию, которая задана по умолчанию не нужно указывать дополнительных параметров. Подойдет простой код, в примере ниже: Sub SortRange1()    Worksheets("Sheet1").Range("A2:R65536").Sort _         Key1:=Worksheets("Sheet1").Range("C1") End Sub Этим кодом мы отсортировали Реестр документов по возрастанию столбца "Сумма". Для сортировки по убыванию следует указать параметр order:=xlDescending. Следующим кодом мы отсортировали Реестр документов по убыванию столбца "Дата операции" Sub SortRange2()    Worksheets("Sheet1").Range("A2:R65536").Sort _         Key1:=Worksheets("Sheet1").Range("B1"), _         order1:=xlDescending End Sub

Копирование и вставка

Под копированием и вставкой будет подразумевать копирование всего текущего диапазона, как в примере ООО. В VBA задача решается очень просто: Sub CopyCurrentRegion2() ActiveWorkbook.Worksheets.Add after:=Worksheets("Sheet1") Worksheets(2).Name = "Sheet2" Worksheets("Sheet1").Range("A1").CurrentRegion.Copy Sheets("Sheet2").Range("A1") End Sub Данный код копирует все данные с листа 1 на лист 2, лист2 предварительно вставляется. Если нужно вставить только значения используем .PasteSpecial: Sub CopyCurrentRegion3() ActiveWorkbook.Worksheets.Add after:=Worksheets("Sheet1") Worksheets(2).Name = "Sheet2" Worksheets("Sheet1").Range("A1:R65536").Copy  Sheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues End Sub Копирование из закрытых книг лучше не проводить, хотя VBA предоставляет такую возможность. Такое копирование дольше выполняется и снижает пр

Вставка формул

Вставка формул в VBA очень похожа на вставку в ООО. Формула в отдельную ячейку вставляется примером следующего кода: Sub F1() Worksheets("Sheet1").Range("C1").Formula = "=Sum(C2:C65536) " End Sub Это командой мы получили сумму столбца "Сумма" Реестра документов в первой его ячейке вместо заголовка. Задача: получите максимальное значение номера документа в файле Реестр документов в ячейке А1. Для поиска наибольшего значения используйте функцию MAX. Протягивание формулы сверху низ до конца может осуществлятся несколькими способами. Одним их них - протянуть на количество заполненных строк соседнего стоблца, но нужно быть уверенным что он заполнен без пропусков до нужной строки: Sub F2() Range("R2").Formula = "=(C2*18)/118" n = Sheets("Sheet1").Range("Q1").CurrentRegion.Rows.Count Range("R2").AutoFill Destination:=Range("R2:R" & n), Type:=xlFillDefault Range("R1"

Поиск и замена

Поиск и замена в VBA может быть осуществлена с помощью одной единственной строки. Операцию лучше проводить через явное указание диапазона или столбца. Например, следующий код удалит сочетание •Производство из столбца F Реестра документов по МХ, заменив его на значение "пусто". Sub Repl() Range("F1:F65536").Replace "•Производство", "" End Sub Задание. В файле реестр документов проведите замену для цехов фасовки, заменив значения "овощей", "бакалеи" и "гастрономии" на значение пусто, так чтобы после обработки значения отдельных цехов стали неразличимы и были сформированы только надписью "Цех фасовки"

Построение сводной таблицы

В разработке.... Рассмотрим код построения сводной таблицы по файлу реестр документов ГМ - поле строк - дата, поле столбцов - тип операции, поле данных - операция суммирования. Sub CreatePivotTable() ActiveWorkbook.Worksheets.Add after:=Worksheets("Sheet1") Worksheets(2).Name = "Сводная" 'Объявляем переменные     Dim objTable As PivotTable, objField As PivotField     'Выбираем лист и первую ячейку в нем по которому будет строиться сводная     ActiveWorkbook.Sheets("Sheet1").Select     Range("A1").Select     'Создаем сводную     Set objTable = ActiveWorkbook.Sheets("Sheet1").PivotTableWizard     'Определяем Поле строк и Поле столбцов     'Поле строк (по заголовку нужного столбца)     Set objField = objTable.PivotFields("Дата операции")     objField.Orientation = xlRowField     'Поле столбца (по заголовку нужного столбца)     Set objField = objTable.PivotFields("Название типа опер

Простой фильтр

Задача одиночной фильтрации в VBA очень просто решается через автофильтр с копированием. Рассмотрим код: Sub Filt() With Worksheets("Sheet1")             'Определяем необходимый диапазон             .Range("A1:L65536").AutoFilter             'Устанавливаем фильтр по 9 столбцу равно Торговый зал             .Range("A1:L65536").AutoFilter Field:=9, Criteria1:="Торговый зал" End With 'Вставляем новый лист после листа Sheet1 ActiveWorkbook.Worksheets.Add after:=Worksheets("Sheet1") 'Даем ему имя Торговый зал Worksheets(2).Name = "Торговый зал" 'Копируем отфильтрованный диапазон в первую ячейку вставленного листа Worksheets("Sheet1").Range("A1:L65536").Copy Worksheets("Торговый зал").Range("A1") 'Чуть расширим макрос - теперь мы хотим удалить лист Sheet1 (или первый лист) 'Но так как он содержит данные. чтобы не получить лишних подтвержающих сооб