Макросы для автоматического создания глобальных переменных


Содержание

Создание автоматически выполняемых макрокоманд

Запуск макросов

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

Для запуска макроса с использованием окна диалога Макрос необходимо выполнить следующие действия.

Нажать сочетание клавиш Alt+F9 или выбрать команду Вид►Макрос►Макросы. В результате Word отобразит на экране окно диалога Макрос.

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

Дважды щелкнуть на имени макроса, который требуется выполнить, или выбрать это имя в списке и щелкнуть на кнопке Выполнить. В результате Word закроет окно диалога Макрос и запустит выбранный макрос.

Вы можете создавать макрокоманды, которые будут запускаться автоматически всякий раз во время

выполнения определенных задач (например, загрузка Word, открытие или закрытие файла). В программе

предусмотрены пять специальных имен для макрокоманд, которые распознаются и выполняются Word в

соответствующие моменты времени. Эти имена и условия их выполнения приведены в табл.1.1.

Табл.1.1. Автоматически выполняемые макрокоманды

Имя макрокоманды Назначение
AutoExec Выполняется при запуске Word
AutoNew Выполняется при создании нового файла
AutoOpen Выполняется при открытии существующего файла
AutoClose Выполняется при закрытии файла
AutoExit Выполняется при выходе из Word

Кроме всего прочего, эти макрокоманды можно выполнять в произвольное время — точно таким же о6разом, как вы запускаете и любой другой макрос. Если вы еще не создали для них ни комбинаций клавиш, ни кнопок на панели инструментов, из меню Вид выберите команду Макрос, Макросы; выделите необходимый макрос и щелкните на кнопке Выполнить. В каких же случаях можно пользоваться этими именами?

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

Другое возможное применение макроса AutoExec — автоматическое открытие документа, над которым вы работали в прошлый раз. Это макрос, состоящий всего из одной команды. Перейдя в режим записи макрокоманд, в меню Файл из списка последних вызванных документов выберите самое первое имя файла (1). Затем остановите запись макрокоманды.

Именем AutoNew можно воспользоваться, чтобы при каждом создании документа предлагать пользователю перечень схожих настроек и параметров, применимых только для определенного типа документов. Например, вы можете присоединить макрос с именем AutoNew к шаблону своих информационных писем; этот макрос будет выводить диалоговое окно с требованием указать тип создаваемого проекта: стандартный или срочный. В зависимости от введенного пользователем типа макрос использует различные конструкции Автотекста. Другой вариант применения AutoNew – отображать на экране строку ввода или диалоговое окно, требующие от пользователя ввода текстовой информации.

Имя AutoOpen используется для запуска макрокоманды, которая будет обновлять все поля записи базы данных каждый раз при открытии документа, поскольку автоматическое обновление полей в Word не предусмотрено. Создать такой макрос проще простого: перейдите в режим записи макрокоманд, нажмите комбинацию клавиш , затем нажмите клавишу , после чего остановите запись макроса. а

Используйте имя AutoClose для макрокоманды, которая открывает диалоговое окно Правописание всякий раз при закрытии файла. Назначение такого макроса заключается в том. чтобы пользователь сразу же проверил орфографию или хотя бы просто напомнить ему об этом. Создать такую макрокоманду? Нет ничего проще! Перейдите в режим записи макросов, щелкните на кнопке Правописание, которая находится на панели инструментов Стандартная, а затем остановите запись. Кроме этого, вы можете использовать имя AutoClose для макрокоманды, которая после закрытия файла будет сохранять не только сам документ, но и его резервную копию.

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

Замечание 1. Макрокоманды с именами AutoExec и AutoExit хранятся исключительно в шаблоне Normal.dot, а вот макросы AutoNew, AutoOpen и AutoClose могут быть различными для каждого отдельного шаблона. Таким образом, Word предлагает вам разнообразные вспомогательные средства: инструментарий, диалоговые окна или справочные руководства, в зависимости от типа документа, над которым вы работаете.

Замечание 2. Если же вы хотите загрузить Word без выполнения макроса AutoExec, просто при запуске программы нажмите клавишу .

Не нашли то, что искали? Воспользуйтесь поиском:

Как записать макрос в Excel? Пошаговая инструкция.

Что такое макрос?

Для начала немного о терминологии.

Макрос — это код, написанный на встроенном в Excel языке VBA (Visual Basic for Application). Макросы могут создаваться как вручную, так и записываться автоматически с помощью так называемого макрорекодера.

Макрорекодер — это инструмент в Excel, который пошагово записывает все что вы выполняете в Excel и преобразует это в код на языке VBA. Макрорекодер создает очень подробный код (как мы увидим позже), который вы сможете при необходимости отредактировать в дальнейшем.

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

Теперь давайте погрузимся и посмотрим, как записать макрос в Excel.

Отображение вкладки «Разработчик» в ленте меню

Перед тем как записывать макрос, нужно добавить на ленту меню Excel вкладку «Разработчик». Для этого выполните следующие шаги:

  1. Щелкните правой кнопкой мыши по любой из существующих вкладок на ленте и нажмите «Настроить ленту». Он откроет диалоговое окно «Параметры Excel».
  2. В диалоговом окне «Параметры Excel» у вас будут параметры «Настроить ленту». Справа на панели «Основные вкладки» установите флажок «Разработчик».
  3. Нажмите «ОК».

В результате на ленте меню появится вкладка «Разработчик»

Запись макроса в Excel

Теперь давайте запишем очень простой макрос, который выбирает ячейку и вводит в нее текст, например «Excel».

Вот шаги для записи такого макроса:

  1. Перейдите на вкладку «Разработчик».
  2. В группе «Код» нажмите кнопку «Запись макроса». Откроется одноименное диалоговое окно.
  3. В диалоговом окне «Запись макроса» введите имя для своего макроса, например «ВводТекста». Есть несколько условий именования, которые необходимо соблюдать при назначении макроса. Например, вы не можете использовать пробелы между ними. Обычно я предпочитаю сохранять имена макросов как одно слово, с разными частями с заглавным первым алфавитом. Вы также можете использовать подчеркивание для разделения двух слов — например, «Ввод_текста».
  4. Если вы хотите, то можете задать сочетание клавиш. В этом случае мы будем использовать ярлык Ctrl + Shift + N. Помните, что сочетание, которое вы указываете, будет отменять любые существующие горячие клавиши в вашей книге. Например, если вы назначили сочетание Ctrl + S, вы не сможете использовать это для сохранения рабочей книги (вместо этого, каждый раз, когда вы его используете, он выполняет макрос).
  5. В поле «Сохранить в» убедитесь, что выбрана опция «Эта книга». Этот шаг гарантирует, что макрос является частью рабочей книги. Он будет там, когда вы сохраните его и снова откроете, или даже если вы поделитесь файлом с кем-то.
  6. Введите описание при необходимости. Обычно я этого не делаю, но если у вас много макросов, лучше указать, чтобы в будущем не забыть что делает макрос.
  7. Нажмите «ОК». Как только вы нажмете OK, Excel начнет записывать ваши действия. Вы можете увидеть кнопку «Остановить запись» на вкладке «Разработчик», которая указывает, что выполняется запить макроса.
  8. Выберите ячейку A2.
  9. Введите текст «Excel» (или вы можете использовать свое имя).
  10. Нажмите клавишу Enter. Вы попадете на ячейку A3.
  11. Нажмите кнопку «Остановить запись» на вкладке «Разработчик».

Поздравляем! Вы только что записали свой первый макрос в Excel. Хотя макрос не делает ничего полезного, но он поможет нам понять как работает макрорекордер в Excel.

Теперь давайте рассмотрим код который записал макрорекодер. Выполните следующие действия, чтобы открыть редактор кода:

  1. Удалите текст в ячейке A2. Это нужно, чтобы проверить будет ли макрос вставлять текст в ячейку A2 или нет.
  2. Выберите любую ячейку — кроме A2. Это нужно проверить, выбирает ли макрос ячейку A2 или нет.
  3. Перейдите на вкладку «Разработчик».
  4. В группе «Код» нажмите кнопку «Макросы».
  5. В диалоговом окне «Макрос» щелкните макрос «ВводТекста».
  6. Нажмите кнопку «Выполнить».

Вы увидите, что как только вы нажмете кнопку «Выполнить», текст «Excel» будет вставлен в ячейку A2 и выбрана ячейка A3. Это происходит за миллисекунды. Но на самом деле макрос последовательно выполнил записанные действия.

Примечание. Вы также можете запустить макрос с помощью сочетания клавиш Ctrl + Shift + N (удерживайте клавиши Ctrl и Shift, а затем нажмите клавишу N). Это тот же самый ярлык, который мы назначили макросу при его записи.

Что записывает макрос?

Теперь перейдем к редактору кода и посмотрим что у нас получилось.

Вот шаги по открытию редактора VB в Excel:

  1. Перейдите на вкладку «Разработчик».
  2. В группе «Код» нажмите кнопку «Visual Basic».

Вы также можете использовать комбинацию клавиш Alt + F11 и перейти в редактор кода VBA.

Рассмотрим сам редактор кода. Далее коротко опишем интерфейс редактора.

  • Панель меню: содержит команды, которые можно использовать во время работы с редактором VB.
  • Панель инструментов — похожа на панель быстрого доступа в Excel. Вы можете добавить к ней дополнительные инструменты, которыми часто пользуетесь.
  • Окно проектов (Project Explorer) — здесь Excel перечисляет все книги и все объекты в каждой книге. Например, если у нас есть книга с 3 рабочими листами, она появится в Project Explorer. Здесь есть несколько дополнительных объектов, таких как модули, пользовательские формы и модули классов.
  • Окно кода — собственно сам код VBA размещается в этом окне. Для каждого объекта, указанного в проводнике проекта, есть окно кода, например, рабочие листы, книги, модули и т. д. В этом уроке мы увидим, что записанный макрос находится в окне кода модуля.
  • Окно свойств — вы можете увидеть свойства каждого объекта в этом окне. Я часто использую это окно для обозначения объектов или изменения их свойств.
  • Immediate Window (окно предпросмотра) — На начальном этапе оно вам не пригодится. Оно полезно, когда вы хотите протестировать шаги или во время отладки. Он по умолчанию не отображается, и вы можете его отобразить, щелкнув вкладку «View» и выбрав опцию «Immediate Window».

Когда мы записали макрос «ВводТекста», в редакторе VB произошли следующие вещи:

  • Был добавлен новый модуль.
  • Макрос был записан с именем, которое мы указали — «ВводТекста»
  • В окне кода добавлена новая процедура.

Поэтому, если вы дважды щелкните по модулю (в нашем случае модуль 1), появится окно кода, как показано ниже.

Вот код, который записан макрорекодером:

В VBA, любая строка , которая следует за ‘ (знак апострофа) не выполняется. Это комментарий, который предназначен только для информационных целей. Если вы удалите первые пять строк этого кода, макрос по-прежнему будет работать.

Теперь давайте пробежим по каждой строке кода и опишем что и зачем.

Код начинается с Sub, за которым следует имя макроса и пустые круглые скобки. Sub — сокращение для подпрограммы. Каждая подпрограмма (также называемая процедурой) в VBA начинается с Sub и заканчивается End Sub.

  • Range(«A2»).Select — эта строка выбирает ячейку A2.
  • ActiveCell.FormulaR1C1 = «Excel» — эта строка вводит текст «Excel» в активной ячейке. Поскольку мы выбрали ячейку A2 в качестве первого шага, она становится нашей активной ячейкой.
  • Range(«A3»).Select — выбор ячейки A3. Это происходит, когда мы нажимаем клавишу Enter после ввода текста, результатом которого является выбор ячейки A3.

Надеюсь, что у вас есть некоторое базовое понимание того, как записывать макрос в Excel.

Обращаем внимание, что код, записанный через макрорекордер, как правило, не является эффективным и оптимизированным кодом. Макрорекордер часто добавляет дополнительные ненужные действия. Но это не значит, что не нужно пользоваться макрорекодером. Для тех, кто только изучает VBA , макрорекордер может быть отличным способом проанализировать и понять как все работает в VBA.


Абсолютная и относительная запись макроса

Вы уже знаете про абсолютные и относительные ссылки в Excel? Если вы используете абсолютную ссылку для записи макроса, код VBA всегда будет ссылаться на те же ячейки, которые вы использовали. Например, если вы выберете ячейку A2 и введете текст «Excel», то каждый раз — независимо от того, где вы находитесь на листе и независимо от того, какая ячейка выбрана, ваш код будет вводить текст «Excel» в ячейку A2.

Если вы используете параметр относительной ссылки для записи макроса, VBA не будет привязываться к конкретному адресу ячейки. В этом случае программа будет «двигаться» относительно активной ячейки. Например, предположим, что вы уже выбрали ячейку A1, и вы начинаете запись макроса в режиме относительной ссылки. Теперь вы выбираете ячейку A2, вводите текст Excel и нажмите клавишу Enter. Теперь, если вы запустите этот макрос, он не вернется в ячейку A2, вместо этого он будет перемещаться относительно активной ячейки. Например, если выбрана ячейка B3, она переместится на B4, запишет текст «Excel» и затем перейдет к ячейке K5.

Теперь давайте запишем макрос в режиме относительных ссылок:

  1. Выберите ячейку A1.
  2. Перейдите на вкладку «Разработчик».
  3. В группе «Код» нажмите кнопку «Относительные ссылки». Он будет подсвечиваться, указывая, что он включен.
  4. Нажмите кнопку «Запись макроса».
  5. В диалоговом окне «Запись макроса» введите имя для своего макроса. Например, имя «ОтносительныеСсылки».
  6. В опции «Сохранить в» выберите «Эта книга».
  7. Нажмите «ОК».
  8. Выберите ячейку A2.
  9. Введите текст «Excel» (или другой как вам нравится).
  10. Нажмите клавишу Enter. Курсор переместиться в ячейку A3.
  11. Нажмите кнопку «Остановить запись» на вкладке «Разработчик».

Макрос в режиме относительных ссылок будет сохранен.

Теперь сделайте следующее.

  1. Выберите любую ячейку (кроме A1).
  2. Перейдите на вкладку «Разработчик».
  3. В группе «Код» нажмите кнопку «Макросы».
  4. В диалоговом окне «Макрос» кликните на сохраненный макрос «ОтносительныеСсылки».
  5. Нажмите кнопку «Выполнить».

Как вы заметите, макрос записал текст «Excel» не в ячейки A2. Это произошло, потому что вы записали макрос в режиме относительной ссылки. Таким образом, курсор перемещается относительно активной ячейки. Например, если вы сделаете это, когда выбрана ячейка B3, она войдет в текст Excel — ячейка B4 и в конечном итоге выберет ячейку B5.

Вот код, который записал макрорекодер:

Обратите внимание, что в коде нет ссылок на ячейки B3 или B4. Макрос использует Activecell для ссылки на текущую ячейку и смещение относительно этой ячейки.

Не обращайте внимание на часть кода Range(«A1»). Это один из тех случаев, когда макрорекодер добавляет ненужный код, который не имеет никакой цели и может быть удален. Без него код будет работать отлично.

Что нельзя сделать с помощью макрорекодера?

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

  • Вы не можете выполнить код без выбора объекта. Например, если вы хотите, чтобы макрос перешел на следующий рабочий лист и выделил все заполненные ячейки в столбце A, не выходя из текущей рабочей таблицы, макрорекодер не сможет этого сделать. В таких случаях вам нужно вручную редактировать код.
  • Вы не можете создать пользовательскую функцию с помощью макрорекордера. С помощью VBA вы можете создавать пользовательские функции, которые можно использовать на рабочем листе в качестве обычных функций.
  • Вы не можете создавать циклы с помощью макрорекордера. Но можете записать одно действие, а цикл добавить вручную в редакторе кода.
  • Вы не можете анализировать условия: вы можете проверить условия в коде с помощью макрорекордера. Если вы пишете код VBA вручную, вы можете использовать операторы IF Then Else для анализа условия и запуска кода, если true (или другой код, если false).

Расширение файлов Excel, которые содержат макросы

Когда вы записываете макрос или вручную записываете код VBA в Excel, вам необходимо сохранить файл с расширением файла с поддержкой макросов (.xlsm).

До Excel 2007 был достаточен один формат файла — .xls. Но с 2007 года .xlsx был представлен как стандартное расширение файла. Файлы, сохраненные как .xlsx, не могут содержать в себе макрос. Поэтому, если у вас есть файл с расширением .xlsx, и вы записываете / записываете макрос и сохраняете его, он будет предупреждать вас о сохранении его в формате с поддержкой макросов и покажет вам следующее диалоговое окно:

Илон Маск рекомендует:  Как правильно подобрать сотрудников Принципы подбора результативных работников

Если вы выберете «Нет», Excel сохранить файл в формате с поддержкой макросов. Но если вы нажмете «Да», Excel автоматически удалит весь код из вашей книги и сохранит файл как книгу в формате .xlsx. Поэтому, если в вашей книге есть макрос, вам нужно сохранить его в формате .xlsm, чтобы сохранить этот макрос.

Искусство метапрограммирования, Часть 2: Метапрограммирование с использованием Scheme

Оглавление

  • Мы определили проблемы, которые лучше всего решаются при помощи генерирующих код программ, включая:
    • Программы, нуждающиеся в предварительно сгенерированных таблицах данных
    • Программы, имеющие много стереотипного кода, который нельзя абстрагировать в функции
    • Программы, использующие технологии, которые слишком многословно выражаются на языке программы
  • Затем мы рассмотрели несколько систем метапрограммирования и примеры их использования, включая:
    • Системы текстовой подстановки общего назначения
    • Предметно-ориентированные генераторы программ и функций
  • Затем мы исследовали конкретный пример создания таблицы
  • Мы написали генерирующую код программу построения статических таблиц в C
  • Наконец, мы познакомились с Scheme и увидели, как он может решать проблемы, которые возникают в языке C, используя конструкции, являющиеся частью самого языка Scheme

В этой статье приводятся подробности программирования макросов Scheme и объясняется, как они могут значительно облегчить масштабные задачи программирования.

Хотя макросы syntax-case не являются стандартной частью Scheme, они являются наиболее широко используемым типом макросов, позволяющим гигиенические и не гигиенические формы, и являются очень близкими к стандартным макросам syntax-rules .

Макросы syntax-case имеют следующий формат (листинг 1):

Этот формат определяет macro-name как ключевое слово, используемое для преобразования. lambda — это функция, используемая для преобразования выражения x в его расширение.

syntax-case принимает выражение x в качестве своего первого аргумента. Второй аргумент — это список ключевых слов, которые вставляются дословно в синтаксические шаблоны. Другие идентификаторы, используемые в шаблонах, будут работать как переменные шаблона. Затем в syntax-case указывается последовательность комбинаций шаблон/преобразователь. syntax-case обрабатывает каждую из них, пытаясь сопоставить входную форму шаблону и, при совпадении, выполняет соответствующее расширение.

Рассмотрим простой пример. Допустим, что мы хотим написать более подробную версию оператора if , чем предлагаемую в Scheme. И допустим, что мы хотим найти и возвратить большее из двух чисел. Код будет выглядеть примерно так:

Для программистов, не работавших с Scheme, будет странным не видеть текстовых указаний ветви «then» и ветви «else». Чтобы решить этот вопрос, мы можем создать нашу собственную версию оператора if , в которой добавляются ключевые слова «then» и «else». Код будет выглядеть так:

(my-if (> a b) then a else b)

В листинге 2 приведен макрос для выполнения этой операции:

При выполнении этот макрос будет сопоставлять выражение my-if с шаблоном следующим образом (другими словами, соответствие вызова макроса шаблону определения макроса):

В преобразующем выражении везде, где встретится слово condition , оно будет заменено на (> a b) . Не имеет значения, что (> a b) — это список. Это простой элемент, помещенный в список, и рассматривается он как отдельная сущность в шаблоне. Результирующее синтаксическое выражение просто переставляет каждую из этих частей в новом выражении.

Это преобразование происходит перед выполнением во время так называемого макрорасширения . Во многих основанных на компиляторах реализациях Scheme макрорасширение происходит во время компиляции. Это означает, что макросы выполняются только один раз, в начале программы или во время компиляции, и никогда не вычисляются повторно. Следовательно, наш оператор my-if не вносит никаких накладных расходов — он преобразуется в простой if во время исполнения.

В следующем примере мы выполним известный макрос swap! . Это будет простой макрос, предназначенный для перестановки значений двух идентификаторов. В листинге 3 приведен пример использования макроса.

Следующий простой макрос (листинг 4) реализует перестановку путем определения новой временной переменной:

Здесь определяется новая переменная с именем с . Но что произойдет, если один из переставляемых аргументов будет называться с ?

syntax-case решает эту проблему, заменяя переменную с уникальным, неиспользуемым именем переменной при расширении макроса. Следовательно, синтаксический преобразователь сам обо все побеспокоится.

Обратите внимание на то, что syntax-case не заменяет let , потому что let — это определенный глобально идентификатор.

Техника замены имен переменных не конфликтующими именами называется гигиеной ; использующий эту технику макрос называется гигиеническим макросом . Гигиенические макросы могут безопасно использоваться везде без опасений конфликта с существующими именами переменных. Для широкого круга задач метапрограммирования эта возможность делает макросы более предсказуемыми и удобными в работе.

Хотя гигиенические макросы делают представляемые в макросе имена переменных безопасными, существуют ситуации, когда вы хотите, чтобы макрос был не гигиеническим. Например, допустим, что вы хотите создать макрос, определяющий переменную в области видимости, которая используется вызывающей макрос программой. Такой макрос должен быть не гигиеническим, поскольку он вмешивается в пространство имен пользовательского кода. Однако во многих случаях эта способность является полезной.

В качестве простого примера, допустим, что вы хотите написать макрос, определяющий несколько математических констант для использования внутри макроса (да, это можно было бы сделать с использованием других средств, но я делаю именно так для примера). Допустим, мы хотим определить числа pi и e , используя следующий вызов макроса (листинг 5):

Если бы мы попытались записать его как предыдущие макросы, он бы не работал:

Этот фрагмент не работает. Причина этого, как упоминалось ранее, заключается в том, что Scheme будет переименовывать pi и e , для того чтобы они не конфликтовали с другими именами в окружающих или вложенных областях видимости. Следовательно, они получат новое имя и код (* pi e) будет ссылаться на неопределенные переменные. Нам необходим способ записывать литеральные символы, которые могут использоваться разработчиком, вызывающим макрос.

Для записи в макросе кода, который бы не модифицировался автоматически (гигиена) системой Scheme, код должен быть преобразован из списка символов в синтаксический объект , который можно было бы затем присвоить переменной шаблона и вставить в преобразованное выражение. Для этого мы будем использовать with-syntax , который по существу является оператором «let» для макросов. Он имеет аналогичный основной формат, но используется для присвоения синтаксических объектов переменным шаблона.

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

  • datum->syntax-object преобразует список в более абстрактное представление синтаксического объекта.
    • Первым параметром этой функции обычно является (syntax k) — немного магическая формула, помогающая преобразователю синтаксиса получить корректный контекст.
    • Вторым параметром является выражение, которое нужно преобразовать в синтаксический объект.
    • Результат — это синтаксический объект, который может быть присвоен переменной шаблона с использованием with-syntax .
  • syntax-object->datum обратная процедура datum->syntax-object . Она получает синтаксический объект и преобразует его в выражение, с которым можно работать, используя обычные функции Scheme для обработки списков.
  • syntax принимает выражение преобразования, содержащее переменные шаблона, и константное выражение, а возвращает полученный синтаксический объект.

В данном примере для получения литерального значения в переменной шаблона вы должны использовать комбинацию синтаксиса и syntax-object->datum . Затем вы могли бы поработать с выражением и использовать datum->syntax-object для получения его назад в виде синтаксического объекта, который можно присвоить переменной шаблона в with-syntax . Затем в конечном выражении преобразования новая переменная шаблона может быть использована как любая другая переменная.

В сущности, вы преобразуете синтаксис Scheme в список, которым можно управлять, работаете с этим списком и преобразуете его назад в синтаксис выражения Scheme для вывода.

В листинге 7 приведено определение макроса, использующего эти функции для определения математических символов:


Если вы не знакомы с Scheme, обратная кавычка, называемая квазикавычкой , похожа на оператор «кавычка» за исключением того, что разрешает включать данные, не имеющие кавычек, если они начинаются с запятой (которая называется оператором закрытия кавычек ). Это позволяет нам соединить выражение с нашим фрагментом шаблонного кода, затем все это дело преобразовать обратно в синтаксический объект как конечное преобразование.

Поскольку мы явно соединили новые переменные с существующим синтаксическим объектом, они не могут быть переименованы. Также обратите внимание на то, что выражение (syntax k) в datum->syntax-object необходимо, но, по существу, бессмысленно. Оно используется для активизации маленькой «магии» в синтаксическом процессоре, для того чтобы функция datum->syntax-object знала, какой контекст выражения должен быть в ней обработан. Всегда записывается как (syntax k) .

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

Значительный объем в больших приложениях занимает стереотипный код, написание которого является трудоемким процессом. Впоследствии, если в нем обнаружится ошибка, очень и очень трудно будет найти каждый экземпляр такого кода и исправить его. Это означает, что стереотипный код — это одно из немногих мест, где негигиенические макросы полезны.

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

Допустим, что мы создаем CGI-приложение, состоящее из нескольких независимых CGI-сценариев. В большинстве CGI-приложений большая часть переменных состояния хранится в базе данных, но только ID сессии передается в сценарий через куки.

Однако, практически в каждой странице мы должны знать другую стандартную информацию (например, имя пользователя, номер группы, текущую выполняемую пользователем задачу и любую другую относящуюся к делу информацию). Кроме того, мы должны перенаправлять пользователей, если они не имеют соответствующего куки. В листинге 8 приведен код, который мог бы быть стереотипным (функции гипотетического Web-сервера начинаются с webserver: ):

Хотя кое-что из этого может выполняться в процедуре, присвоения определенно нет. Однако мы можем записать большинство из них в макросе. Макрос может быть реализован так:

Теперь мы можем создать новые формы, основанные на нашем стереотипном коде, следующим образом:

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

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

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

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

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

Этих проблем в основном можно избежать, выполнив несколько действий, относящихся к вашим стереотипным макросам:

  • Следуйте соглашениям по именованию, которые явно маркируют макросы как таковые, а также указывают, что переменная пришла из стереотипного кода. Это можно сделать, например, добавляя в качестве суффикса -m для макросов и -b для определенных в макросе переменных.
  • Тщательно документируйте все стереотипные макросы, особенно определяемые присвоения переменных и все изменения между версиями.
  • Используйте стереотипные макросы только тогда, когда выгоды от сокращения повторяемости кода превышают отрицательные стороны неявной функциональности.

В программировании действительно часто необходим маленький предметно-ориентированный язык. Существует много примеров таких используемых в настоящее время языков:

  • Конфигурационные файлы
  • Языки разметки для Web, например HTML
  • Языки управления задачами

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

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

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

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

В листинге 11 приведен пример определения макроса для предыдущего вызова (все функции, начинающиеся с префикса webserver: , являются гипотетическими функциями, предоставляемыми Web-сервером):

Эти макросы требуют небольшого разъяснения. Прежде всего, присутствует новая конструкция — . . Это обозначение по существу означает «повторять предыдущее». Оно может быть использовано и в шаблоне макроса и в выражении.

Макрос resource в основном создает функцию для обработки полномочий безопасности и затем передает их в качестве аргумента в webserver:add-security-function . Это функция с одним аргументом, credentials , который будет использоваться макросом auth-constraints .

Макрос auth-constraints немного более сложен. Он может иметь один из двух форматов — принимать либо одно ограничение для обработки, либо список ограничений. Первый раздел макроса разбивает список ограничений на несколько одиночных ограничений. Обозначение . используется для указания возможного продолжения аналогичных форматов. Мы пользуемся преимуществом, заключающимся в том, что после расширения макроса полученный макрос расширяется снова до тех пор, пока расширения не закончатся. Если вы проследите за итерационными расширениями auth-constraints , то увидите, что он и в самом деле расширяется в список индивидуальных макросов auth-constraints , которые затем обрабатываются по отдельности, используя оставшиеся форматы макроса.

auth-constraints имеет две дополнительные функции, которые не используются в примере. Первая — это основанный на времени механизм авторизации, а вторая — способность к дальнейшему расширению другими макросами и кодом. Основанный на времени механизм авторизации — это попросту пример того, как несколько типов ограничений могут быть добавлены в этот механизм; функция расширения будет использована в следующем примере.

Эти макросы будут расширять наши объявления параметров безопасности в следующее (листинг 12):

Возникает два очевидных вопроса:

  • Почему мы реализовали это в виде макроса?
  • Что не так с XML-объявлениями, используемыми Java?

Есть две причины, которые делают использование макроса более предпочтительным, чем такой язык данных как XML, для файла декларативной безопасности:

  • Декларативная информация преобразуется в императивную форму во время компиляции, а не каждый раз при запуске программы на выполнение, что приводит к более быстрому коду.
  • Что более важно, если декларативный язык недостаточно выразителен для ваших потребностей, — вы также можете включить и императивные операторы в ваш файл, используя всю выразительную мощь языка программирования .

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

Допустим, например, что вы хотите проверить наличие домена, с которого пришел пользователь, в списке запрещенных IP-адресов. Вот как мы можем это сделать, смешивая декларативные и императивные функции безопасности:

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

Метапрограммирование широко используется в программировании широкомасштабных проектов. В данной статье я коснулся инструментальных средств, необходимых для метапрограммирования на языке Scheme, а также привел несколько примеров. Технология метапрограммирования применялась в нескольких прикладных областях:

  • Улучшение синтаксиса
  • Автоматизация генерирования стереотипного кода
  • Написание декларативных подпрограмм

В Scheme вы можете использовать возможности макроязыка для определения практически любого типа предметно-ориентированного языка. Средство для этого существует. Просто нужно решить, какие возможности реализуются более легко и более понятно при помощи макрорасширений, а какие — при помощи обычного кода.

Как создать макросы в «Ворде» — пошаговое описание и рекомендации

А вы знали, что часто повторяемые действия в текстовом редакторе Word последних версий (2007, 2010, 2013, 2020) можно автоматизировать? Достигается это путем создания макросов в «Ворде». Что это, как их сделать, включить/отключить, как открыть файл с такими элементами, мы обязательно разберем далее.

Что это — макросы в «Ворде»?

Макрос — это комплекс инструкций, группируемых в единую команду для автоматического выполнения того или иного задания. Пишутся они на языке Visual Basic в редакторе с одноименным названием.

Чаще всего макросы применяются пользователем для:

  • Ускорения наиболее востребованных действий форматирования, редактирования.
  • Объединения нескольких команд в одну. Как пример — создание таблицы с определенным числом столбцов, строк, стилем границ.
  • Облегчения доступа к параметрам, находящимся в диалоговых окнах.
  • Автоматизации процесса обработки последовательных сложных операций.

Таким образом, макросы в «Ворде» превращают несколько задач в одно действие. Чтобы его осуществить, необходимо набрать комбинацию клавиш или нажать на кнопку панели быстрого доступа.

Word 2010-2020: запись макроса, запускающегося кнопкой

Разберем, как создать макрос в «Ворде» этого типа:

  1. Зайдите в «Вид», выберите «Макрос» — «Создать. «.
  2. Придумайте имя для этого комплекса команд.
  3. Если вы хотите использовать его для всех файлов, то обязательно выберите доступность «Для всех документов».
  4. Кликните на назначение «По кнопке».
  5. В следующем окне кликните на новый макрос. Его наименование будет начинаться с Normal — NewMacros, после чего будет следовать имя, которым вы его обозначили.
  6. Далее — щелчок на «Добавить», а затем на «Изменить».
  7. Из предложенной палитры выберите значок для своего макроса в «Ворде».
  8. Теперь самая важная часть: запись шагов. Для каждого нужно выбрать команду или нажать определенную клавишу. Текст необходимо выделять с помощью клавиатуры. Система будет записывать все шаги, что вы сделаете, — нажатия клавиш, действия мышью.
  9. Когда вы завершите задуманное, закончите запись: зайдя в раздел «Макросы», выберите «Остановить. «

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


Word 2010-2020: запись макроса, запускающегося комбинацией клавиш

Теперь разберем, как создать макрос в «Ворде», который активируется нажатием сочетания кнопок:

  1. Зайдите в «Вид», найдите «Макросы». Далее — «Записать. «
  2. Введите его имя. Не забудьте указать, если это нужно, что макрос доступен для всех документов.
  3. Выберете значок доступности по клавиатуре.
  4. В поле «Новое сочетание. » введите определенную комбинацию клавиш, которая будет запускать в действие макрос. Если она будет совпадать с другой стандартной командой, то нужно придумать иное сочетание.
  5. Кликните на «Назначить».
  6. Теперь запись шагов для макроса: для каждого из них выставляйте определенную команду, щелчок мышкой. Все действия будут сохраняться системой.
  7. Когда все будет готово, зайдите в «Макросы» (меню «Вид») и остановите запись.

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

Word 2007: начало создания макроса

Теперь расскажем, как сделать макрос в «Ворде 2007». Процесс немного отличается от того, что представлен для поздних версий этого текстового редактора.

Первым делом вам нужно активировать вкладку разработчика:

  1. Кликните на кнопку Microsoft Office (круглую, с логотипом компании).
  2. Выберите «Параметры «Ворда»».
  3. В «Основных параметрах. » сделайте активным пункт «Показывать «Разработчик» на ленте».

Теперь переходим непосредственно к созданию комплекса команд:

  1. Зайдите на появившуюся вкладку «Разработчик». В «Коде» выберите «Запись макроса».
  2. В «Имя. » введите название. Будьте внимательны: если оно будет совпадать с наименованием стандартного макроса, то новая запись заменит его. Поэтому для проверки в «Макросах» группы «Код» найдите «Команды Word» и убедитесь, что придуманное имя не совпадает с там присутствующими.
  3. В «Макрос доступен. » выберите, где его можно применять. Если для всех файлов, то остановитесь на Normal.dotm.
  4. Введите описание.

Word 2007: три варианта записи макроса

Далее вы можете пойти тремя путями.

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

Привязка макроса к кнопке. Тут следует пойти таким путем:

  1. Щелкните на «По кнопке».
  2. В «Настройки панели быстрого доступа» выберите все документы или отдельный файл, где можно применять этот макрос.
  3. В окне «Выбрать команды» нажмите на нужный макрос. Затем — щелчок на «Добавить».
  4. Для настройки кликните на «Изменить».
  5. В «Символе» выберите значок для кнопки.
  6. «Отображаемое имя» — наименование макроса.
  7. Два раза кликните на ОК, чтобы начать запись.

Привязка макроса к сочетанию клавиш. Здесь следующий путь:

  1. Остановитесь на «Клавиатуре».
  2. В «Командах» найдите макрос, который вы собрались записать.
  3. В «Новом сочетании клавиш» введите придуманную комбинацию. Клик на «Назначить».
  4. Щелкните на «Закрыть», чтобы начать запись.

Далее путь становится единым для всех вариантов:

  1. Выполните последовательность действий, которую нужно включить в макрос.
  2. Завершить процесс можно выбором «Остановить запись» во вкладке «Код».

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

Документы, поддерживающие макросы, имеют расширение .docm. Трудности с ними иногда возникают на моменте запуска — текстовой редактор выдает ошибку. Разберем, как открыть «Ворд» с макросами:

  • Два раза щелкните на данный документ. Система сама выберет программу на вашем ПК, способную его открыть.
  • При неудаче измените расширение на .doc, .docx.
  • В случае неудовлетворительного результата воспользуйтесь программами:
    • Word 2007, распознающий Open XML.
    • «Ворд» 2010.
    • Приложение FileViewPro.

Включение макросов

Как включить макросы в «Ворде»? Есть три варианта.

При появлении панели сообщений. Как только вы открываете файл с макросами, перед вами на экране выходит желтое окошко с щитом и просьбой включить данный комплекс команд. Только если вы уверены в надежности источника документа, нажмите на панели «Включить содержимое».

С помощью представления Backstage. При открытии файла с макросами сделайте следующее:

  1. Кликните на «Файл».
  2. В «Предупреждении системы безопасности» нажмите на пункт «Включить содержимое».
  3. В данном разделе сделайте активным «Всегда включать. » Это превратит документ в надежный.

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

  1. Откройте вкладку с названием «Файл».
  2. В «Предупреждении системы безопасности» нажмите на «Включить содержимое».
  3. Перейдете в «Доп. параметры».
  4. В «Параметрах безопасности. » выберите «Включить лишь для этого сеанса» в отношении каждого из имеющихся в документе макросов.
  5. Подтвердите нажатием ОК.

Отключение макросов

Напоследок разберем, как убрать макросы в «Ворде»:

  1. Во вкладке «Файл» перейдите на «Параметры».
  2. В «Центре управления. » выберите «Параметры центра. «
  3. Щелкните на «Параметры макросов».
  4. Выберите, что вам нужно:
    • Отключить все без уведомления (как макросы, так и предупреждения об опасности/безопасности).
    • Отключить все с уведомлением (убираются только макросы, уведомления о безопасности остаются).
    • Отключить все, кроме макросов с цифровой подписью (отображаются только макросы издателя, которому выражено доверие, — на их включение нужно согласиться в уведомлении при открытии файла).
  5. Подтвердите выбор нажатием на ОК.

Создание макросов имеет свои особенности в различных версиях текстового редактора «Ворд». А при открытии файла с данной группой команд в данной программе вы можете выбрать, включать или не активировать их.

SBP-Program

Макросы на примерах

Макросы в C

Как писать макросы? Как сделать макрос? Как создавать макросы? Где найти информацию по макросам на русском? Такие вопросы – нередкость. Эта статья для начинающих, её можно было бы назвать «макросы для чайников» или «простой учебник по макросам»

Прямо сейчас разберемся, как написать макрос и рассмотрим примеры макросов. Но прежде ответим на естественный вопрос: зачем нужны макросы?

Для чего нужны макросы?

Для чего нужны макросы? Речь идёт о макросах в C. Макросы позволяют упрощать программу: вместо фразы можно указать её идентификатор. Есть макросы, подобные функциям, текст такой «функции» подставляется на этапе предварительной обработки в место её вызова, что потенциально повышает скорость выполнения программы, ведь нет вызова функции. Эти действия выполняются препроцессором. Есть и другие плюсы работы с макросами, но есть и минусы, о чём будет сказано ниже, когда мы перейдём к примерам создания макросов.

#define

#define в C — это директива, которая применяется при определении символических констант, идентификаторов, макрофункций. Макросы, по-английски macro, бывают двух типов: подобные функциям и подобные объектам. В нашем самоучителе по макросам мы рассмотрим работу с этими типами макросов.

Пример макроса

Пример для макроса-объекта. Это определение символической константы:

Здесь определена символическая константа


SBP — это идентификатор,
«SBP-Program» — это строка, которая будет подставлена вместо SBP.

Если не указывать строку, которая подставляется вместо идентификатора, то вместо идентификатора будет подставлен пробел. Пример:

Вместо него в программе будет подставлен пробел.

Если строка-подстановка не помещается в строку файла, то применяем обратную косую черту в качестве знака переноса. Пример:

Отметим, что макросы, подобные объектам, не принимают параметры.

Далее рассмотрим пример макроса-функции.

Пример макроса-функции

Рассмотрим простой пример макроса, подобного функции, такие макросы ещё называют макрофункциями:

это макроопределение. И что здесь определено? mCircleLength — это название макроса. Префикс m подсказывает нам, что это именно макрос, а не обычная функция. Макрос mCircleLength подобен функции, он принимает параметр r.

Напомню, что макросы, подобные объектам, не принимают параметров.

Что вычилсяет макрос mCircleLength? Он вычисляет длину окружности. Длина окружности равна 2Пи умножить на радиус. 2Пи = 6.28318.

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

После имени макроса в макроопределении, перед первой открывающей скобкой не должно быть пробела. Это важно. Если пробел будет, то мы получим определение символической константы.

Рассмотрим тело макроса

оно охвачено круглыми скобками. Это существенно в общем случае. Параметр r также в скобках. И это важно.

Вот примеры того, что может случиться, если пренебречь скобками:

после подстановки тела макроса получим:

nVar будет хранить число 52, а не 70, как мы ожидали.

Теперь рассмотрим последствия отсутствия скобок вокруг параметра. Если в наш макрос mCircleLength будет передан параметр в виде суммы, например, 1 + 2, то получим:

Вывод: скобки во многих случаях нужны.

Как с помощью макроса превратить объект в строку?

Вот пример такого макроса:

в этой макрофункции строковый оператор (так его иногда называют) # подействует на параметр nVar, в результате nVar будет охвачен кавычками. Код:

оператор # охватил параметр 1 + 2 кавычками, превратив его в строковый литерал. Если убрать # в макроопределении, то макрос mIntToStr сложит 1 + 2. Пример макроса:

Как с помощью макроса объединять строки?

Строки в C можно объединить с помощью оператора ##. Пример макроса:

Указатели в макросах

В макросах можно использовать указатели. Пример макроса с указателями:

Обратите внимание на расстановку скобок в теле макрофункции.

Локальные переменные в макросах

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

Блоки в макросах

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

Двойные вычисления в макросах

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

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

Точка с запятой в макросах

В Си в конце выражения мы ставим точку с запятой

Нужно ли это делать и в макросах? Зависит от конкретного случая. Выше, в разделе «Блоки в макросах» имеется макрофункция:

Если убрать точку с запятой после 10 в этом примере (см. весь пример), то компилятор выдаст ошибку.

В других случаях наличие точки с запятой ведёт к ошибке. Пример (этот пример содержит ошибку):

В этом примере макрос развернётся так:

Здесь потерялась связь между if и else.

В этом случае макрос развернётся так:

Последний вариант работает нормально. Код:

Макросы с переменным числом параметров

Макросы в C могут иметь переменное число параметров. Такие макросы называют variadic macros. Типичный пример variadic macro:

Правила здесь такие:

  • переменные параметры обозначаем тремя точками;
  • если имеются и именованные параметры. То переменные параметры должны быть последними в списке параметров
  • в теле макроса переменные параметры заменяют идентификатором __VA_ARGS__

Теперь пример макроса с переменным числом параметров и с именованными параметрами:

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

в этом случае макрос развернётся в

здесь после запятой нет параметра, а это ошибка в Си. Вывод: как минимум один переменный параметр должен быть передан в этом случае.

Запуск из макроса другого макроса

Запуск макроса из другого макроса рассмотрим на простом примере:

Основы программирования в Microsoft Word. Работа с макросами

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

Основное меню для работы с макросами расположено в «Вид – Макросы».

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

Макросы в MS Word пишутся на упрощенной реализации языка Visual Basic – VBA

или сисярпе. В данном уроке мы написание макросов на сисярпе разбирать не будем – я этого языка попросту не знаю, т. к. не питаю особенно теплых чувств к разработкам Microsoft.

Для данного урока я написал следующие макросы, помогающие исключить из работы всплывающие окна с последующим выбором из списков (что отнимает уйму времени):

1. Для вставки нумерации рисунков и таблиц (бывает полезно, когда приходится оживлять чужой документ, набранный на печатной машинке производства Microsoft);

2. Для вставки подписей к рисункам и таблицам вида «Рисунок 1 – » и «Таблица 1 – »;

3. Для вставки ссылок на нумерацию рисунков и таблиц вида «°Рисунок, «°Таблица, где перечеркнутый текст имеет тип «hidden», то есть мы автоматизируем то, что делали вручную в статье «Учимся работать в Microsoft Word правильно. Работа с рисунками».

Велик соблазн хранить все макросы в отдельном шаблоне global_macros.dotm, как это описано здесь. Но, как выяснилось, работает это только в MS Office for MAC.


Под Windows, после переноса файла global_macros.dotm в папку STARTUP (C:\Documents and Settings\<>\Application Data\Microsoft\Word\STARTUP),

Настроек, подобных «Личные параметры – Расположения файлов» в Microsoft Word 2013 for Windows я не обнаружил (возможно, это уже реализовано в MS Word 2020 или 365). Поэтому, в качестве более универсального решения, я рекомендую добавлять макросы в базовый шаблон Normal.dotm с помощью редактора Microsoft Visual Basic for Applications, который открывается из MS Word с помощью комбинации клавиш «Alt + F11».

Из-за проблем с кодировкой копировать код с русскими буквами нужно только при включенной русской раскладке.

Более хирургические варианты решения этой проблемы описаны тут.

Итак, с помощью контекстного меню «Insert – Module» к шаблону «Normal» добавляем новый модуль, в который мы будем копировать скрипт.

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

Теперь настроим горячие клавиши для запуска макросов.

Для этого переходим в «Файл – Параметры – Настроить ленту – Сочетания клавиш: Настройка. »

В данном примере мы теперь можем добавить подпись к таблице комбинацией клавиш «Ctrl + Shift +ю».

Теперь разберем три из шести написанных макросов для рисунков (макросы для таблиц абсолютно аналогичны).

В принципе, программирование на бейсике особо ничем не отличается от программирования на остальных языках. Современный бейсик похож на Python и Ruby тем, что в нем используются отступы. Комментарии (неисполняемые строки) начинаются с одинарной кавычки.

Как я уже упоминал, процедура в VBA начинается со слова Sub, и заканчивается End Sub.

Переменная объявляется с помощью команды Dim, значение переменной устанавливается с помощью команды Set.

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

Писать скрипты можно непосредственно в редакторе Microsoft Visual Basic for Applications (он «на лету» исполняет скрипт и показывает ошибки), но мне для демонстрации проще делать это в текстовом редакторе Notepad++.

Опишем скрипт InsertImageSequence.bas (вставить номер рисунка).

В целом для написания собственных скриптов вам понадобится научиться работать с полями и текстом.

Логика написания скрипта такая:

1. Нам нужно добавить поле, которое выводит номер последовательности. Посмотреть вид этого поля можно в контекстном меню «Коды / значения полей», кликнув по полю, полученному традиционным способом, правой кнопкой мыши;

2. Далее необходимо указать место, в которое мы хотим вставить текст / поле. В данном случае это текущее местонахождение выделения / курсора. Все основные операции с текстом в VBA замечательно описал Биллиг Владимир Арнольдович, и для понимания работы с объектами Range и Selection, которые мы будем использовать, я рекомендую прочитать его статью;

3. Необходимо в выделение добавить поле с присвоенным ему типом (в данном случае SEQ). Для этого мы будем использовать метод Add, описанный в документации Microsoft. Как обозначаются типы полей в скриптах описано здесь. В данном случае нам необходимо узнать, как обозначается в скрипте тип поля SEQ (wdFieldSequence), чтобы указать его в качестве параметра Type метода Add. Также необходимо указать параметры, которые мы посмотрели в пункте 1.

В итоге у нас получается что-то типа этого

Элементарно. Здесь просто добавились некоторые методы из статьи Биллига для добавления текста до и после поля.

Наконец, рассмотрим скрипт InsertRefToImage.bas (добавить ссылку на изображение).

Что использовалось для написания последнего скрипта:

Все эти замечательные рецепты ищутся в обыкновенном google по запросу, начинающемуся на «word macro» или «word vba».

В следующей статье мы рассмотрим основные правила типографики и работу со списком литературы в MS Word.

Найдены возможные дубликаты

давным-давно работал в мособлсуде в гражданской канцелярии. По четным дням слушались наши дела и надо было готовить их к слушанью и в том числе печатать списки для граждан — в каком зале что слушаться будет.
Так вот, было 5 списков, которые печатали я и 4 девчонки, они состояли из 50-90 табличных строк, в которых на 5 составов поделены 53 районных суда, около 300 фамилий судей, ФИО истца и ответчика и краткая суть заявления в одно предложение.
Этих сутей (типа о возмещении ущерба, разделе наследства, восстановлении на работе и т.д) десятка три. И в среднем по 2-15 дел из каждого города в списке.
Так вот, я заебался каждый раз одно и то же печатать и внес все фамилии судей своего состава, все свои города и все типы заявлений в автозамену. Щёл пишешь — превращается в Щёлково, Троф — в судью Трофимову, преп — о нечинении препятствий в пользовании. и так далее. Заодно то же самое я сделал для девок с их городами и судьями. Печатанье списка у меня ускорилось раз в 5, если не больше.
Так что ты думаешь? Не смотря на мои убеждения и личный пример ни одна овца не пользовалась этим, тупо продолжая десятки раз писать одно и тоже полностью.

Макросы работают быстрее, чем глобальные переменные в C? Как изменить макросы между запусками?

Я пишу программу на C, в которой есть несколько констант, которые я хотел бы использовать для всех своих функций. До сих пор я использовал макросы. Упрощенная версия программы выглядит следующим образом.

Теперь я хочу провести эксперименты с программой, запустив ее несколько раз с разными значениями константы. Я хочу автоматизировать это, а не перекомпилировать каждый раз, когда я изменяю CONSTANT. Я использовал простое решение, изменив макросы на глобальные переменные, поместив исходную основную функцию в новую функцию ‘program ()’, а затем запустил эксперименты в главном файле, т.е.

Я обнаружил, что эта реализация приводит к довольно существенной потере производительности цикла

который теперь требует примерно на 50% больше времени выполнения, чем когда я использовал макрос. Это нормально?

Может ли кто-нибудь предложить более эффективный способ проведения эксперимента?

PS В C ++ я бы сделал это, определив «программу класса», установив CONSTANT в качестве члена класса и «multiplication_by_constant» в качестве функции-члена. Затем я мог бы легко провести эксперименты через «main», используя определение класса, и я думаю, что у меня не было бы потери эффективности . Я должен использовать C в этой реализации, поэтому я прибегнул к глобальным переменным и функции.

Ну, вот потенциальный источник разницы в производительности. С помощью макроса значение CONSTANT известно во время компиляции , поэтому компилятор может воспользоваться этими знаниями и структурировать машинный код немного по-другому. Я взял вариант вашего кода и использовал gcc -Wa,-aldh чтобы получить листинг сборки 1 для версий макросов и глобальных переменных, с интересной разницей.

Первая версия макроса:

Выделенные строки являются основой функции; вместо умножения значения в %eax на 10, функция выполняет арифметический сдвиг влево на 2 места, за которым следует сложение (эффективное умножение на 5), а затем добавляет результат к себе. Например, учитывая значение i 3 :

Если вы измените значение CONSTANT , компилятор сгенерирует другой машинный код (значение CONSTANT равное 7 приводит к арифметическому сдвигу влево на 3 с последующим вычитанием, в то время как значение 19 дает сдвиг влево в 3 с последующим добавлением 3, так далее).

Сравните это с версией глобальной переменной:

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

Вот так все и происходит на моей конкретной платформе ; Я не знаю, какой компилятор вы используете или в какой ОС вы работаете, так что вполне вероятно, что машинный код, который вы получаете, отличается от того, что у меня было выше. Я просто отмечаю, что знание CONSTANT во время компиляции позволяет компилятору выполнить дополнительную оптимизацию.

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

и ваш код на C #include файл const.h:

1. Платформа — SUSE Linux Enterprise Server 10 (x86_64), компилятор — gcc 4.1.2.

Использование макросов для защиты назначения глобальных переменных

Поскольку в C нет языковой функции для защиты назначения глобальных переменных, вы бы рекомендовали сделать что-то вроде этого?

Возьмем следующий пример:

У нас есть модуль с заголовком, который называется module.h и файл реализации module.c . Модуль содержит глобальную переменную называется global_variable . global_variable будет обновляться другими функциями в реализации, но мы не хотим, чтобы пользователи модуля могли для его назначения.

В реализации вы просто #undef макрос, чтобы получить полный доступ для чтения/записи к нему.

Этот метод, очевидно, имеет тот недостаток, что вы не можете создать локальную переменную с идентификатором global_variable без #undef с макросом.

Но если вам удастся придумать соглашение об именах, которое разделяет идентификаторы, это не будет проблемой. Что-то вроде префикса глобальных переменных с помощью glbl _ или GLBL _ . GLBL _ кажется хорошим выбором, так как это также дает вам намек на то, что его можно определить как макрос.

Другой метод, который я понял, заключается в следующем:

Я знаю, что самым простым и гибким подходом является создание функций get для получения значения переменной за счет вызова функции. Но это не мешает мне найти другие хаки для решения проблемы.

Эти злые дела? Я не собираюсь врать, мне нравится играть с макросами. Но я хочу знать, можно ли это применить к серьезному проекту. :)

Автоматизация задач с помощью средства записи макросов — Excel

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

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

При записи макроса записываются все действия, описанные в Visual Basic для приложений (VBA) коде. Эти действия могут включать ввод текста или чисел, нажатие ячеек или команд на ленте или в меню, форматирование ячеек, строк или столбцов, а также импорт данных из внешнего источника, например Microsoft Access. Приложение Visual Basic (VBA) — это подмножество мощного языка программирования Visual Basic, которое входит в большинство приложений Office. Несмотря на то, что VBA обеспечивает возможность автоматизации процессов между приложениями Office, вам не нужно знать код VBA или программное программирование, если это нужно.

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

Макросы и средства VBA находятся на вкладке Разработчик, которая по умолчанию скрыта, поэтому сначала нужно включить ее. Дополнительные сведения см. в статье Отображение вкладки «Разработчик».

Запись макроса

Перед записью макросов полезно знать следующее:

Макрос, записанный для работы с диапазоном Excel, будет выполняться только для ячеек этого диапазона. Поэтому если вы добавите в диапазон новую строку, макрос не будет применяться к ней.

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


В макросе могут содержаться и задачи, не относящиеся к Excel. Процесс макроса может охватывать прочие приложения Office и другие программы, которые поддерживают Visual Basic для приложений (VBA). Например, вы можете записать макрос, который сначала обновляет таблицу в Excel, а затем открывает Outlook для ее отправки по электронной почте.

Чтобы записать макрос, следуйте инструкциям ниже.

На вкладке Разработчик в группе Код нажмите кнопку Запись макроса.

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

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

Чтобы назначить сочетание клавиш для запуска макроса, в поле Сочетание клавиш введите любую строчную или прописную букву. Рекомендуется использовать сочетания клавиш с CTRL+ SHIFT, так как они будут заменять собой совпадающие с ними стандартные сочетания клавиш в Excel, пока открыта книга, содержащая макрос. Например, если назначить сочетание клавиш CTRL+Z (Отменить), вы не сможете использовать его для функции «Отменить» в данном экземпляре Excel.

В списке Сохранить в выберите книгу, в которой вы хотите сохранить макрос.

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

В поле Описание при необходимости введите краткое описание действий макроса.

Хотя поле «Описание» является необязательным, рекомендуется его заполнить. Кроме того, желательно ввести понятное описание, которое будет полезно вам и всем, кто запускает макрос. Если у вас много макросов, описания помогут быстро определить, для чего они нужны.

Чтобы начать запись макроса, нажмите кнопку ОК.

Выполните действия, которые нужно записать.

На вкладке разработчик в группе код нажмите кнопку остановить запись .

Работа с макросами, записанными в Excel

На вкладке Разработчик щелкните Макросы, чтобы просмотреть макросы, связанные с книгой. Кроме того, можно нажать клавиши ALT+F8. При этом откроется диалоговое окно Макрос.

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

Ниже приведены дополнительные сведения о работе с макросами в Excel.

Сведения о параметрах безопасности макросов и их значении.

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

С помощью редактора Visual Basic можно изменять макросы, присоединенные к книге.

Если книга содержит макрос VBA, который нужно использовать где-либо еще, этот модуль можно скопировать в другую книгу с помощью редактора Microsoft Visual Basic.

Назначение макроса объекту, фигуре или графическому элементу

На листе щелкните правой кнопкой мыши объект, рисунок, фигуру или элемент, которому нужно назначить существующий макрос, а затем выберите команду назначить макрос.

В поле Назначить макроса выберите макрос, который вы хотите назначить.

Вы можете назначить макрос значку и добавить его на панель быстрого доступа или ленту.

Вы можете назначать макросы формам и элементам ActiveX на листе.

Узнайте, как включать и отключать макросы в файлах Office.

Открытие редактора Visual Basic

Нажмите клавиши ALT+F11.

Узнайте, как найти справку по элементам Visual Basic.

Работа с записанным кодом в редакторе Visual Basic (VBE)

С помощью редактора Visual Basic (VBE) вы можете добавлять в записанный код собственные переменные, управляющие структуры и другие элементы, которые не поддерживает средство записи макросов. Так как средство записи макросов фиксирует почти каждый шаг, выполняемый во время записи, может также потребоваться удалить ненужный код. Просмотр записанного кода — отличный способ научиться программировать на VBA или отточить свои навыки.

Пример изменения записанного кода можно найти в статье Начало работы с VBA в Excel.

Запись макроса

Перед записью макросов полезно знать следующее:

Макрос, записанный для работы с диапазоном Excel, будет выполняться только для ячеек этого диапазона. Поэтому если вы добавите в диапазон новую строку, макрос не будет применяться к ней.

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

В макросе могут содержаться и задачи, не относящиеся к Excel. Процесс макроса может охватывать прочие приложения Office и другие программы, которые поддерживают Visual Basic для приложений (VBA). Например, вы можете записать макрос, который сначала обновляет таблицу в Excel, а затем открывает Outlook для ее отправки по электронной почте.

Макросы и средства VBA находятся на вкладке Разработчик, которая по умолчанию скрыта, поэтому сначала нужно включить ее.

Перейдите в раздел настройки _гт_ Excel . панель инструментов _Гт_ ленты _амп_.

В категории Настроить ленту в списке Основные вкладки установите флажок Разработчик, а затем нажмите кнопку Сохранить.

Чтобы записать макрос, следуйте инструкциям ниже.

На вкладке Разработчик нажмите кнопку Запись макроса.

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

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

В списке Сохранить в выберите книгу, в которой вы хотите сохранить макрос.

Как правило, макрос сохраняется в указанном расположении книги , но если вы хотите, чтобы макрос был доступен при использовании Excel, выберите пункт Личная книга макросов. Если выбрать команду Личная книга макросов, в Excel будет создана скрытая личная книга макросов (личное. XLSB), если он еще не существует, и сохранение макроса в этой книге. Книги в этой папке открываются автоматически при запуске Excel, а код, хранящийся в личной книге макросов, будет указан в диалоговом окне Макрос, которое описано в следующем разделе.

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

В поле Описание при необходимости введите краткое описание действий макроса.

Хотя поле «Описание» является необязательным, рекомендуется его заполнить. Полезно ввести понятное описание с любой полезной информацией, которая может быть полезна Вам или другим пользователям, которые будут запускать макрос. Если у вас много макросов, описания помогут быстро определить, для чего они нужны.

Чтобы начать запись макроса, нажмите кнопку ОК.

Выполните действия, которые нужно записать.

На вкладке Разработчик щелкните Остановить запись.

Работа с макросами, записанными в Excel

На вкладке Разработчик щелкните Макросы, чтобы просмотреть макросы, связанные с книгой. При этом откроется диалоговое окно Макрос.

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

Ниже приведены дополнительные сведения о работе с макросами в Excel.

Узнайте, как включать и отключать макросы в Excel для Mac.

Чтобы сэкономить время на выполнении часто повторяющихся задач, можно записать соответствующую последовательность действий в виде макроса. Узнайте, как создавать и выполнять макросы.

Если книга содержит макрос VBA, который нужно использовать где-либо еще, этот модуль можно скопировать в другую книгу с помощью редактора Microsoft Visual Basic.

Назначение макроса объекту, фигуре или графическому элементу

На листе щелкните правой кнопкой мыши объект, рисунок, фигуру или элемент, которому нужно назначить существующий макрос, а затем выберите команду назначить макрос.

В поле Назначить макроса выберите макрос, который вы хотите назначить.

Вы можете назначить макрос значку и добавить его на панель быстрого доступа или ленту.

Вы можете назначать макросы формам и элементам ActiveX на листе.

Открытие редактора Visual Basic

На вкладке Разработчик щелкните Visual Basic или выберите Сервис > Макрос > Редактор Visual Basic.

Узнайте, как найти справку по элементам Visual Basic.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community, попросить помощи в сообществе Answers community, а также предложить новую функцию или улучшение на веб-сайте Excel User Voice.

Могут ли макросы работать быстрее глобальных переменных в C? Как изменить макросы между прогонами?

Я пишу программу на C, в которой есть несколько констант, которые я хотел бы использовать всеми моими функциями. До сих пор я использовал макросы. Упрощенная версия программы выглядит следующим образом.

Теперь я хочу запустить эксперименты над программой, выполнив ее несколько раз с разными значениями константы. Я хочу автоматизировать это, а не перекомпилировать каждый раз, когда я меняю CONSTANT. Я использовал простое решение, изменив макросы на глобальные переменные, поставив исходную основную функцию в новую функцию «program()», затем выполнив эксперименты в основном файле, т.е.

Я обнаружил, что эта реализация приводит к довольно значительной потере производительности цикла

что теперь требует примерно на 50% больше времени работы, чем при использовании макроса. Это нормально?

Может ли кто-нибудь предложить более эффективный способ запуска моего эксперимента?

PS В C++ я сделал бы это, определив «программу класса», установив CONSTANT как член класса, и «multiplication_by_constant» — функцию-член. Я мог бы легко запустить эксперименты через «main» с использованием определения класса, и я думаю, что у меня не было бы потери эффективности. Я должен использовать C в этой реализации, поэтому я прибегал к глобальным переменным и функции.

Ну, вот потенциальный источник разницы в производительности. При использовании макроса значение CONSTANT известно во время компиляции, поэтому компилятор может использовать эти знания и структурировать машинный код несколько иначе. Я принял вариацию вашего кода и использовал gcc -Wa,-aldh чтобы получить список сборок 1 для макро- и глобальных переменных версий с интересной разницей.

Во-первых, это макро версия:

Выделенные линии — это мясо функции; вместо умножения значения в %eax на 10 функция выполняет арифметический сдвиг влево на 2 места, за которым следует добавление (эффективно умноженное на 5), а затем добавляет результат к себе. Например, если значение i равно 3 :

Если вы измените значение CONSTANT , компилятор сгенерирует другой машинный код (значение CONSTANT из 7 приводит к арифметическому сдвигу влево на 3 с последующим вычитанием, тогда как значение 19 дает сдвиг влево 3, а затем 3 дополнения, и т.д).

Сравните это с глобальной переменной:

Эта версия использует код операции imull для умножения. Поскольку значение CONSTANT неизвестно во время компиляции, компилятор не может выполнять никаких специальных оптимизаций на основе этого значения.

Теперь это то, как вещи дрожат на моей конкретной платформе; Я не знаю, какой компилятор вы используете или какую ОС вы используете, поэтому, вероятно, код компьютера, который вы получаете, отличается от того, что у меня выше. Я просто указываю, что знание CONSTANT во время компиляции позволяет компилятору сделать некоторую дополнительную оптимизацию.

редактировать

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

и ваш C-код будет #include включать файл const.h:

1. Платформа SUSE Linux Enterprise Server 10 (x86_64), компилятор — gcc 4.1.2

Илон Маск рекомендует:  Советы по написанию хороших программ
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL