Макросы в excel 2018 для чайников с примерами: примеры и как сделать / Skillbox Media
Содержание
3D-движок, написанный на формулах MS Excel / Хабр
Скриншот экрана игры
Эта статья посвящена тому, как я смог написать 3D-движок только на формулах Excel. Я реализовал следующий функционал:
- бесконечная процедурно генерируемая карта лабиринта
- рендеринг трассировкой лучей в реальном времени
- вычисление окклюзии
- рендеринг простейшего освещения
- шейдер освещения и вычислений
- движок естественного движения
- в 3D-движке не используются макросы
* чтобы управлять игрой нажатием клавиш, нужны макросы, управляющие движением с помощью одной простой инструкции копирования.
Можете скачать файл и протестировать его самостоятельно!
Файлы
- Файл без vba: http://public.cbel.free.fr/?file=Doom.xlsx
- Файл с vba для перехвата нажатий клавиш: http://public.cbel.free.fr/?file=Doom.xls-v1.1.xlsm
- Файл с vba и высоким разрешением: http://public.
cbel.free.fr/?file=Doom-HD.xls-v1.1.xlsm
- Файл с vba и кнопками вместо горячих клавиш: http://public.cbel.free.fr/downloads/?file=Doom.xls-Buttons-v1.1.xlsm
Учитель информатики однажды сказал нам: «любые вычисления можно выполнить в любом языке программирования, даже через формулы электронной таблицы».
Поначалу, какой бы мудрой ни казалась эта фраза, упоминание в этом списке Excel выглядело глупо…
Затем, после изучения машины Тьюринга, фраза стала для нас полностью верной, хотя и не вполне реализуемой.
Получив многолетний опыт работы с Excel, мы уже поняли, что единственное ограничение формулы Excel — недостаток способов ввода-вывода.
Но множество задач, решаемых исключительно формулами, по-прежнему выглядит впечатляюще.
Как бы то ни было, эта работа — не просто какое-то хвастовство… У меня были для неё серьёзные причины.
Электронные таблицы — это мощный инструмент, которому должен научиться каждый, ведь его можно использовать почти в любых деловых задачах.
Однако когда большинство людей доходят до решения более сложных задач, они стремятся использовать язык VBA, даже не понимая толком, зачем.
А начав изучать его, они пытаются использовать его для решения любых видов задач, даже для простого поиска или визуализации.
Сегодня я преподаю Excel, поэтому постараюсь объяснить людям, почему написание макроса на VBA для решения любой задачи без хорошего знания программирования — это не только пустая трата времени, но и серьёзный риск снижения качества электронной таблицы.
При использовании в бизнесе формулы обладают следующими преимуществами перед макросами:
- Их быстрее писать для любого человека, если он не профессиональный программист-аналитик
- Их проще поддерживать любому человеку, а не только профессиональному программисту. (Чаще всего макросы становятся бесполезны после ухода их разработчика.)
- Гарантированное качество благодаря постоянной проверке значений. (Принудительное применение техники «разработка через тестирование»)
- Они более эффективны в долговременной перспективе благодаря процессу создания формул в стиле «думай, прежде чем писать».
- И они совершенно точно гораздо лучше интегрированы в сам инструмент создания электронных таблиц и следуют изначальному паттерну разработки электронных таблиц, в то время как макросы часто оказываются специфическими конструкциями, требующими в дальнейшем активной поддержки.
Примечание: эти пункты в основном относятся к процедурам, используемым как макросы; дополнительная функция, написанная на VBA, может увеличить эффективность, не снижая качества.
Вот так я пришёл к написанию своей игры: она стала наглядной демонстрацией того, что макросы обычно не нужны даже для решения самых сложных задач.
Если конкретнее, то я нашёл всего два случая, когда потребовался VBA:
- Добавление специфического ввода или вывода (как я сделал здесь для получения событий клавиш), потому что формула всегда ограничена изменениями в самой ячейке
- Некоторые сложные задачи (например, оптимизация), в которых вычисления занимают слишком много времени и/или пространства.
Но такие задачи довольно редки в реальной жизни.
В оставшейся части этой статьи я расскажу как работают электронные таблицы в различных аспектах игры.
Моя электронная таблица должна была стать игрой в стиле Doom в лабиринте.
Можно было создать для неё постоянную, построенную вручную карту, возможно, зацикленную по краям, но она бы потребовала дополнительного места, поисков и изначальной разработки дизайна.
В то же время, гораздо более интересной целью мне казалась идея процедурно генерируемой бесконечной карты.
Для создания случайно генерируемой карты нам нужно быть последовательными, поэтому функцию rand() использовать нельзя, ведь мы не можем контролировать начальное состояние (seed) генератора случайных чисел.
Начальные состояния генератора случайных чисел должны быть позициями (x;y) на карте, чтобы мы могли получать разные значения для каждой позиции, и мы не можем получить результат предыдущего случайного числа как начальное состояние для следующего, или нам придётся хранить всю карту с самого начала.
Обычные хэш-функции, несмотря на обеспечение высокого качества случайных чисел, оказались слишком затратными, поэтому мне нужно было найти другое решение.
Эксперименты с фрактальным генератором тоже оказались довольно затратными и давали интересные результаты только для небольшой части карты.
Тогда я обнаружил метод средних квадратов (middle-square method), который на самом деле не очень «случаен», потому что в нём используются последовательные начальные состояния. Но он подсказал мне идею того, что можно брать десятичную часть любого другого вычисления.
Я выяснил, что если брать десятичные части sin(x)+cos(y), то наконец-то получаются красивые числа без какого-либо прослеживаемого паттерна, а время вычислений при этом на удивление малО.
Для получения десятичных частей математические функции mod() и floor() гораздо более эффективны по сравнению с текстовой функцией подстроки mid().
Я стремился сделать карту похожей на крысиный лабиринт, поэтому создавал блоки не сплошными, чтобы они походили не на пещеры (в стиле Minecraft), а на лабиринт.
То есть нам нужны тонкие стены с двумя возможными стенами для каждого квадрата. Тогда мы сможем брать два блока чисел вместе с тем же случайным значением.
Плотностью размещения стен управляют два параметра.
С учётом этих правил мы можем или отображать лабиринт, или тестировать любую стену с заданной позицией с помощью трассировки лучей.
Стоит заметить, что карта «плоская», без подъёмов и спусков. Можно было добавить рельеф с помощью генератора рельефа (подошёл бы алгоритм Diamond-Square, потому что его можно написать без рекурсивной функции), но весь последующий процесс сильно облегчило бы вырезание отверстий в полу и потолке с дополнительным значением уровня.
Так, похоже, мы в аду
Трассировщик лучей должен определять для каждого пикселя экрана, какой первой поверхности касается луч, и получать от неё информацию (расстояние, угол падения света, цвет и т.д.).
Кроме того, трассировщику лучей требуется дополнительный луч, распространяющийся из этой точки (отражения, прозрачность), что напрямую увеличивает вычислительные затраты.
Окклюзия
Первым сложным моментом будет нахождение первого объекта на пути каждого луча.
Поскольку лабиринт на самом деле плоский с горизонтальными стенами, то ближайшая найденная стена будет одинаковой для всех пикселей одного столбца.
То есть процесс можно упростить до горизонтального «радара» в одном измерении.
Тогда у нас нет иного выбора, кроме как проверять луч на первой вероятной стене, потом на второй вероятной, и так далее, пока мы не найдём нужную.
Определение того, какую стену нужно проверять — это всего лишь тригонометрическая задача.
И поскольку у нас всего два типа стен, мы можем тестировать оба типа, а потом сохранять только ближайшую.
Одно из ограничений Excel заключается в отсутствии условного цикла и для экономии времени можно только пропускать тело цикла. Поэтому нам нужно ограничить максимальное расстояние проверки, считая, что если на этом расстоянии стена не найдена, то её нет.
Пол и потолок
Чтобы определить потолок и пол, нам достаточно определить, где заканчивается стена.
Отдельный лист изменяет расстояние до пола или потолка в зависимости от вертикального угла.
Затем для каждого пикселя мы определяем, дальше ли стена, чем потолок или пол, и соответствующим образом задаём цвет пикселя.
Эффективное сравнение реализовано использованием только проекции расстояния до стены и до пола/потолка по оси камеры. Конечное расстояние затем получается с помощью предварительно вычисленного коэффициента расстояния в шейдере расстояний. Постоянные предварительно вычисленные значения нужны для экономии ресурсов.
Освещение
Конечное освещение берётся из шейдера освещения, представляющего собой свет факела, в направлении камеры (и оружия).
Когда поверхность точно горизонтальна к лучу света, также добавляется отражение.
Стена может быть только горизонтальной (если добавить наклон, то он просто смещает окно экрана вверх и вниз, не поворачивая камеру)
Для каждого угла радара мы получаем угол между лучом и ближайшей найденной стеной.
Коэффициент отражения — это просто функция угла.
В конце концов освещение становится результатом функции коэффициента расстояния, потолка/пола или разрешения стен, коэффициента отражения и коэффициента шейдера освещения.
Экран дисплея
Эффективный дисплей реализуется с помощью условного форматирования — градиент цвета зависит от значения ячейки.
Сокрытие значения выполняется форматированием ячейки.
Игрок не должен проходить сквозь стены, иначе это разрушит весь смысл лабиринта.
Кроме того, игрок не должен прилипать к стене при контакте с ней. Он должен двигаться, скользя вдоль стены, пока не попадёт в угол.
Также необходимо соблюдать минимальное расстояние между стеной и игроком, чтобы избежать графических проблем и придать стенам толщину.
Оказалось, что довольно сложно обработать все возможные варианты стены и позиций игрока относительно этой стены.
Изучено 25 вариантов и к ним привязано три возможных исхода (для каждой оси смещения), чтобы получать результаты за как можно меньшее количество проверок.
Несмотря на то, что это казалось самой короткой частью игры, таблица смещений стала самой сложной в реализации. (В 10 раз больше, чем карта, в два раза больше кода распознавания стен.)
Привет, красное привидение!
Графический рендеринг
Сложность с врагами заключалась в том, чтобы получить форму, которую легко можно располагать перед стеной, легко рендерить на любом расстоянии, и которая будет интереснее, чем простой куб.
Целый отдельный лист посвящён вычислению формы сфер с учётом горизонтального радиуса и вертикальной высоты овоида. Для анимирования существа используется соотношение высоты/ширины.
В рендеринге стен и потолка используется градиент только по одному цвету, однако Excel позволяет использовать два последовательных (не сливающихся) градиента. Поэтому врагов можно отображать другим цветом. Для этого градиента можно использовать диапазон значений ниже 0, при том, что значение 0 — это чёрный цвет.
Меняющуюся прозрачность реализовать оказалось не сложнее, чем плавный рендеринг поверхности сферы. Луч получает толщину сферы, делая пиксель более цветным.
На границе сферы низкая толщина сохраняет только значение цвета по умолчанию стены за ней с отрицательным коэффициентом для превращения его в цвет монстра. Фильтр цвета освещения обеспечивает прозрачность на границе сферы.
Здесь вычисления тоже производятся в горизонтальной плоскости, а максимальный объём вычислений подготавливается перед завершением 3D-вычислений для каждого пикселя.
Поведение врагов
Чтобы избежать реализации сложного и некачественного процедурного поведения, враги не будут реагировать на действия игрока. Их позиция определяется только временем, они движутся по сложной траектории, чтобы паттерн был не таким заметным.
Чтобы позиция, скорость и ускорение были непрерывными (для плавного движения), я сделал траекторию своего рода конечным фракталом большого круга с добавленными к нему небольшими круговыми вариациями. Коэффициент соотношения между кругами (и даже соотношение x/y) случаен и ненатурален, поэтому траектория никогда не самозацикливается. Чтобы получить хороший случайный генератор детерминированных траекторий, я создал отдельный лист, отображающий траекторию.
Так как траектории не могут учитывать стены, я был вынужден оставить монстрам возможность проходить сквозь них.
В каждый момент времени вычисляется несколько траекторий. Весь лабиринт населён одними и теми же десятью врагами, расположенными в сетке на значительном расстоянии, чтобы игрок не мог увидеть двух одинаковых монстров одновременно.
Можно уменьшать/увеличивать сетку повторов, чтобы повышать/снижать плотность расположения врагов. При этом следует внимательно следить за конечным смещением монстра, чтобы оно не было чрезмерным, и за скоростью, изменяющейся при масштабировании.
Создав ограниченное количество управляемых врагов, можно скопировать их по всему лабиринту.
Атаки врагов
Анимация врагов сделана с помощью соотношений их радиуса/высоты. Так как атака врага должна быть чётко заметна, но в то же время достаточно медленной, чтобы игрок смог отреагировать, враги просто увеличиваются в радиусе, когда замечают игрока. Рост соответствует экспоненциальной функции, симулирующей взрыв.
Область видимости каждого монстра вычисляется на вкладке радара с учётом расположения стен.
Игрок получает урон, когда он оказывается внутри радиуса врага. Если игрок специально забирается внутрь врага, происходит то же самое.
Это создаёт эффект наносимого игроку урона — простой эффект негативного цвета во весь экран.
Добавлен также ещё один эффект — отмена рендеринга всех остальных врагов при нанесении урона игроку.
Жизнь игрока указана как один из элементов его статуса, который обрабатывается поэтапно, как и его положение.
Атаки игрока
Каждый враг получает значение статуса, определяющее его оставшуюся жизнь и фазу атаки. При некоторых значения враги просто не отображаются, при некоторых других враги медленно регенерируют, а последнее заставляет врага взорваться.
Эта упрощённая модель позволяет игроку предотвратить атаку врага, снизив его жизнь до нуля.
Чтобы увеличить сложность, добавлена сложность прицеливания в маленьких врагов, которые остаются на дальнем расстоянии, а боеприпас через какое-то время требует перезарядки.
При убийстве враг просто переходит в состояние бездействия и медленной регенерации. Так как по всей карте повторяется несколько врагов, ни одного из них нельзя уничтожать полностью.
Смерть и перезапуск
Когда жизнь игрока снижается до нуля, бОльшая часть его действий приостанавливается и появляется экран конца игры.
Этот экран рендерится с помощью ещё одного шейдера освещения. К цвету применён эффект негатива, чтобы подчеркнуть нанесение урона.
Постепенное отображение сообщения «game over» реализовано с помощью небольшого коэффициента, увеличивающегося как степенная функция. Это позволяет будущим пикселям оставаться скрытыми до их появления, когда степень становится достаточно большой.
Сдвигание вниз — это простое смещение шейдера освещения, в который добавлены другие сообщения, например, рекорды (high score) и перезапуск игры.
Очки должны отрисовываться с помощью пикселей шрифтом очень низкого разрешения.
При перезапуске генерируется новый начальный параметр, а сам игрок отправляется в другую точку, чтобы не встретиться с теми же врагами.
Excel макросы: генератор примеров по математике
Курс «Excel макросы: Генератор простых примеров по математике» поможет научиться писать программы в Excel с помощью макросов на примере формирования примеров по математике случайным образом.
О курсе
➤ Курс для новичков (12+),
➤ Необходимо: базовые знания excel и английского языка,
➤ Дата: когда удобно,
➤ Доступ к урокам: 3 месяца,
➤ Место: в любом месте.
➤ С помощью данного курса Вы последовательно изучите основы написания макросов в excel;
➤ Структура курса покажет важность и практичность всех операций и функций на примере;
➤ Полученные знания можно использовать при написании макросов для решения любых задач;
➤ В конце курса даны шаблоны макросов, которые можно использовать как базу или шпаргалку.
Программа курса
Курс состоит из 10 уроков + шаблоны готовых макросов. Первый урок находится в свободном доступе. Второй и третий уроки доступны бесплатно после регистрации.
- Начало работы с макросами: что такое макрос и вкладка разработчик, какие есть способы написания макросов, безопасность макросов и сохранение книг с макросами.
- Основы работы с макросами: основные элементы окна; как создать и запустить макрос, создать кнопку для выполнения макроса.
- Макрорекодер Excel: что такое макрорекодер, когда его лучше использовать, запись макроса макрорекодером, просмотр кода и выбор команд.
- Составление примера по математике случайным образом: проверка значений по условию, как соединить текст и число, выбрать запись в зависимости от полученного значения.
- Использование цикла в макросе Excel для формирования нужного количества примеров: запуск одного действия в разных ячейках, проверка и запись значений.
- Редактирование кода для создания универсального макроса: как изменить базовый макрос и сделать универсальный макрос, который учитывает разные варианты.
- Ответы к примерам и номер карточки: изменить текст, выбрать часть текста или определенные символы, форматирование текста с помощью макросов..
- Элементы управления макроса: полоса прокрутки и ее настройка, изменение кода макроса для ее работы, дополнительный код для визуализации.
- Примеры по математике с автопроверкой ответов: работа макроса на разных листах, использование данных из других ячеек, проверка данных по разным условиям.
- Примеры базовых готовых макросов excel, которые можно использовать в качестве основы для написания макроса, чередуя их между собой: значения и формулы, форматирование ячеек, применение условий и циклов.
Добавить в корзину Перейти к урокам
Примеры программ, которые вы сможете составить по итогам курса
✅ Курс полностью практический. После каждого урока полученные знания закрепляются путем составления программы по формированию случайных примеров.
✅ Четкая структура. Блочная система обучения помогает легко находить любую тему. Поэтапно описаны все необходимые конструкции.
✅ Формат курса: автотренинг , где каждый последующий урок доступен после прохождения предыдущего.
✅ Материалы курса: видео, готовый код для ознакомления, блоки с комментариями, файлы для скачивания.
С помощью курса вы напишите свою первую программу с помощью макросов уже после нескольких часов обучения.
По итогам курса вы получите
✅ Доступ к сборнику универсальных готовых макросов с комментариями, которые можно применять для выполнения различных задач.
✅ Возможность сэкономить время и деньги. С помощью макросов Вы сможете значительно сэкономить время работы, чтобы потратить его с пользой. А готовые макросы урока позволят Вашему ребенку гораздо быстрее приобрести навыки счета, постоянно решая примеры. Вам не придется покупать различные задачники или программы с примерами. Вы сами сможете написать программу, которая случайным образом создаст список примеров на сложение, вычитание, умножение и деление.
Добавить в корзину Перейти к урокам
Преподаватель курса
- Опыт работы: экономист, аналитик, программист в области Excel. Везде требовалось умение работать с очень большим объемом данных, в том числе систематизировать сведения по-разному для разных отчетов. Общий стаж работы с Excel около 20 лет.
- О себе: Я не люблю работать «руками» и стараюсь максимально автоматизировать свою деятельность. Это позволяет сделать работу на много быстрее, в результате чего появляется много свободного времени.
- Как появилась идея создать курс? Когда ребенок пошел в первый класс (это было несколько лет назад), возникла необходимость тренироваться в решении примеров по математике. Сначала в пределах 10, потом — в пределах 20 и т.д. В интернете были повторяющиеся карточки, а руками писать приходилось долго. Вот тогда я написала первую программу по формированию примеров. Она была очень простой. Этой программой стали интересоваться знакомые. Но так как у них не было знаний в области макросов, я ее полностью автоматизировала. Весь процесс написания макроса по формированию примеров изложен в курсе поэтапно.
Пожалуйста, оставьте отзыв о курсе: что понравились или не понравилось, что можно изменить или чем дополнить? А также напишите свои пожелания о новых курсах Excel.
Кстати, если вы уже интересовались ценами на курсы по обучению работе с макросами, то знаете, что они не дешевые. А это уникальная возможность проверить свои способности.
Независимо от того, сможете вы в дальнейшем применить эти знания или нет, у вас останется готовый макрос с комментариями. В нем вы сможете изменить по инструкции всего несколько элементов, чтобы генерировать разные примеры по математике.
Изучение макросов Excel путем изучения кода и примеров
Паула Гилфойл
Паула Гилфойл
цена за конверсию | Основатель и генеральный директор A Block Of Crypto, делающий криптовалюту и блокчейн такими же простыми, как ABC | Преподаватель и консультант World Class Web3 (+250 тыс. студентов)|
Опубликовано 23 мая 2014 г.
+ Подписаться
Один из лучших способов изучить Excel VBA (макросы) — изучить примеры кода и примеры; поэтому по этой причине вот полезный код для начала.
В этом примере мы будем использовать макрос для вставки верхнего и нижнего колонтитула на каждый лист в активной книге. Он также вставляет полный путь к книге. Вам нужно будет изменить левый нижний колонтитул на название вашей компании.
На следующей неделе в моем личном блоге Excel я дам вам еще один пример кода, на который вы можете взглянуть. Щелкните здесь, чтобы просмотреть предыдущие сообщения блога Excel
Скопируйте и вставьте код ниже
Sub InsertHeaderFooter()
‘ вставляет один и тот же верхний/нижний колонтитул во все рабочие листы
Dim ws As Worksheet
Application.Screen Обновление = Ложь
Для каждого ws в ActiveWorkbook.Worksheets
Application.StatusBar = «Изменение верхнего/нижнего колонтитула в » & ws.Name
С помощью ws.PageSetup
.LeftHeader = «С благодарностью www.theexcelclub.com»
.CenterHeader = «Страница &P из &N»
.RightHeader = «Печать &D &T»
. LeftFooter = «Путь: » & ActiveWorkbook.Path
.CenterFooter = «Имя рабочей книги &F»
.RightFooter = «Имя листа &A»
End With
Next ws
Set ws = Nothing
Application. StatusBar = False
End Sub
Понимание вашего сообщества: сила карт эмпатии
15 июня 2023 г.
Uniswap и не только: будущее DEX в мире DeFi
1 января 2023 г.
Reddit и Web3 — пример из практики
22 ноября 2022 г.
Мои лучшие сообщения в блоге Excel за 2020 год
14 декабря 2020 г.
Хватит тратить время и начните совместную работу в Excel
6 ноября 2019 г.
Простые решения для Excel: отношения «многие ко многим» в Power Pivot
29 декабря 2018 г.
DAX COUNT и COUNTX — влияние использования показателей и вычисляемых столбцов
21 декабря 2018 г.
Функции DAX SUM и SUMX
19 декабря 2018 г.
DAX — Когда использовать FILTER внутри CALCULATE
18 декабря 2018 г.
Поиск и объединение текста с использованием операторов TEXTJOIN и Array IF.
14 декабря 2018 г.
Увидеть все
Старая школа: злые макросы Excel 4.
0 (XLM)
В этом посте я углублюсь в макросы Excel 4.0 (также называемые макросами XLM, а не XML) в наступательных целях. Если вы выросли в эпоху Windows 95 или позже, как и я, вы, возможно, никогда не слышали об этой технологии, которая была представлена еще в 19 веке.92. Практически все вредоносные макродокументы для MS Office основаны на Visual Basic for Applications (VBA). Тем не менее, макросы XLM являются скрытой жемчужиной для красных команд и оказываются очень хорошей альтернативой макросам VBA для наступательных целей: XLM может быть трудно анализировать, и похоже, что большинство антивирусных решений имеют проблемы с обнаружением вредоносных документов XLM. И хотя этой технологии уже 26 лет, макросы Excel 4.0 по-прежнему поддерживаются в самых последних версиях Microsoft Office (включая Office 2016 на момент написания статьи).
Этот пост в блоге представляет собой тизер презентации Питера Силена и Стэна Хегта под названием «Волшебное шоу MS Office» на DerbyCon 2018 (воскресенье, 13:00). После презентации видео и слайд-материалы будут опубликованы в Интернете.
Справочная информация
В 1992 году была выпущена программа для работы с электронными таблицами Excel 4.0 для Windows 3.0 и 3.1. Для автоматизации в этой версии Excel можно использовать макросы XLM через так называемые рабочие листы макросов. Концепция XLM сильно отличается от макросов Visual Basic для приложений (VBA), которые были представлены годом позже в Excel 5.0. Чтобы дать вам представление о том, сколько лет этому материалу: нашему давно потерянному другу Клиппи не было представлено до 19 лет.96.
Привет, мир XLM макрос
Давайте намочи ноги. Для создания макроса XLM в последних версиях Excel можно выполнить следующие шаги:
Шаг 1. Вставка листа макроса
Создайте новую книгу Excel. Щелкните правой кнопкой мыши «Лист1» в нижней части экрана и нажмите «Вставить».
Появится окно, позволяющее выбрать один из объектов для вставки. Выберите «Макрос MS Excel 4.0» и нажмите «ОК».
Шаг 2: Напишите свой макрос
Создан новый рабочий лист под названием «Макрос1». Это специальный тип рабочего листа, в который можно вводить макросы XLM (так называемый лист макросов). Щелкните любую ячейку и введите формулы «=EXEC(«calc.exe»)», «=ALERT(«Hello world»)» и «=HALT()» в этой ячейке и последующих ячейках ниже.
Шаг 3: Запустите макрос
Чтобы протестировать макрос, щелкните правой кнопкой мыши первую ячейку, содержащую код макроса, и выберите «Выполнить». Появится новое окно. Это должно содержать имя первой ячейки, содержащей ваш код макроса (в моем случае по умолчанию «R1C1» для строки 1, столбца 1). Нажмите «Выполнить», чтобы выполнить макрос, а затем просмотреть калькулятор и всплывающее окно MessageBox.
Если вы хотите, чтобы ваш макрос запускался автоматически при открытии книги (аналогично Sub AutoOpen() для макросов VBA), переименуйте первую ячейку вашего макроса в «Auto_open».
При желании вы можете скрыть рабочий лист макроса, щелкнув правой кнопкой мыши имя листа («Макрос1») и выбрав «Скрыть». Макросы Auto_open XLM по-прежнему будут выполняться из скрытых рабочих листов.
Доступ к Win32 API с использованием XLM
Макросы XLM — это очень богатый язык, предоставляющий множество наступательных возможностей. Многие вещи, которые вы можете делать с помощью VBA, также могут быть достигнуты с помощью макросов XLM. Одним из больших исключений является COM, поскольку объектная модель компонентов (COM) была представлена только в 1993, через год после Excel 4.0.
В нашем первом примере мы уже изучили функцию EXEC, которую можно использовать для создания процессов. Для выполнения более сложных наступательных действий вам понадобится доступ к Win32 API. Этого можно добиться с помощью функций РЕГИСТРАЦИЯ и ВЫЗОВ. Код, показанный ниже, демонстрирует концепцию внедрения шелл-кода с использованием макросов XLM. Среди прочего, я успешно протестировал его с полезной нагрузкой Cobalt Strike.
Я предполагаю, что вы знакомы с концепцией внедрения шелл-кода, поэтому здесь я буду обсуждать только особенности XLM. Используя функцию REGISTER, мы можем загрузить экспортированную функцию DLL, включая библиотеки DLL Win32 API. Синтаксис этой функции следующий:
REGISTER(имя_модуля, имя_процедуры, тип, псевдоним, аргумент, тип_макроса, категория)
- Имя_модуля — это имя библиотеки DLL, например «Kernel32» для c:\windows\system32\kernel32.dll.
- Имя_процедуры — это имя экспортируемой функции в DLL, например «VirtualAlloc».
- Тип — это строка, определяющая типы возвращаемого значения и аргументов функций. Подробнее об этом ниже.
- Псевдоним – это пользовательское имя, которое вы можете дать функции, по которому вы сможете вызывать ее позже.
- Аргумент может использоваться для именования аргументов функции, но является необязательным (и оставлен пустым в нашем коде).
- Macro_type должен быть равен 1, что обозначает функцию.
- Категория — это номер категории (используемый в старых функциях Excel). Для нашей цели мы можем указать произвольный номер категории от 1 до 14.
Самая большая проблема при работе функций API Win32 с макросами XLM заключается в сопоставлении типов, ожидаемых функциями API Win32, с доступными типами данных Excel 4.0. Обзор доступных типов данных можно найти здесь. Каждый тип данных помечается буквой от «A» до «R». Первая буква в аргументе типа определяет тип возвращаемого значения, а последующие буквы указывают типы аргументов. Таким образом, строка «JJJCJJ», используемая в нашем примере при регистрации WriteProcessMemory, указывает, что возвращаемое значение для этой функции представляет собой тип long int («J») и передается 5 аргументов типов данных Excel 4.0 long int, long int, string («C»), long int, long int соответственно.
В этом коде проверки концепции есть несколько предостережений. Прежде всего, это понятие переменных. Переменные в макросах XLM существуют благодаря концепции значений в ячейках. Нам нужна переменная (следовательно, ячейка) для хранения нашего шеллкода, но ячейки не могут содержать различные непечатаемые символы. К счастью, мы можем использовать функцию =CHAR() для кодирования этих специальных символов. Кроме того, ячейки не могут содержать нулевые байты, поэтому мы должны удалить их из нашей полезной нагрузки (это можно сделать с помощью различных инструментов, таких как msfvenom). Наконец, мы сталкиваемся с проблемой максимальной длины ячейки в листах макросов XLM. Следовательно, именно поэтому наше доказательство концепции повторяет вызов WriteProcessMemory по всем ячейкам во втором столбце до тех пор, пока не встретится значение «END» с использованием цикла WHILE.
PoC грязный, но он работает и ясно демонстрирует наступательные возможности, которые могут быть достигнуты с помощью макрофункций XLM и Excel 4.0. И я почти уверен, что есть элегантные решения проблем, с которыми мы столкнулись. Например, наша полезная нагрузка может храниться не только в ячейках, но и в других местах (подсказка: взгляните на функцию GET.WORKBOOK для получения метаданных рабочей книги).
Отличный справочный документ по функциям, поддерживаемым в макросах Excel 4.0, можно найти здесь.
Поддержка XLM
Макросы Excel 4.0 по-прежнему поддерживаются по умолчанию во всех последних версиях Microsoft Office, включая Office 2016. Хотя файлы с расширением .xlm заблокированы для открытия по умолчанию в последних версиях Office, макролисты XLM можно использовать в файлах .xls и .xlsm (среди прочего есть несколько интересных типов файлов, которые мы обсудим в нашей презентации на DerbyCon). Насколько мне известно, макросы XLM поддерживаются только в Excel, а не в других приложениях MS Office, таких как Word или PowerPoint. Обычное предупреждение о макросе (желтая полоса), знакомое вам по макросам VBA, также относится к макросам XLM.
Антивирус борется с XLM
По сравнению с макросами VBA макросы XLM хранятся в файлах Excel совершенно по-другому. В более новом формате файла Excel .xlsm, который представляет собой ZIP-контейнер на основе XML, макролист XLM хранится в файле XML в подкаталоге «macrosheets» (подсказка: прочитайте это предложение еще раз и обратите внимание на разницу между XML и XLM).
В формате Excel 97–2003 (.xls, Compound File Binary Format) данные хранятся в потоках OLE в контейнерах. Как видно на следующем снимке экрана, макросы VBA хранятся в отдельном контейнере (левый экран), а макросы XLM встроены в поток OLE Workbook. Это большая разница!
Из-за этой разницы в файловой структуре макросы XLM, вероятно, сложнее анализировать для продуктов безопасности. Мы провели ограниченное тестирование и пришли к выводу, что макросы XLM — слепое пятно для антивирусной индустрии. В качестве доказательства обратите внимание на следующий снимок экрана, показывающий, что наш шелл-код, вводящий макрос XLM, не обнаружен ни одним антивирусным движком в VirusTotal на момент написания (аналогичный код в макросах VBA обычно имеет очень высокий коэффициент обнаружения):
Обход AMSI
Корпорация Майкрософт недавно объявила, что интерфейс сканирования на наличие вредоносных программ (AMSI) теперь интегрируется с Office 365 для сканирования макросов VBA.