Почему не работает макрос в excel

С макрос

Предположим, Вы скачали файл с данного сайта с примером макроса, открываете файл, но макросы в нем не работают! Как такое может быть? Неужели автор сайта выложил неработающий пример и не знает об этом? И тем более как может случиться такое, что Вы перенесли со своего ПК на другой ПК файл с рабочими макросами на флешке, запускаете, а он не работает… Почему? Вроде все правильно делаете, да ведь и у Вас работает на ПК. И начинает закрадываться мысль: «А чем же этот ПК и Excel на нем такие особенные?». А ответ может быть прост — перед выполнением макроса не было разрешено выполнение этих самых макросов. Да, в большинстве случаев по умолчанию выполнение макросов в Excel отключено. И их надо включить. Для этого:

  • Excel 2003:
    Сервис-Безопасность-Уровень макросов «Низкий»
  • Excel 2007:
    Кнопка Офис-Параметры Excel(Excel Options) -Центр управления безопасностью(Trust Centr) -Параметры центра управления безопасностью(Trust Centr Settings) -Параметры макросов(Macro Settings) -Разрешить все макросы(Enable All Macros)
  • Excel 2010-2016:
    Файл(File)-Параметры(Options) -Центр управления безопасностью(Trust Centr) -Параметры центра управления безопасностью(Trust Centr Settings) -Параметры макросов(Macro Settings) -Разрешить все макросы(Enable All Macros)

После изменения параметров безопасности макросов необходимо перезапустить приложение Excel: закрыть его полностью и открыть заново. Только после этого изменения вступят в силу.

Если макросы уже включены, но некоторые макросы отказываются работать (как правило те, которые записаны в модулях листов и книг и запускаются при наступлении определенного события — Worksheet_SelectionChange (выделение ячеек), Worksheet_Change (изменение значений ячеек) и т.п.), то скорее всего когда-то вы выполнили какой-нибудь макрос и он отключил отслеживание событий. Тогда надо в любую активную книгу добавить модуль(переходим в редактор VBA(Alt+F11) -Insert -Module), вставить в него приведенный ниже код и запустить:

Sub Reset_Events() Application.EnableEvents = True End Sub

чтобы запустить(выполнить) данный макрос макрос необходимо установить курсор в любое место между Sub и End Sub и нажать клавишу F5.

Так же см.:
Управление безопасностью макросов
Как запустить файл с включенными макросами?

Статья помогла? Поделись ссылкой с друзьями!Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки Надстройки Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx

Набрали документ, сохранили его, потом пытаетесь открыть и получаете ошибку?

Проблема не нова, решается очень просто. Файл с расширением *.docm обычно получается при сохранении документа в Microsoft Word в формате «С поддержкой макросов». Есть такой пункт в меню при сохранении файла.

Как открыть файл docm?

Нужно просто переименовать расширение docm в docx и файл прекрасно откроется, если на компьютере установлен Microsoft Office версии не ниже 2007. Переименовать расширение файла не сложно. По умолчанию в Windows XP, Vista, 7, 8, 10 установлена настройка для скрытия расширений от пользователя чтобы он случайно не смог что-то удалитьнапутать. Чтобы отключить эту своего рода «защиту» нужно:

1. В панели управления Windows открыть «свойства папки» или (параметры папки), затем во вкладке «Вид» находим пункт «Скрывать расширения для зарегистрированных типов файлов» и снимаем галочку, затем нажимаем применить.

Теперь у нас рядом с именем файла появляется и его расширение

2. Переименовываем расширение нашего файла из docm в docx.

3. Всё, файл прекрасно открывается.

Если у вас на компьютере установлен Microsoft Office версии ниже 2007, то просто скачайте пакет обеспечения совместимости с официального сайта, позволяющий открывать любые документы версий 2007, 2010 в старых версиях офиса.

Перевод статьи «How to properly use macros in C»

Программисты Си, дойдя до определённого уровня квалификации, обязательно сталкиваются с одной из особенностей этого языка — макросами. Почти во всех других языках аналога макросов нет. И это неспроста. Использование макросов может оказаться весьма небезопасным. В них скрывается ряд особенностей, специфика которых не всегда лежит на поверхности.

Прим. перев. Макросы в таких языках, как Lisp, Scala и Rust, во многом лишены тех проблем и недостатков, которые описаны в этой статье.

Макросы и функции

При первом знакомстве макросы могут показаться обычными вызовами функций. Конечно, у них немного странный синтаксис, но они «ведут себя» как обычные функции. Тогда в чём разница?

Макрос можно условно назвать функцией обработки и замены программного кода: после сборки программы макросы заменяются макроопределениями. Вот как это выглядит:

#include <stdio.h> #define SUM(x, y) (x + y) int main(int argc, char *argv)

Этот код преобразуется в следующий:

/* обработанный код опущен */ int main(int argc, char *argv)

При вызове же функции под неё выделяется новый стековый кадр, и она выполняется самостоятельно и не зависит от места в коде, откуда была вызвана. Таким образом, переменные с одинаковыми именами в разных функциях не вызовут ошибку, даже если вызывать одну функцию из другой.

Но если попытаться проделать такой же трюк с помощью макроса, то во время компиляции будет выброшена ошибка, так как обе переменные в итоге будут находиться в одной функции:

#include <stdio.h> #define bar() \ int var = 10;\ printf(&#171;var in bar: %d\n&#187;, var) void foo() < int var = 5; printf(&#171;var in foo: %d\n&#187;, var); bar(); >int main(int argc, char *argv)

Один из способов решить эту проблему — поместить тело макроса в новую область видимости имён:

Но если просто обернуть его в блок, то может возникнуть такая проблема: блок, в который раскроется использование bar, и стоящая после него точка с запятой будут учтены как две разные команды, и в результате, встретив else, компилятор выдаст ошибку.

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

Обычно эту проблему решают с помощью такого трюка:

Такой цикл выполнится только один раз, но поскольку конструкция do-while в Си требует точки с запятой после условия, стоящая после макроса точка с запятой будет отнесена к нему, а не воспринята как отдельная команда.

Более того, функции выполняют проверку типов: если функция ожидает на входе строку, а получает число, будет выброшена ошибка (или, по крайней мере, предупреждение, в зависимости от компилятора). Макросы в то же время просто заменяют аргумент, который им передан.

И, наконец, макросы не подлежат отладке. В отладчике можно войти в функцию и пройтись по её коду, а вот с макросами такое не пройдёт. Поэтому, если макрос почему-то сбоит, единственный способ выявить проблему — переходить к его определению и разбираться уже там.

Прим. перев. Чтобы не переходить к определению каждого макроса, можно попросить компилятор раскрыть макросы — это можно сделать с помощью команды gcc -E source.c. Имейте в виду, что если вы включаете в свой код с помощью #include стандартные заголовочные файлы, после препроцессинга в коде может оказаться много тысяч строк, так что стоит перенаправить вывод компилятора в файл.

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

Прим. перев. Интересный подход к оптимизации использования ресурсов в программе на Си рассмотрен в другой нашей статье.

В C99 и C++ существует альтернатива макросам — встраиваемые (inline) функции. Если добавить ключевое слово inline перед функцией, компилятору будет дано указание включить тело функции в место её вызова (по аналогии с макросом). При этом встраиваемые функции могут быть отлажены, и у них есть проверка типов.

Однако ключевое слово inline — это просто подсказка для компилятора, а не строгое правило, и компилятор может проигнорировать эту подсказку. Чтобы этого не произошло, в gcc есть атрибут always_inline, который заставляет компилятор встроить функцию.

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

Когда использовать макросы в Cи

Передача аргументов по умолчанию

В C++ есть весьма удобный инструмент, которого нет в Си, — аргументы по умолчанию:

В Си задача опциональных аргументов может быть решена с помощью макросов:

#include <iostream> #define printErrord(errorCode) printError(errorCode, &#171;No message&#187;) void printError(int errorCode, char *msg) < printf(&#171;Error code: %d (%s)\n&#187;, errorCode, msg); >int main(int argc, char *argv)

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

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

Некоторые компиляторы предопределяют макросы, которые нельзя использовать в функциях: __FILE__, __LINE__, __func__.

Их можно включать в определения макросов, используемых для отладки:

#include #define log_info(M, &#8230;) fprintf(stderr, &#187; (%s:%d) &#187; M &#171;\n&#187;,\ __FILE__, __LINE__, ##__VA_ARGS__) int main(int argc, char *argv)

В итоге получается интересный способ ведения логов.

Модификация синтаксиса

Это очень мощная особенность макросов. Используя её, можно создать свой собственный синтаксис.

Например, в Cи нет конструкции foreach. Но её можно создать через макрос:

#include <stdio.h> struct ListNode; typedef struct ListNode < struct ListNode *next; struct ListNode *prev; void *value; >ListNode; typedef struct List < int count; ListNode *first; ListNode *last; >List; #define LIST_FOREACH(curr, list) \ ListNode *curr = list->first;\ for (ListNode *_node = list->first; \ _node != NULL; \ curr = _node = _node->next) int main(int argc, char *argv) < List *lst; /* Fill the linked list */ LIST_FOREACH(curr, lst) < printf(&#171;%d\n&#187;, (int)curr->value); >>

В этой вставке кода определена структура, содержащая связный список. Предполагая, что его узлы заполнены, можно пройтись по нему с помощью LIST_FOREACH так же, как и при использовании foreach в современных языках.

Эта техника действительно очень эффективна и при правильном использовании может дать довольно хорошие результаты.

Другие типы макросов

Помимо макросов, которые подменяют функции, есть и другие очень полезные директивы препроцессора. Вот некоторые из наиболее часто используемых:

  • #include — включить содержимое стороннего файла в текущий файл,
  • #ifdef — задать условие для компиляции,
  • #define — определить константу (и, конечно же, макрос).

#ifdef играет ключевую роль при создании заголовочных файлов. Использование этого макроса гарантирует, что заголовочный файл включён только один раз:

#ifndef MACROS_IN_C_H #define MACROS_IN_C_H /* Прототипы функций */ #endif // MACROS_IN_C_H

Стоит отметить, что основное предназначение #ifdef — условная компиляция блоков кода на основе некоторого условия. Например, вывод отладочной информации только в режиме отладки:

#include <stdio.h> #ifdef DEBUG #define log_info(M, &#8230;) fprintf(stderr, &#187; (%s:%d) &#187; M &#171;\n&#187;,\ __FILE__, __LINE__, ##__VA_ARGS__) #else #define log_info(M, &#8230;) #endif int main(int argc, char *argv)

Как правило, для определения констант используется #define, но в некоторых проектах его заменяют на const и перечисления (enum). Однако при использовании любой из этих альтернатив есть свои преимущества и недостатки.

Использование ключевого слова const, в отличие от макроподстановки, позволяет произвести проверку типов данных. Но в Cи это создаёт не совсем полноценные константы. Например, их нельзя использовать в операторе switch-case и для определения размера массива.

Прим. автора В C++ переменные, определённые ключевым словом const, являются полноценными константами (их можно использовать в приведённых выше случаях), и настоятельно рекомендуется использовать именно их, а не #define.

Перечисления в то же время — полноценные константы. Они могут использоваться в операторах switch-case и для определения размера массива. Однако их недостаток заключается в том, что в перечислениях можно использовать только целые числа. Их нельзя использовать для строковых констант и констант с плавающей запятой.
Вот почему использование #define — оптимальный вариант, если нужно достичь единообразия в определении различного рода констант.

Таким образом, у макросов есть свои преимущества. Но использовать их нужно весьма аккуратно.

Подводные камни при использовании макросов

Отсутствие скобок

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

#include <stdio.h> #define MULTIPLY(x) (x * 5) int main(int argc, char *argv)

В этом примере выполняется вычисление MULTIPLY(x + 5) и ожидаемый результат — 50. Но в процессе подстановки произойдёт следующее преобразование:

MULTIPLY(x + 5) -> (x + 5 * 5)

Как несложно подсчитать, данное выражение выдаст не 50, а 30.

А вот как выполнить данную задачу правильно:

#include <stdio.h> #define MULTIPLY(x) ((x) * 5) int main(int argc, char *argv)

Инкремент и декремент

Допустим, есть такой код:

#include <stdio.h> #define ABS(x) ((x) < 0 ? -(x) : (x)) int main(int argc, char *argv)

Здесь можно ожидать, что x будет увеличен на единицу и будет равен 6, а результат — 5. Но вот что получится в реальной жизни:

Виновата всё та же макроподстановка: ABS(x++) -> ((x++) < 0 ? &#8212; (x++): (x++))

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

Передача вызовов функций

Использованием функции в коде никого не удивишь. Равно как и передачей результата одной функции в виде аргумента для другой. Часто это делается так:

#include <stdio.h> int bar() < return 10; >void foo(int num) < printf(&#171;%d\n&#187;, num); >int main(int argc, char *argv)

И в этой вставке кода всё в порядке. Но, когда это же производится с помощью макроса, можно столкнуться с серьёзными проблемами производительности. Допустим, есть вот этот код:

Здесь определена рекурсивная функция sum_chars. Она вызывается один раз для первой строки (str1) и другой раз — для второй (str2). Но, если передать вызовы функций, как аргументы для макроса, будет выполнено три рекурсивных вызова вместо двух. Для больших структур данных это станет узким местом производительности. Особенно, если макрос используется внутри рекурсивной функции.

Многострочные макросы

Программисты не всегда используют фигурные скобки вокруг единичных команд в циклах и условных операторах. Но, если произвести макроподстановку внутри этого блока, и этот макрос будет содержать несколько строк, это приведёт к весьма интересным результатам:

#include <stdio.h> #define MODIFY(arr, index)\ arr *= 5;\ index++; int main(int argc, char *argv) < int arr = < 1, 2, 3, 4, 5 >; int i = 0; while (i < 5) MODIFY(arr, i); for (i = 0; i < 5; ++i) < printf(&#171;ELEMENT %d: %d\n&#187;, i, arr); >>

Во вставке кода выше нет фигурных скобок в первом цикле и, так как макрос заменяет одну строку несколькими, только первое выражение в макросе выполняется в цикле. Следовательно, это приведёт к бесконечному циклу, так как i никогда не увеличится.

Прим. перев. Эту проблему также можно решить с помощью упомянутого выше трюка с do <> while (0).

Именно из-за таких особенностей многие стараются избегать использования макросов.

Хорошая практика

Чтобы свести к минимуму проблемы, вызванные использованием макросов, хорошей практикой будет использование единого подхода для определения макросов в вашем коде. Каким будет этот подход, не имеет значения. Есть проекты, в которых все макроопределения объявлены в верхнем регистре. В некоторых проектах в начале имени макроса используют букву &#171;m&#187;. Выберите себе любой подход, но этот подход должен быть таким, чтобы и вы, и другой программист, который будет работать с вашим кодом, сразу понимал, что имеет дело с макросами.

Прим. перев. Другие полезные практики оформления кода можно посмотреть в нашей статье.

Вывод

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

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Honor Cup, бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Страницы ← предыдущая следующая → 1 2 3 4 5 6 7 8 9 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ 1.2. Создание макроса в диалоговом режиме Как уже было указано во вводной части пособия, средства программного пакета Microsoft Office позволяют создавать простые программы без написания программного кода. Для того чтобы создать такую программу, пользователю следует один раз выполнить последовательность команд и инструкций, входящих в нее, и сохранить ее под определенным именем. Такой набор команд и инструкций в терминологии Microsoft Office называется макрокомандой или макросом, а средство, используемое для выполнения этой операции – макрорекордером. Созданный один раз макрос впоследствии можно многократно выполнять. Возможность создания и использования макросов существует в различных приложениях Microsoft Office: Microsoft Word, Microsoft Excel, Microsoft Access, Microsoft PowerPoint. В данном пособии мы рассмотрим процесс разработки макроса на примере программы Word (процессы создания макросов в различных приложениях Microsoft Office имеют некоторые несущественные отличия, но общие принципы работы с макросами во всех приложениях Microsoft Office остаются неизменными). Создание макроса начнем с того, что любым доступным в OC Windows способом запустим программу Word. Далее в этой программе следует открыть меню Сервис, в нем вложенное подменю Макрос, а в этом подменю запустить на выполнение команду &#171;Начать запись…&#187; (рис. 1.1). Рис. 1.1. Начало создания макроса в программе Microsoft Word В программе Microsoft Word существует и другой способ выполнить те же действия — достаточно дважды щелкнуть мышью на индикаторе ЗАП, который находится в строке состояния, расположенной в нижней части окна приложения. По умолчанию индикатор ЗАП закрашен бледно-серым цветом, т.е. он является неактивным. После двойного щелчка мышью индикатор окрашивается в черный цвет. Это изменение цвета говорит об активизации данного индикатора и включении макрорекордера. Выполнение указанной последовательности команд или двойной щелчок мышью на индикаторе ЗАП открывает диалоговое окно &#171;Запись 11 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ макроса&#187;, в котором пользователю предлагается присвоить имя создаваемому макросу. Изображение данного окна приведено на рис. 1.2. По умолчанию первый создаваемый пользователем макрос получает имя Макрос1, следующий Макрос2 и т.д. Понятно, что такие имена макросов малоинформативны, поэтому лучше в поле &#171;Имя макроса&#187;, находящееся в верхней части окна, ввести имя, которое бы отражало содержание данного макроса. Например, если мы хотим создать макрокоманду, которая выделяет слово, на котором установлен курсор, одновременно полужирным шрифтом и курсивом, то можно дать ей имя Жирн_Курс. Обратите внимание на то обстоятельство, что в имени макроса недопустимы пробелы. В том случае, если имя макроса состоит из двух или более слов (как в нашем примере), пробелы нужно заменять символом подчеркивания. Рис. 1.2. Диалоговое окно &#171;Запись макроса&#187; В этом диалоговом окне (в его центральной части) пользователю также предлагается назначить макрос панели (т.е. создать кнопку на панели инструментов для запуска макроса) или назначить макросу комбинацию клавиш, которая его выполняет. Выберем вариант с назначением комбинации 12 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ клавиш. При нажатии экранной кнопки с изображением клавиатуры открывается еще одно дополнительное диалоговое окно &#171;Настройка клавиатуры&#187;, внешний вид которого показан на рис.1.3. Рис. 1.3. Диалоговое окно &#171;Настройка клавиатуры&#187; до ввода комбинации клавиш Сразу после открытия окна поле Новое сочетание клавиш является пустым. В этом поле следует указать то сочетание клавиш, которое запускает макрос на выполнение. Необходимо ввести комбинацию из двух 13 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ клавиш, одной из которых может быть только специальная клавиша Ctrl или Alt, а другой – любая алфавитно-цифровая клавиша. Следует обратить внимание на то, что для заполнения поля Новое сочетание клавиш не нужно вручную набирать на клавиатуре название специальной клавиши. Достаточно просто нажать клавишу Ctrl или Alt и, удерживая эту клавишу в нажатом состоянии, другой рукой нажать алфавитно-цифровую клавишу. Когда пользователь отпустит обе клавиши, поле Новое сочетание клавиш будет заполнено. После ввода комбинации клавиш в нижней части окна активизируется кнопка &#171;Назначить&#187;, которая до этого была неактивной. Щелчком по кнопке &#171;Назначить&#187; за данным макросом окончательно закрепляется введенное сочетание клавиш. В примере, показанном на рис. 1.4, такой комбинацией является сочетание клавиш Alt + ю. Затем следует нажать на экранную кнопку &#171;Закрыть&#187;, после чего начинается непосредственно процесс записи команд, входящих в макрос. В программе Microsoft Word в том, что начался процесс записи макроса, можно убедиться по трем признакам. Во-первых, в строке состояния, расположенной в нижней части экрана, становится активным индикатор ЗАП (активный индикатор окрашивается в черный цвет). Во-вторых, изменяется внешний вид указателя мыши. Рядом со стрелкой указателя мыши появляется изображение магнитофонной кассеты. Теперь необходимо выполнить все действия, которые должны войти в состав макрокоманды. При выполнении этих действий нужно обратить внимание на следующее обстоятельство: действия, выполненные в окне документа с помощью мыши, не записываются. Для записи таких действий, как перемещение текстового курсора, а также выделение, копирование и перемещение текста, необходимо использовать не мышь, а клавиатуру. Эти действия удобнее всего выполнять в специальном режиме выделения, имеющемся в программе Word. Например, в нашем примере (выделение заданного слова полужирным шрифтом и курсивом) следует выполнить следующие действия: 1. Нажать клавишу F8 для активизации режима выделения. Режим выделения можно также активизировать двойным щелчком мыши на индикаторе ВДЛ, находящемся в строке состояния программы Word. Затем нажатием клавиши F8 выделить текущее слово. Нажать клавишу Esc для выхода из режима выделения. 2. Комбинацией клавиш Ctrl+В (если активным языком является английский) или Ctrl+И (если активным языком является русский) задать полужирный шрифт для выделенного слова. 3. Комбинацией клавиш Ctrl+I (если активным языком является английский) или Ctrl+Ш (если активным языком является русский) задать курсивное начертание для выделенного слова. 14 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ Рис. 1.4. Диалоговое окно &#171;Настройка клавиатуры&#187; после ввода комбинации клавиш Третьим признаком того, что идет процесс записи, является появление в окне приложения дополнительной панели, используемой для управления процессом записи. Она содержит всего две кнопки: кнопка &#171;Пауза&#187; используется в том случае, если пользователю нужно выполнить какие-либо действия, не входящие в макрос. Для возобновления записи макроса нужно повторно нажать на кнопку &#171;Пауза&#187;. Кнопка &#171;Остановить запись&#187; 15 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ применяется в том случае, если все действия, входящие в макрос, выполнены, и нужно завершить его запись. После нажатия на кнопку &#171;Остановить запись&#187; процесс создания макроса завершен. В дальнейшем готовый макрос можно запускать на выполнение двумя способами. Первый способ — это запуск макроса через меню. Для этого нужно открыть в приложении меню Сервис, в нем подменю Макрос, а в этом подменю щелкнуть мышью команду Макросы…. В открывшемся диалоговом окне нужно выбрать из списка название макроса, а затем щелкнуть экранную кнопку &#171;Выполнить&#187;. Понятно, что описанный выше способ является недостаточно быстрым, поэтому гораздо удобнее воспользоваться вторым способом, т.е. нажать ту комбинацию из двух клавиш, которая была ранее задана в диалоговом окне &#171;Настройка клавиатуры&#187;. Для приведенного нами примера нажатие комбинации клавиш Ctrl+ю будет выделять в тексте документа текущее слово полужирным и курсивным шрифтом. Возможна ситуация, когда при повторном открытии документа правильно записанный макрос не выполняется. Для того чтобы решить данную проблему, следует воспользоваться последовательностью команд Сервис → Макрос → Безопасность. Она открывает диалоговое окно, в котором можно выбрать уровень безопасности для данного документа. Следует установить средний уровень безопасности, который позволяет пользователю при открытии документа самостоятельно решить вопрос о том, можно ли запускать на выполнение имеющиеся в документе макросы. Если пользователь удовлетворен полученным результатом, то в дальнейшем он может многократно использовать созданный им макрос для выполнения требуемой операции. Но если появляется необходимость каким- либо образом видоизменить имеющийся макрос, то произвести желаемые изменения в диалоговом режиме (как при создании макроса) пользователь не сможет. Для внесения изменений следует снова использовать в меню последовательность команд Сервис → Макрос → Макросы… . Выполнение этой последовательности открывает уже знакомое нам диалоговое окно &#171;Макрос&#187;. В данном диалоговом окне нужно щелкнуть мышью экранную кнопку &#171;Изменить&#187;. Щелчок по экранной кнопке открывает окно для редактирования программного кода в Visual Basic. Но такого рода редактирование требует знания как синтаксиса языка Visual Basic, так и основных принципов объектно-ориентированного программирования. Причем такие знания помогут пользователю не только откорректировать уже существующий макрос, но и создать новую программу с оригинальным пользовательским интерфейсом. Изучению этих вопросов и посвящены следующие разделы. 16 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ 1.3. Экран системы VBA и его основные элементы Пользователь может приступить к программированию в системе VBA двумя различными способами. Первый из них заключается в том, что в одном из приложений пакета Microsoft Office создается какой-либо документ, а затем непосредственно в документе конструируется графический интерфейс пользователя, который затем дополняется программным кодом, описывающим реакцию элементов интерфейса (объектов будущей программы) на различные программные события. Для того чтобы начать создание элементов интерфейса, достаточно использовать последовательность команд Вид → Элементы управления. В результате на экране появляется дополнительная панель &#171;Элементы управления&#187;. Она содержит ряд экранных кнопок, соответствующих создаваемым объектам. Однако недостаток такого способа заключается в том, что у пользователя могут возникать трудности, связанные с позиционированием объектов в документе, т.е. размещением объектов в нужном месте рабочей области документа. В ряде случаев просто перетаскивать объекты с помощью мыши по рабочей области документа не получается, и для того, чтобы поместить объект там, где это желательно разработчику программы или изменить положение уже имеющегося объекта, приходится многократно нажимать клавишу Пробел. Поэтому более удобным и рациональным представляется другой способ. Этот второй способ заключается в том, что пользователь открывает среду программирования VBA, создает в этой среде экранную форму, на которой размещает элементы интерфейса, а затем приступает к настройке свойств этих элементов и написанию программного кода. Для того чтобы открыть среду программирования VBA, следует в меню Microsoft Word использовать последовательность команд Сервис → Макрос → Редактор Visual Basic (рис. 1.5). Рис. 1.5. Открытие системы программирования VBA в программе Microsoft Word 17 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ В результате выполнения этой последовательности команд на экране компьютера появляется экран системы программирования VBA. Перед тем как приступить к рассмотрению дальнейших действий по созданию приложения в этой системе, рассмотрим основные элементы экрана системы VBA, которые показаны на рис. 1.6. Рис. 1.6. Экран системы программирования VBA В верхней части экрана располагается строка заголовка, содержащая название среды программирования, в которой работает пользователь – Microsoft Visual Basic. Эта строка также содержит название того документа (файла Microsoft Word или Microsoft Excel), из которого была запущена система программирования VBA. В правой части строки заголовка, как и у большинства других приложений Windows находятся три экранные кнопки: сворачивающая, разворачивающая (восстанавливающая) и закрывающая. Следует учитывать, что щелчок мышью по закрывающей кнопке не приведет к закрытию документа Microsoft Word или Microsoft Excel, а закроет среду программирования VBA с возвращением в окно этого документа. Под строкой заголовка располагается строка меню, содержащая ряд ниспадающих меню. Каждое такое меню содержит ряд пунктов, идущих один под другим по вертикали. Каждому пункту соответствует определенная 18 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ команда системы программирования. Если эта команда активна (т.е. она может быть выполнена в данный момент времени), то ее название в меню написано черным цветом. Если же команда неактивна (т.е. в данный момент она невыполнима), то ее название в меню написано бледно-серым цветом. Если справа от названия пункта меню находится многоточие, то данный пункт открывает диалоговое окно, в котором необходимо ввести дополнительные параметры для выполнения соответствующей ему команды. Если же справа от названия пункта меню имеется черная треугольная стрелка, то этот пункт открывает вложенное подменю (меню второго уровня), также содержащее ряд команд. Под строкой меню располагается панель инструментов (в нерусифицированных версиях VBA она называется Toolbar). Эта панель содержит ряд кнопок, которые дублируют основные, наиболее часто употребляемые команды меню. На каждой кнопке имеется пиктограмма – небольшой рисунок, который наглядно поясняет назначение данной кнопки. Существует и еще один (кроме изучения пиктограмм) способ выяснить функцию какой-либо кнопки. Для того чтобы узнать назначение той или иной кнопки, достаточно подвести к ней указатель мыши и задержать указатель на несколько секунд. Появляется всплывающая подсказка, которая кратко (на английском языке) характеризует назначение данной кнопки. Например, кнопка с изображением дискеты выполняет функцию аналогичную команде Save (Сохранить) из меню File (Файл). Кнопка с изображением ножниц аналогична команде Cut (Вырезать) из меню Edit (Правка). Кнопка с синей треугольной стрелкой дублирует команду Run (Запустить на выполнение) из одноименного меню Run и так далее. Центральную часть экрана в системе программирования VBA занимает основная пользовательская форма (UserForm). Данная форма представляет собой окно, в котором размещаются элементы пользовательского интерфейса программы (надписи, экранные кнопки, текстовые окна, флажки, переключатели и другие). Размеры элементов интерфейса, а также самой экранной формы, можно изменять вручную с помощью перетаскивания границы объекта мышью. По краям формы расположены специальные маркеры (небольшие белые квадратики), &#171;ухватившись&#187; указателем мыши за которые, можно изменять размеры формы по вертикали, горизонтали или по диагонали (т.е. одновременно и по вертикали, и по горизонтали). Существует и другой способ изменения размеров формы и ее элементов (с помощью окна свойств) который будет описан ниже. Для того чтобы разработчику было удобнее позиционировать элементы интерфейса, на форме имеется специальная пунктирная сетка. Эта сетка отчетливо видна, когда программа находится в режиме разработки. Когда пользователь, нажав на треугольную стрелку, запускает программу на выполнение, пунктирная сетка сразу же исчезает и поверхность формы становится однородной. Такое изменение говорит о том, что программа перешла в другой режим – режим выполнения. 19 НАУЧНО-ИНФОРМАЦИОННЫЙ ЦЕНТР САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО ТЕХНОЛОГИЧЕСКОГО УНИВЕРСИТЕТА РАСТИТЕЛЬНЫХ ПОЛИМЕРОВ Необходимо также отметить следующее: при запуске системы программирования VBA пользовательская форма не появляется автоматически на экране. Для того чтобы создать форму, необходимо воспользоваться меню Insert (Вставка). В данном меню содержится список объектов, которые может создать система. В списке следует выбрать объект UserForm (Пользовательская форма) который затем появится в центре экрана. Слева от основной пользовательской формы находится окно &#171;Панель элементов&#187; (в нерусифицированной версии системы – Toolbox). Данное окно содержит набор кнопок, используемых для создания элементов интерфейса. На каждой кнопке (как и на кнопках панели инструментов) имеется пиктограмма, а также при наведении на кнопку указателя мыши появляется всплывающая подсказка. Например, кнопка с изображением прописной буквы A применяется для создания объекта &#171;Надпись&#187; (Label). Если на кнопке изображены буквы ab и вертикальный курсор, то с ее помощью можно создать объект &#171;Текстовое окно&#187; (Textbox). Щелчок на кнопке с изображением серого прямоугольника создает объект &#171;Экранная кнопка&#187; (CommandButton). Кнопка, на которой изображен кружок с точкой в центре, применяется для создания объекта &#171;Переключатель&#187; (OptionButton). Кнопка, на которой изображена &#171;галочка&#187;, используется для создания объекта &#171;Флажок&#187; (Checkbox). Если Панель элементов не видна на экране, то следует щелкнуть мышью на любом свободном месте пользовательском формы, и данная панель сразу же появится. Панель элементов жестко не закреплена на экране, поэтому в случае необходимости ее можно перемещать по экрану, &#171;ухватившись&#187; мышью за строку заголовка. Под Панелью элементов расположено Окно свойств (Properties). В данном окне содержится список свойств того объекта, находящегося на пользовательской форме, который является активным в настоящий момент времени. Для того чтобы сделать какой-либо объект на форме активным, достаточно щелкнуть по нему мышью. Если на форме не активизирован не один объект, то данное окно отображает свойства самой пользовательской формы. В Окне свойств содержатся две вкладки, в каждой из которых свойства объекта упорядочены определенным образом. В левой вкладке свойства упорядочены по алфавиту, в правой – по категориям. Примерами свойств объекта являются длина (Нeight) и ширина (Width) объекта, расположение объекта относительно левой границы окна (Left) и верхней его границы (Top), фоновый цвет объекта (BackСolor) и цвет текста, имеющегося на объекте (ForeColor). Указанные свойства присущи большинству объектов, но разные объекты могут отличаться как по набору свойств, так и по значениям этих свойств. 20 Страницы ← предыдущая следующая → 1 2 3 4 5 6 7 8 9

Поделитесь статьей, пожалуйста:

Visual Basic for Applications (VBA) – это базовый язык программирования в приложениях Microsoft Office (Word, Excel, Access, PowerPoint, и др.). С помощью VBA можно создавать макросы, которые позволяют автоматизировать рутинную работу с документами, электронными таблицами, презентациями и т. д. Знание принципов и основ программирования с VBA позволит решать любые задачи: от создания простых, но эффективных макросов &#171;на каждый день&#187; в помощь рядовым пользователям в их работе, до серьезных проектов корпоративного уровня.

Курс &#171;Excel + Google Таблицы с нуля до PRO&#187; от Skillbox

Длительность 4 месяца
Уровень С нуля
Для кого подходит Бухгалтерам, маркетологам, экономистам, аналитикам
менеджерам и предпринимателям
Формат Видеолекции + домашние задания + обратная связь от преподавателя
Гарантии Гарантия возврата денег в течение 14 дней если не понравится формат обучения или манера преподавания
Итоги Диплом об окончании + проекты в портфолио
Цена ● Полная – 30 000 рублей;
● Со скидкой – 12 000 рублей;
● Рассрочка на 12 месяцев – 1500 рублей/месяц.
Ссылка на курс Узнать подробности

Программа курса включает в себя следующие блоки:

  • Excel базовый;
  • Excel продвинутый;
  • Excel: макросы;
  • Google Таблицы базовый;
  • Google Таблицы;
  • Google Таблицы: скрипты;
  • дипломный проект.

Олег Самойленко – педагог по созданию баз данных.

Ренат Шагабутдинов – шеф-редактор в издательстве &#171;МИФ&#187;. Сертифицированный тренер MS Office.

Евгений Намоконов – Соавтор книги &#171;Google Таблицы. Это просто&#187; и телеграм-канала &#171;Google Таблицы&#187;.

Почему не работает макрос?

Предположим, Вы скачали файл с данного сайта с примером макроса, открываете файл, но макросы в нем не работают! Как такое может быть? Неужели автор сайта выложил неработающий пример и не знает об этом? И тем более как может случиться такое, что Вы перенесли со своего ПК на другой ПК файл с рабочими макросами на флешке, запускаете, а он не работает. Почему? Вроде все правильно делаете, да ведь и у Вас работает на ПК. И начинает закрадываться мысль: "А чем же этот ПК и Excel на нем такие особенные?" . А ответ может быть прост — перед выполнением макроса не было разрешено выполнение этих самых макросов. Да, в большинстве случаев по умолчанию выполнение макросов в Excel отключено. И их надо включить. Для этого:

  • Excel 2003:
    Сервис-Безопасность-Уровень макросов "Низкий"
  • Excel 2007:
    Кнопка ОфисПараметры Excel (Excel Options)Центр управления безопасностью (Trust Centr)Параметры центра управления безопасностью (Trust Centr Settings)Параметры макросов (Macro Settings)Разрешить все макросы (Enable All Macros)
  • Excel 2010-2016:
    Файл (File)Параметры (Options)Центр управления безопасностью (Trust Centr)Параметры центра управления безопасностью (Trust Centr Settings)Параметры макросов (Macro Settings)Разрешить все макросы (Enable All Macros)

Если макросы уже включены, но некоторые макросы отказываются работать (как правило те, которые записаны в модулях листов и книг и запускаются при наступлении определенного события — Worksheet_SelectionChange (выделение ячеек), Worksheet_Change (изменение значений ячеек) и т.п.), то скорее всего когда-то вы выполнили какой-нибудь макрос и он отключил отслеживание событий. Тогда надо в любую активную книгу добавить модуль(переходим в редактор VBA( Alt + F11 ) —InsertModule), вставить в него приведенный ниже код и запустить:

Sub Reset_Events() Application.EnableEvents = True End Sub

чтобы запустить(выполнить) данный макрос макрос необходимо установить курсор в любое место между Sub и End Sub и нажать клавишу F5 .

Не работают макросы в Excel: кто виноват и что делать?

Screenshot_108

Не работают макросы в Excel? Включите их выполнение, добавьте специальный модель с кодом, проверьте версию ОС и Эксель, убедитесь в соответствии пакета приложений, активируйте Майкрософт Офис, снимите блокировку файла, проверьте систему безопасности и применяемые библиотеки. Ниже подробно рассмотрим, в чем могут быть причины подобной неисправности, и какие шаги предпринимать для ее устранения.

Причины

Для начала стоит разобраться, почему не работает макрос в Excel, ведь от этого зависят дальнейшие шаги. К основным причинам стоит отнести:

  1. Функция отключена.
  2. Отключение отслеживания событий.
  3. Устаревшая операционная система.
  4. Несоответствие разработчика пакета офисных приложений.
  5. Устаревшая версия Майкрософт Офис.
  6. Неактивированная версия Excel.
  7. Заблокированный файл.
  8. Неправильные настройки безопасности.
  9. Отсутствие необходимой библиотеки и т. д.

Выше рассмотрены основные причины, почему не удается выполнить макрос в Excel. Все они могут быть решены самостоятельно с помощью приведенных ниже рекомендации. Подробнее на решении вопроса остановимся ниже.

Что делать

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

Включите опцию

Первое, что необходимо сделать — включить функцию для обеспечения ее работоспособности. Здесь многое зависит от версии Эксель.

Если не работают макросы в Excel 2003, сделайте следующие шаги:

  1. Войдите в «Сервис».
  2. Перейдите в раздел «Безопасность».
  3. Кликните «Уровень макросов «Низкий».

В случае, когда не работают макросы в Excel 2007, включите их следующим образом:

  1. Жмите на кнопку «Офис».
  2. Войдите в параметры Excel.
  3. Кликните на «Центр управления безопасности».
  4. Войдите в «Параметры центра управления безопасностью».
  5. Жмите на «Параметры макросов».
  6. Кликните на «Разрешить все …».

В ситуации, когда не работают макросы в Excel 2016, сделайте следующие шаги:

  1. Войдите в раздел «Файл».
  2. Кликните на кнопку «Параметры».
  3. Зайдите в «Центр управления безопасностью».
  4. Войдите в «Параметры центра управления безопасностью».
  5. Кликните на «Параметры …».
  6. Жмите на «Разрешить все …».

После внесения изменений параметра безопасности перезапустите приложение Excel, а именно закройте его полностью и откройте снова. Лишь после этого изменения вступают в силу.

Добавьте нужный модуль в книгу

Бывают ситуации, когда макросы включены, но не работают в Excel из-за отключения каким-либо элементом отслеживания событий. В таком случае сделайте следующее:

  1. Перейдите в редактор VBA с помощью клавиш Alt+F11.
  2. Вставьте указанный ниже код.
  1. Для выполнения кода поставьте курсор в любой точке между началом и концом.
  2. Кликните F5.

Проверьте операционную систему

В ситуации, когда не отображаются макросы в Excel, обратите внимание на тип операционной системы. К примеру, Майкрософт Офис, который подходит для Виндовс, на Мак ОС уже работать не будет. Причина в том, что в приложении используются разные библиотеки. Даже если надстройки и функционируют, могут быть сбои в работе. Вот почему при появлении проблем нужно проверить ОС на соответствие.

Обратите внимание на разработчика

Если в Экселе не работают макросы, причиной может быть другой разработчик. Так, пользователи Excel часто применяют OpenOffice или LibreOffice. Эти пакеты созданы на разных языках программирования, которые имеют индивидуальные особенности. Так, если надстройки написаны на Visual Basic for Application, он может не работать в указанных выше офисных приложениях. Вот почему необходимо уточнять, для какого пакета создан макрос / надстройка.

Проверьте версию Майкрософт Офис

В Макрософт Офис 2003 применяются надстройки xla для Excel. В современных версиях расширение поменялось на xlam. Если ставить макросы старого типа в приложения Офис 2007 и больше, никаких трудностей не происходит. Если же вы попытаетесь поставить новую надстройку на старую версию Excel, она зачастую не работает. Вот почему важно обратить внимание на этот параметр при выборе.

Убедитесь в наличии пакета VBA

Одной из причин, почему не запускается макрос в Excel, может быть отсутствие пакета VBA. Для успешного запуска надстройки необходимо, чтобы этот пакет был установлен. Иногда он уже установлен в Офис, но так происходит не всегда. Для проверки жмите комбинацию на Alt+F11. Если после этого появляется Visual Basic, компонент можно считать установленным. В ином случае его нужно поставить. Для этого:

  • Зайдите в «Пуск», а далее «Панель управления / Программы и компоненты».

  • Выберите программу Майкрософт Офис.
  • Жмите на кнопку «Изменить».

  • Запустить файл установки Setup.exe.
  • Кликните на «Добавить или удалить компоненты».
  • Выберите в списке Visual Basic и установите его.

Активируйте Офис

Если в Excel 2007 не работает кнопка «макросы», причиной может быть отсутствие активации приложения. Для этого жмите на кнопку «Активировать» и следуйте инструкции. В большинстве случаев такая опция является платной.

Снимите блокировку файла

Учтите, что документ, полученный с другого ПК / ноутбука, может заблокироваться. Для разблокировки файла нужно нажать ПКМ и в разделе «Общие» кликнуть на «Разблокировать».

Проверьте библиотеки

В случае, когда параметры макросов не активны в Excel, причиной может быть появление ошибки «Can’t find project or library». При этом, надстройка работает на другом ПК / ноутбуке, а здесь возникают проблемы. Ошибку легко устранить, если в окне, которое идет за сообщением об ошибке, снять отметки в полях Missing. Для вызова окна можно выбрать пункт меню Tools / References.

Проверьте настройки безопасности

В ситуации, когда не работают макросы в Excel, можно добавить надежные расположения или настроить доступ к объектной модели VBA. Для этого в Офис 2007 необходимо сделать следующее:

  1. Войдите в Меню
  2. Кликните на пункт «Параметры».
  3. Жмите на «Центр управления безопасностью».
  4. Войдите в «Параметры центра управления безопасностью».
  5. Кликните на «Параметры макросов» и «Доверять доступ к объектной модели проектов».

Зная, почему не работают макросы в Excel, вы можете с легкостью исправить проблему и восстановить работоспособность. Если же сложности в работе возникают, вы всегда можете воспользоваться инструкцией в статье.

В комментариях расскажите, какой из приведенных выше вариантов вам помог, и что еще можно сделать.

Почему мой макрос Excel не работает при запуске с горячей клавиши и работает при запуске с ленты макросов?

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

Макрос выполняется успешно, пока я выбираю ленту макросов и макрос в диалоговом окне.

Если я пытаюсь запустить его с помощью горячей клавиши, все, что происходит, это то, что столбец A подсвечивается, затем столбец B выделяется, а затем возвращается к выделенному столбцу A.

Я пробовал несколько различных комбинаций горячих клавиш в настоящее время Ctrl + Shift + Y.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *