Как в книгу excel вставить модуль

Знакомство с понятиями модуль, процедура, форма в VBA Excel. Модули разных типов. Создание пользовательской формы. Встроенные диалоговые окна.

Самый простой способ перейти в редактор VBA — при активном окне программы Excel нажать сочетание клавиш Alt+F11 (здесь используется левая клавиша Alt). Это сочетание работает во всех версиях программы. Если в открывшемся окне нет слева окна проводника «Project-VBAProject», вызовите его через главное меню, выбрав «View» — «Project Explorer». Внутренние окна в редакторе VBA можно перетаскивать и размещать в других местах главного окна.

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

Стандартный модуль

Стандартный модуль представляет из себя отдельный файл, встроенный в рабочую книгу Excel и принадлежащий всему проекту VBA (VBAProject) со всеми его объектами (ThisWorkbook, Worksheets, Charts, UserForms). Стандартный модуль можно экспортировать, импортировать или удалить. Его публичные процедуры с уникальными именами доступны во всех остальных модулях рабочей книги без дополнительной адресации. Для публичных процедур с неуникальными именами требуется указание имени модуля, из которого они вызываются.

Создание стандартного модуля:

  1. Откройте рабочую книгу Excel, в которую планируете добавить новый стандартный модуль, или создайте новую книгу в учебных целях.
  2. Откройте редактор VBA сочетанием клавиш Alt+F11.
  3. В окне редактора VBA нажмите на пункт меню «Insert» и в открывшемся списке выберите «Module».

Таким образом, вы создали новый стандартный модуль. В проводнике справа появилась папка «Modules» и в ней файл «Module1» (или «Module» с другим номером, если в вашей книге модули уже были). Такие же модули создаются при записи макросов встроенным рекордером.

Открыть или перейти в окно открытого стандартного модуля можно, дважды кликнув по его имени в проводнике, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, все уже открытые модули доступны во вкладке «Window» главного меню.

Важное примечание: в Excel 2007-2016 книги с программными модулями сохраняются как «Книга Excel с поддержкой макросов (.xlsm)». Если вы добавили модуль в книгу «Книга Excel (.xlsx)», то, при ее сохранении или закрытии, программа Excel предложит сохранить ее как «Книга Excel с поддержкой макросов (.xlsm)», иначе изменения (созданные или импортированные модули) не сохранятся.

Модули классов

К модулям классов относятся модули книг, рабочих листов, диаграмм и пользовательских форм.

Модуль книги

Модуль книги принадлежит только объекту Workbook (Рабочая книга). Открыть или перейти в окно открытого модуля книги можно, дважды кликнув в проводнике на пункте «ЭтаКнига», или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.

Модуль листа

Модуль листа принадлежит только объекту Worksheet (Рабочий лист). Открыть модуль листа можно, дважды кликнув в проводнике по его имени, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, перейти в модуль листа можно из рабочей книги, кликнув правой кнопкой мыши по ярлыку этого листа и выбрав в контекстном меню «Просмотреть код». Открытый модуль доступен во вкладке «Window» главного меню.

Модуль диаграммы

Модуль диаграммы принадлежит только объекту Chart (Диаграмма, вынесенная на отдельный лист рабочей книги). Открыть его можно так же, как и модуль рабочего листа.

Модуль формы

Модуль формы принадлежит только объекту UserForm (Пользовательская форма). Откройте редактор VBA сочетанием клавиш Alt+F11 и нажмите на пункт меню «Insert». В открывшемся списке выберите «UserForm». Таким образом вы создадите новую пользовательскую форму «UserForm1». В проводнике справа появилась папка «Forms» и в ней файл «UserForm1». Перейти в модуль формы можно, дважды кликнув по самой форме, или кликнув по имени формы в проводнике правой кнопкой мыши и выбрав в контекстном меню «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.

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

Между открытыми окнами форм и модулей можно переходить, нажав в главном меню вкладку «Window», где перечислены все открытые модули и формы (активный объект отмечен галочкой).

Процедура

Процедуры VBA Excel, размещаемые в любом модуле, подразделяются на 3 типа:

  • Sub (подпрограмма),
  • Function (функция),
  • Property (пользовательские свойства).

Главное отличие функции от подпрограммы заключается в том, что функция возвращает результат вычислений, а подпрограмма — нет. Процедура Property предназначена для создания пользовательских свойств и управления ими (используется не часто).

В редакторе VBA Excel перейдите в стандартный модуль и нажмите на пункт меню «Insert». В открывшемся списке выберите «Procedure…». Появится окно с предложением ввести название процедуры, выбрать тип и зону видимости. Создайте пару процедур с разной зоной видимости, пусть одна будет Sub, а другая — Function. В промежутке между началом и концом процедуры пишется программный код.

Private Sub Test()

‘Здесь пишется программный код

End Sub

Зона видимости Private означает, что эту процедуру можно вызвать только из того же модуля, в котором она записана.

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

Публичная процедура (Public) может быть записана и без явного указания видимости — зона видимости Public предполагается по умолчанию.

Первая запись:

и вторая запись:

равнозначны.

Форма

Формы в VBA Excel используются для создания диалоговых окон. Процедура создания новой формы описана в параграфе «Модуль формы». Обычно, вместе с новой формой открывается панель «ToolBox» с элементами управления, которые можно добавлять на форму. Если вы закрыли панель с элементами управлениями, отобразить ее снова можно через главное меню, выбрав «View» — «ToolBox».

Стоит добавить, что в VBA Excel есть два встроенных диалоговых окна — MsgBox и InputBox.

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

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

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

Файлы для скачивания:

Файл Описание Размер файла: Скачивания
Скачать этот файл (P_Macros_01.zip)Пример   14 Кб 2797

Рассмотрим два примера:

Ищем и используем команду
Ищем и используем функцию

1. Ищем и используем команду

Например, нам необходима команда, которая бы вставляла в выделенные ячейки цифру «1». Запускаем поисковик, набираем поисковую фразу, получаем результаты, начинаем просматривать, находим код примерно в таком виде:

Sub Вставка1()
    Dim q As Object
    On Error Resume Next
    Set q = Cells
    For Each q In Selection
        q = 1
    Next q
End Sub

Выделяем данный код (без нумерации строк, начиная со слова Sub) и нажимаем Ctrl+C. Переходим в свою рабочую книгу MS Excel и нажимаем сочетание клавиш Alt+F11, у вас откроется окно редактора VBA:

Как вставить готовый макрос в рабочую книгу?

В левом окне «Project — VBA Project» выбираем (щелкаем мышкой) нашу рабочую книгу, в которую необходимо вставить макрос, например, «VBAProject (Книга2)»:

Я не вижу окна «Project — VBA Project».

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_5.png

В пункте меню «Insert» выбираем «Module»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_2.png

В левом окне «Project — VBA Project» у вас должна появиться новая папка «Modules» и в ней новый объект «Module1»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_3.png

Переходим курсором в правое «Большое» поле для ввода и нажимаем Ctrl+V, скопированный макрос вставиться в модуль:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_4.png

У меня в коде «????????«

После чего закрываем редактор VBA и возвращаемся в рабочую книгу.

Если вы работаете в MS Excel 2007, 2010 или 2013, вам необходимо будет сохранить вашу рабочую книгу как «Книга Excel с поддержкой макросов (.xlsm)»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_16.png

В MS Excel 2003 достаточно будет просто сохранить файл.

Чтобы выполнить скопированный в книгу макрос выделяем ячейки, в которые необходимо вставить «1», нажимаем в меню «Вид» кнопку «Макросы» и в выпавшем списке выбираем пункт «Макросы» или нажимаем сочетание клавиш Alt+F8:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_8.png

Откроется диалоговое окно «Макрос», в списке макросов выбираем свой и нажимаем кнопку «Выполнить»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_9.png

Макрос выполнится — в выделенные ячейки вставиться «1»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_20.png

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

Макросы в MS Excel можно вставлять в следующие места:

  • В Модуль, обычно вставляют код макросов, запуск которых будет производится по нажатию кнопки пользователем (как, например, в нашем случае) или код функций (формул);
  • В Рабочий лист, обычно вставляют код макросов, запуск которых должен происходить автоматически в зависимости от действий пользователя или изменения данных в листе (поменялись данный, макрос выполнился);
  • В Рабочую книгу, обычно вставляют код макросов, запуск которых должен происходить автоматически в зависимости от действий, производимых над книгой (файлом). Например, макрос, который запускается при открытии или закрытии книги, или при ее сохранении;
  • Так же макросы могут быть частью пользовательской формы.

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

Чтобы вставить код в Рабочий лист, в левом окне редактора VBA выберите соответствующий лист, щелкните по нему два раза левой кнопкой мышки, переместите курсор в правое поле ввода и вставьте код.

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_10.png

Для вставки кода в Книгу, выберите «ЭтаКнига»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_17.png

Давайте потренируемся. Вставьте код опубликованный ниже в «Лист1».

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo a
    If Target = 2 Then
        VBA.MsgBox ("Ячейка " & Target.Address & " = 2")
    End If
a:
    Exit Sub
End Sub

Данный макрос выводит информационное сообщение если вы введете в любую ячейку листа «2».

Вернитесь в рабочую книгу, перейдите в «Лист1» и введите в ячейку «А1» цифру «2» и нажмите Enter, после чего у вас должно появиться следующее сообщение:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_11.png

Если вы видите это сообщение, то вы все сделали правильно. Если нет, то вы вставили код куда-то не туда, повторите попытку.

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

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_21.png

2. Ищем и используем функцию

Находим в интернете VBA код функции, которая подсчитывает, например, количество слов в ячейке:

Public Function КолСловВЯчейке(Ячейка As Range)
    Dim q As Variant
    Application.Volatile
    q = VBA.Split(Application.WorksheetFunction.Trim(Ячейка.Value), " ")
    КолСловВЯчейке = UBound(q) + 1
End Function

Копируем код, нажимаем сочетание клавиш Alt+F11, откроется редактор VBA:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_22.png

Добавляем новый модуль в свою книгу и в этот модуль вставляем скопированный код:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_23.png

Закрываем редактор VBA и переходим в свою рабочую книгу. Создаем новый лист (необязательно) в ячейку A1 вводим текст «мама мыла раму». Встаем в ячейку, в которой хотим получить результат (количество слов), в меню «Формулы» нажимаем кнопку «Вставить функцию»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_12.png

В открывшемся окне «Вставка функции» в поле «Категория» выбираем «Определенные пользователем»

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_13.png

В списке доступных функций выбираем «КолСловВЯчейке», нажимаем «ОК»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_14.png

Вводим необходимые аргументы и нажимаем «ОК»:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_15.png

Получаем результат:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_24.png

Важно:

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

Если при вставке макроса в модуль у вас вместо некоторого текста стоят красные знаки «????????«

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_6.png

Это значит, что у вас проблема с кодировкой, которая наблюдается с копированием Кириллического текста из некоторых браузеров. Чтобы победить эту проблему, попробуйте вставить скопированный код в пустой лист MS Excel, как «Текст в кодировке Unicode». Для этого перейдите в книгу MS Excel, выберите или создайте пустой лист, встаньте в ячейку «A1» и нажмите сочетания клавиш Ctrl+Alt+V. Должно будет появиться меню «Специальной вставки», выберите пункт «Текст в кодировке Unicode» и нажмите «OK».

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_7.png

Код должен будет вставиться в рабочий лист без знаков вопроса:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_18.png

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

Если вы не видите в редакторе VBA окна «Project — VBA Project», перейдите во вкладку меню «View» и в списке выберите пункт «Project Explorer» или нажмите сочетание клавиш Ctrl+R:

kak-vstavit-gotovyj-makros-v-rabochuyu-knigu_19.png

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

Хитрости »

3 Август 2013              198857 просмотров


Как добавить код процедуры программно, скопировать модуль

Бывают ситуации, когда кодом создается книга, в нее опять же кодом заносятся данные. И порой необходимо помимо всего прочего добавить в новую книгу и код VBA. Естественно, тоже программно. На самом деле это совсем не сложно.

Для изменения кодов программно необходимо, чтобы было проставлено доверие к объектной модели проекта VBA и изменяемый проект не должен быть защищен. Подробнее читайте в статье: Что необходимо для внесения изменений в проект VBA(макросы) программно
Без этого будет невозможно программное вмешательство в проект VBA.

В данной статье я покажу как программно выполнить следующее:

  • Как копировать модуль из одной книги в другую;
  • Как создать новый модуль;
  • Как создать событийную процедуру (изменение данных на листе, открытие книги и т.п.).

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


 

Теперь перейдем непосредственно к сути. Сначала рассмотрим добавление в проект стандартного модуля.
Для добавления стандартного модуля и кода в нем можно воспользоваться двумя методами:

  1. Экспорт имеющегося модуля(с процедурами) из книги с кодом в новую книгу. Чаще всего применяется когда кодов для записи в новую книгу довольно много и создавать их все, прописывая в коде, весьма неудобно и громоздко;
  2. Создание нового модуля и запись необходимых кодов в него. Применяется, если необходимо создать относительно короткие процедуры в модуле.

 
1. ЭКСПОРТ ИМЕЮЩЕГОСЯ МОДУЛЯ

Sub Copy_Module()
    Dim objVBProjFrom As Object, objVBProjTo As Object, objVBComp As Object
    Dim sModuleName As String, sFullName As String
    'расширение стандартного модуля
    Const sExt As String = ".bas"
 
    'имя модуля для копирования
    sModuleName = "Module1"
    On Error Resume Next
    'проект книги, из которой копируем модуль
    Set objVBProjFrom = ThisWorkbook.VBProject
    'необходимый компонент
    Set objVBComp = objVBProjFrom.VBComponents(sModuleName)
    'если указанного модуля не существует
    If objVBComp Is Nothing Then
        MsgBox "Модуль с именем '" & sModuleName & "' отсутствует в книге.", vbCritical, "Error"
        Exit Sub
    End If
    'проект книги для добавления модуля
    Set objVBProjTo = ActiveWorkbook.VBProject
    'полный путь для экспорта/импорта модуля. К папке должен быть доступ на запись/чтение
    sFullName = "C:" & sModuleName & sExt
    objVBComp.Export Filename:=sFullName
    objVBProjTo.VBComponents.Import Filename:=sFullName
    'удаляем временный файл для импорта
    Kill sFullName
End Sub

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

 
2. СОЗДАНИЕ НОВОГО МОДУЛЯ

Sub Create_NewModule()
    Dim objVBProj As Object, objVBComp As Object, objCodeMod As Object
    Dim sModuleName As String, sFullName As String
    Dim sProcLines As String
    Dim lLineNum As Long
 
    'добавляем новый стандартный модуль в активную книгу
    Set objVBComp = ActiveWorkbook.VBProject.VBComponents.Add(1)
    'получаем ссылку на коды модуля
    Set objCodeMod = objVBComp.CodeModule
    'узнаем количество строк в модуле
    '(т.к. VBA в зависимости от настроек может добавлять строки деклараций)
    lLineNum = objCodeMod.CountOfLines + 1
    'текст всставляемой процедуры
    sProcLines = "Sub Test()" & vbCrLf & _
        "    MsgBox ""Hello, World""" & vbCrLf & _
        "End Sub"
    'вставляем текст процедуры в тело нового модуля
    objCodeMod.InsertLines lLineNum, sProcLines
End Sub

Данная процедура добавит в активную книгу новый модуль и запишет в него процедуру:

Sub Test()
    MsgBox "Hello, World"
End Sub

 
 
CОЗДАНИЕ СОБЫТИЙНЫХ ПРОЦЕДУР
Помимо стандартных процедур, имеется возможность добавить и событийные(изменения на листе, открытие книги и т.п.). Я приведу примеры создания кода:

  • в Лист1 на изменении данных ячейки в новой книге
  • в ЭтаКнига(ThisWorkbook) на событие открытия книги.

На их основе уже можно будет понять как создать другие событийные процедуры.

 
CОЗДАНИЕ СОБЫТИЙНОЙ ПРОЦЕДУРЫ Worksheet_Change в Лист1

Sub CreateEventProcedure_WorkSheetChange()
    Dim objVBProj As Object, objVBComp As Object, objCodeMod As Object
    Dim lLineNum As Long
    'добавляем новую книгу
    Workbooks.Add
    'получаем ссылку на проект и модуль листа
    Set objVBProj = ActiveWorkbook.VBProject
    Set objVBComp = objVBProj.VBComponents("Лист1")
    Set objCodeMod = objVBComp.CodeModule
    'вставляем код
    With objCodeMod
        lLineNum = .CreateEventProc("Change", "Worksheet")
        lLineNum = lLineNum + 1
        .InsertLines lLineNum, "    MsgBox ""Hello World"""
    End With
End Sub

Важно: для русской версии используется ссылка на Лист1. Для английской как правило Sheet1

Set objVBComp = objVBProj.VBComponents("Sheet1")

 
CОЗДАНИЕ СОБЫТИЙНОЙ ПРОЦЕДУРЫ Workbook_Open

Sub CreateEventProcedure()
    Dim objVBProj As Object, objVBComp As Object, objCodeMod As Object
    Dim lLineNum As Long
    'добавляем новую книгу
    Workbooks.Add
    'получаем ссылку на проект и модуль книги
    Set objVBProj = ActiveWorkbook.VBProject
    Set objVBComp = objVBProj.VBComponents("ЭтаКнига")
    Set objCodeMod = objVBComp.CodeModule
    'вставляем код
    With objCodeMod
        lLineNum = .CreateEventProc("Open", "Workbook")
        lLineNum = lLineNum + 1
        .InsertLines lLineNum, "    MsgBox ""Hello World"""
    End With
End Sub

Важно: для русской версии используется ссылка на ЭтаКнига. Для английской ThisWorkbook

Set objVBComp = objVBProj.VBComponents("ThisWorkbook")

 

 
Функция CopyVBComponent
ПОЗВОЛЯЕТ КОПИРОВАТЬ ЛЮБОЙ КОМПОНЕНТ ИЗ ОДНОЙ КНИГИ В ДРУГУЮ

'---------------------------------------------------------------------------------------
' Procedure : CopyVBComponent
' DateTime  : 02.08.2013 23:10
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Функция копирует компонент из одной книги в другую.
'             Возвращает True, если копирование прошло удачно
'             False - если компонент не удалось скопировать
'
' wbFromFrom             Книга, компонент из VBA-проекта которой необходимо копировать
'
' wbFromTo               Книга, в VBA-проект которой необходимо копировать компонент
'
' sModuleName            Имя модуля, который необходимо копировать.
'
' sModuleToName          Имя модуля, в который необходимо копировать.
'
' bOverwriteExistModule  Если True или 1, то при наличии в конечной книге
'                        компонента с именем sModuleName - он будет удален,
'                        а вместо него импортирован копируемый.
'                        Если False, то при наличии в конечной книге
'                        компонента с именем sModuleName функция вернет False,
'                        а сам компонент не будет скопирован.
'---------------------------------------------------------------------------------------
Function CopyVBComponent(sModuleName As String, ByVal sModuleToName As String, _
    wbFromFrom As Workbook, wbFromTo As Workbook, _
    bOverwriteExistModule As Boolean) As Boolean
 
    Dim objVBProjFrom As Object, objVBProjTo As Object
    Dim objVBComp As Object, objTmpVBComp As Object
    Dim sTmpFolderPath As String, sVBCompName As String, sModuleCode As String
 
    'Проверяем корректность указанных параметров
    On Error Resume Next
    Set objVBProjFrom = wbFromFrom.VBProject
    Set objVBProjTo = wbFromTo.VBProject
 
    'если в книге, из которой копируем нет проекта VBA
    If objVBProjFrom Is Nothing Then
        CopyVBComponent = False: Exit Function
    End If
    'если в книге, из которой копируем для проекта VBA установлен пароль
    If objVBProjFrom.Protection = 1 Then
        CopyVBComponent = False: Exit Function
    End If
 
    'если в книге, в которую копируем нет проекта VBA
    If objVBProjTo Is Nothing Then
        CopyVBComponent = False: Exit Function
    End If
    'если в книге, в которую копируем для проекта VBA установлен пароль
    If objVBProjTo.Protection = 1 Then
        CopyVBComponent = False: Exit Function
    End If
 
    'если не задано имя копируемого модуля
    If Trim(sModuleName) = "" Then
        CopyVBComponent = False: Exit Function
    End If
    'если не задано имя модуля для вставки кода - используем имя копируемого
    If Trim(sModuleName) = "" Then
        sModuleToName = sModuleName
    End If
 
    'проверяем, существует ли в книге из которой копируем заданный модуль
    Set objVBComp = objVBProjFrom.VBComponents(sModuleName)
    'модуля нет - выходим из функции
    If objVBComp Is Nothing Then
        CopyVBComponent = False: Exit Function
    End If
 
    '====================================================
    'полный путь для экспорта/импорта модуля. К папке должен быть доступ на запись/чтение
    sTmpFolderPath = Environ("Temp") & "" & sModuleToName & ".bas" '"
    If bOverwriteExistModule = True Then
        ' Если bOverwriteExistModule = True
        ' удаляем из временной папки и из конечного проекта
        ' модуль с указанным именем
        If Dir(sTmpFolderPath, 6) <> "" Then
            Err.Clear
            Kill sTmpFolderPath
            'удалить не удалось, модуль не сохранен. Выход из функции
            If Err.Number <> 0 Then
                CopyVBComponent = False: Exit Function
            End If
        End If
        'удаляем модуль из конечной книги
        With objVBProjTo.VBComponents
            Set objVBComp = Nothing
            Set objVBComp = .Item(sModuleToName)
            'только если это не модуль листа или книги(их можно только очистить, но не удалять)
            If objVBComp.Type <> 100 Then
                .Remove .Item(sModuleToName)
            End If
        End With
    Else
        Err.Clear
        Set objVBComp = objVBProjTo.VBComponents(sModuleToName)
        If Err.Number <> 0 Then
            'Err.Number 9 - отсутствие указанного компонента, что нам не мешает.
            'Если ошибка другая - выход из функции
            If Err.Number <> 9 Then
                CopyVBComponent = False: Exit Function
            End If
        End If
    End If
 
    '====================================================
    'Экспорт/Импорт компонента во временную директорию
    objVBProjFrom.VBComponents(sModuleName).Export sTmpFolderPath
    '====================================================
    'копируем
    Set objVBComp = Nothing
    Set objVBComp = objVBProjTo.VBComponents(sModuleToName)
    If objVBComp Is Nothing Then
        objVBProjTo.VBComponents.Import sTmpFolderPath
    Else
        'Если компонент - модуль листа или книги -
        'его нельзя удалить. Поэтому удаляем из него весь код
        'и добавляем код из копируемого компонента
        If objVBComp.Type = 100 Then
            'для простоты обращения в коде - делаем ссылку на копируемый модуль
            Set objTmpVBComp = objVBProjFrom.VBComponents(sModuleName)
            'копируем из него код
            With objVBComp.CodeModule
                .DeleteLines 1, .CountOfLines
                sModuleCode = objTmpVBComp.CodeModule.Lines(1, objTmpVBComp.CodeModule.CountOfLines)
                .InsertLines 1, sModuleCode
            End With
        End If
    End If
    'удаляем временный файл компонента
    Kill sTmpFolderPath
    CopyVBComponent = True
End Function

Пример вызова функции CopyVBComponent
Обычные модули, модули классов и форм(если в конечной книге надо использовать то же имя модуля, что и у копируемого модуля):

Sub CopyComponent()
    Workbooks.Add
    If CopyVBComponent("Module1", "", ThisWorkbook, ActiveWorkbook, True) Then
        MsgBox "Указанный компонент успешно скопирован в новую книгу", vbInformation
    Else
        MsgBox "Компонент не был скопирован", vbInformation
    End If
End Sub

Если необходимо копировать код из обычного модуля в модуль ЭтаКнига:

Sub CopyComponent()
    Workbooks.Add
    If CopyVBComponent("Module1", ActiveWorkbook.CodeName, ThisWorkbook, ActiveWorkbook, True) Then
        MsgBox "Указанный компонент успешно скопирован в новую книгу", vbInformation
    Else
        MsgBox "Компонент не был скопирован", vbInformation
    End If
End Sub

Приведенная функция так же может копировать коды и внутри одной книги: например, перенести код из стандартного модуля в модуль ЭтаКнига или модуль листа:

Sub CopyComponent()
    Workbooks.Add
    If CopyVBComponent("Module1", ThisWorkbook.CodeName, ThisWorkbook, ThisWorkbook, True) Then
        MsgBox "Указанный компонент успешно скопирован в новую книгу", vbInformation
    Else
        MsgBox "Компонент не был скопирован", vbInformation
    End If
End Sub

Думаю теперь у вас не должно возникнуть трудностей с переносом кодов из одной книги в другую.

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


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

  Плейлист   Видеоуроки


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



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

Функции программы Microsoft Excel: расчет модуля

Модуль в Microsoft Excel

​Смотрите также​Terion​ References​ Стиль ссылок R1C1​добавляю ABS со​Norton​Если ячейка A1​= СУММ({60,-120}*{1,-1}) = СУММ({60,120})​ понадобится просуммировать большое​

​Использовать формулу массива или​ же как и​

Функция ABS

​A1:A8​180​ диапазоне. Этот вопрос​ вниз до конца​ кнопку, размещенную справа​ положительное значение числа​Модуль – это абсолютная​: и более того,​Добавляешь простанство имен​

​vsem medved​ скобками и нажимаю​: Спасибо, Гуру!​ содержит -16, то:​ = 180​ количество значений, скорость​СУММПРОИЗВ​ функция​

Функция ABS в Microsoft Excel

​– это полноценная​:​ довольно регулярно всплывает​ таблицы. Таким образом,​ от формы ввода.​ 8.​

Результат рассчета модуля в Microsoft Excel

​ положительная величина любого​ даже с этим​C# using Excel​: спасибо огромное господа.​ волшебную комбинацию ctrl+shift+enter,​vsem medved​КОРЕНЬ(ABS(A1)) равняется 4​Думаю, что теперь вы​ работы станет заметно​(SUMPRODUCT) для решения​СУММ​ таблица данных. Поэтому​= 10 + 10​

Переход в мастер функций в Microsoft Excel

​ на форумах, и​ в данном столбце​После этого, окно сворачивается,​Существует ещё один способ​ числа. Даже у​ он может продолжать​ = Microsoft.Office.Interop.Excel;Пример работы:​

Мастер функций в Microsoft Excel

​ жить стало легче​ но результата нету.​: Как органичнее преобразовать​Adm123​ знаете все основные​ замедляться.​ такой задачи –​(SUM). Но есть​ при добавлении формулы​ + 20 +​ многие пользователи часто​ в ячейках появятся​

Переход к выбору ячеек в Microsoft Excel

​ а вам нужно​ расчета модуля. Он​ отрицательного числа модуль​ висеть в памяти.чтобы​C# Excel.Application xlApp​Руслан​в какой момент​ формулу?​: =ABS(чего-то)​ способы подсчета суммы​

Выбор ячеек в Microsoft Excel

​Думаю, что данный подход​ очень грубый подход!​ и существенные отличия,​=ABS(A2)​ 20 + 30​

Переход к вычеслению модуля в Microsoft Excel

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

Модуль в Microsoft Excel вычеслен

​ эксель в итоге​ = new Excel.Application();​: Подскажите пожалуйста как​ нужно нажимать ctrl+shift+enter?​Сейчас такая ситуация:​Hokmun™​ абсолютных значений в​ самый удобный из​Функция​ например,​в ячейку​ + 40 +​ при работе с​ исходных данных.​ где содержится число,​ пользователей, которые не​ Давайте выясним, как​

Копирование функции вычисления модуля в другие ячейки в Microsoft Excel

​ отпустило, надо создавать​ Excel.Workbook xlWorkBook =​ вставить код в​кстати можно ли​значение ячейки делится​: ABS​ Excel. Если вы​ всех ранее перечисленных.​СУММ​ПРОМЕЖУТОЧНЫЕ.ИТОГИ​

​В2​ 50 = 180​ этим, казалось бы,​Важно заметить, что некоторые​ от которого хотите​ привыкли держать в​ рассчитать величину модуля​ отдельные объекты на​ xlApp.Workbooks.Add(misValue); Excel.Worksheet xlWorkSheet​ модуль листа (куда​ изменить в настройках​

​ на максимальное значение​

lumpics.ru

Суммирование по модулю в Excel

​Возвращает модуль (абсолютную​ используете другой подход​ С помощью функции​в формуле массива:​(SUBTOTAL) полностью игнорирует​, Excel расширил таблицу​На мой взгляд, лучший​ простым действием.​ пользователи пытаются записать​ рассчитать модуль. После​ голове различные формулы.​ в приложении Microsoft​ каждый чих, вплоть​

​ = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlApp.Visible​ заходить надо в​ excel вид названия​ из выбранного диапазона​ величину) числа. Абсолютная​ для суммирования чисел​СУММЕСЛИ​=СУММ(ABS(A2:A8))​

​ числа, которые были​

Суммирование по модулю в Excel

​ и автоматически заполнил​ способ подсчета суммы​​К сожалению, в Microsoft​​ модуль, как это​​ того, как число​​ Кликаем по ячейке,​

​ Excel.​ до объекта диапазона​ = true; //Заносим​ Excel)​ ячеек на классические​

​=R[-1]C/МАКС(R[-3]C[-2]:R[-2]C[-2])​ величина числа -​ по модулю, поделитесь​(SUMIF) значения делятся​=SUM(ABS(A2:A8))​​ скрыты вручную или​​ все ячейки в​

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

Вариант 1 — Использование вспомогательного столбца

​Скачать последнюю версию​ ячеек​ данные в ячейку​вот код который​ A1, B2 и​а очень хочется​​ это число без​​ им в комментариях.​

​ на 2 массива:​

​При вводе формулы массива​ с помощью фильтрации.​​ столбце. Далее я​​ Excel – использовать​​ встроенной функции способной​​ то есть |(число)|,​ на кнопку справа​ чтобы хранился результат.​ Excel​​добавьте ссылку на​​ 1,1 xlWorkSheet =​ нужно вставить:​​ т.д. С R[]C[]​​ и нужно, чтобы​

​ знака.​
​ Удачи!​

​ с положительными и​​ не забудьте нажать​​ Есть еще несколько​ перешел на вкладку​ вспомогательный столбец. В​​ выполнить суммирование по​​ например |-48|. Но,​​ от поля ввода.​​ Жмем на кнопку​Для расчета величины модуля​ нужную бибилиотеку экселя​ (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlWorkSheet.Cells[1, 1]​Private Sub Worksheet_BeforeDoubleClick(ByVal​​ я совсем не​​ значение ячейки делилось​Синтаксис​​Урок подготовлен для Вас​​ отрицательными числами и​Ctrl+Shift+Enter​ отличий, но это​​Конструктор​​ ячейку​ модулю, поэтому Вы​​ в ответ они​​Снова запускается окно с​ «Вставить функцию», размещенную​ в приложении Excel​

Суммирование по модулю в Excel

​ в referencies​ = «hello world»;​ Target As Range,​​ понимаю логики наименования​​ на максимальное по​ABS(число)​ командой сайта office-guru.ru​ суммируются. Ноль по​.​​ мало относится к​​(Design), которая находится​B2​ должны немного поработать,​​ получают ошибку, так​​ аргументами функции. Как​ слева от строки​ существует специальная функция​Я не работал​ //завершаем работу xlWorkBook.Close(false,​ Cancel As Boolean)​ ячеек​ модулю значение из​

​Число — это​Источник: https://colinlegg.wordpress.com/2013/06/03/calculate-the-absolute-sum-in-excel/​ понятным причинам игнорируется.​Формула с​ теме данной статьи.​ в группе вкладок​вводим формулу:​ чтобы получить правильный​ как Excel не​ видим, поле «Число»​ формул.​

​ под названием ABS.​ с Екселем и​ null, null); xlApp.Quit();​Target = Format(Time,​Serge​ выбранного диапазона​ действительное число, модуль​

Вариант 2 — Использование функции СУММ в формуле массива или СУММПРОИЗВ

​Перевел: Антон Андронов​​ Затем мы просто​​СУММПРОЗВ​Способ со вспомогательным столбцом​Работа с таблицами​

Суммирование по модулю в Excel

​=ABS(A2)​​ ответ.​​ понимает подобный синтаксис.​

​ заполнено значением. Жмем​
​Запускается окно Мастера функций.​

​ Синтаксис этой функции​ хотелось бы уточнить:​​planar​​ «Long Time»)​

​:​​Владимир​​ которого требуется найти.​

​Автор: Антон Андронов​
​ вычитаем из положительной​

​:​ хорош тем, что​​(Table tools), и​​Затем протянем ее до​Вот наши данные:​Как видим, в расчете​ на кнопку «OK».​ В списке, который​ очень простой: «ABS(число)».​ А если было​: Маленькая поправочка. При​End Sub​Serge​: ..И что, не​Alex gordon​Чертовка ангелина​ суммы отрицательную (т.е.​=СУММПРОИЗВ(ABS(A2:A8))​

Вариант 3 — Использование СУММЕСЛИ

​ дает большую гибкость,​ поставил галочку возле​ ячейки​Мы видим, что сумма​​ модуля из числа​​Вслед за этим, в​ расположен в нем,​ Либо, формула может​ открыто несколько книг?​ таком окончании работы​Pelena​: В момент ввода​ делится? Тогда пример,​: Подробная инструкция в​: ABS​ суммируем их). Формула​

​=SUMPRODUCT(ABS(A2:A8))​
​ если необходимо использовать​

​ опции​B8​

​ чисел в диапазоне​
​ в приложении Microsoft​

Суммирование по модулю в Excel

​ ранее указанной вами​ нужно найти функцию​ принимать такой вид​

​ то данная процедура​

​ excel продолжает висеть​: Почитайте здесь​ формулы. О том​

​ что и где​ видео​

​Возвращает модуль (абсолютную​ выглядит вот так:​Учитывая, что можно использовать​ данные в дальнейшем,​Строка итогов​. Функция​A2:A8​ Excel нет ничего​ ячейке выводится значение​ ABS, и выделить​

​ «ABS(адрес_ячейки_с_числом)».​ закроет все? или​
​ в памяти.​
​djbaze​

​ что всё сделано​

office-guru.ru

Как сделать, чтобы Excel считал по модулю?

​ не делится.​​https://www.youtube.com/watch?v=C_d7_azCgXY​
​ величину) числа. Абсолютная​=СУММЕСЛИ(A2:A8,»>0″)-СУММЕСЛИ(A2:A8,»​ более эффективную функцию​ например, в виде​(Total Row). Все​
​ABS​
​дает результат​
​ сложного, так как​ модуля того числа,​ её. Затем нажимаем​Для того, чтобы рассчитать,​
​ только одну.​
​Нужно заканчивать вот​
​: как создать модуль​
​ правильно просигналят {}​———​
​Norton​

​ величина числа -​​=SUMIF(A2:A8,»>0″)-SUMIF(A2:A8,»​

​СУММЕСЛИ​​ таблицы или сводной​
​ значения в столбце​возвращает модуль числа.​-60​ данное действие выполняется​ которое вы выбрали.​
​ на кнопку «OK».​
​ например, модуль от​
​просто вот так​ так:​ для вывода данных​

​ вокруг формулы​​19392​: Всем привет!​
​ это число без​

Модуль числа

​Можно записать и в​​(SUMIF), чтобы получить​
​ таблицы. Кроме этого,​B​ Так что теперь​:​ с помощью простой​Если значение расположено в​Открывается окно аргументов функции.​

​ числа -8, нужно​

​ у меня выглядит​​C# Marshal.ReleaseComObject(xlWorkSheet); xlWorkBook.Close(true,​

​ на Excel в​​vikttur​

​ikki​​Господа, помогите советом,​ знака.​

​ таком виде:​

​ тот же результат​ вспомогательный столбец может​автоматически просуммировались, а​
​ мы можем просто​

​= -10 + 10​ функции. Единственное условие​ таблице, то формулу​ Функция ABS имеет​ вбить в строку​ код на 1С​

​ Missing.Value, Missing.Value); Marshal.ReleaseComObject(xlWorkBook);​​ приложениях windows form​: О формулах массивов:​: формула массива​ в ячейке получается​

​Синтаксис​
​=СУММ(СУММЕСЛИ(A2:A8,{«>0»,»​

​ (см. вариант 3),​​ использоваться для сортировки​
​ результат отобразился в​

​ просуммировать диапазон​​ + 20 +​ состоит в том,​ модуля можно скопировать​

​ всего один аргумент​

​ формул или в​​1C Эксель =​

​ xlApp.Workbooks.Close(); Marshal.ReleaseComObject(xlApp.Workbooks); xlApp.Quit();​Johnny_D​Изменить стиль ссылок:​=B1/МАКС(ABS(A1:A3))​

​ отрицательное число, как​ABS(число)​

​=SUM(SUMIF(A2:A8,{«>0»,»​ путь с использованием​ чисел по модулю.​ отдельной строке.​B2:B8​ -20 + 30​ что данную функцию​ и на другие​ — число. Вводим​

​ любую ячейку на​​ Новый COMObject(«Excel.Application»); РабочаяКнига​

​ Marshal.ReleaseComObject(xlApp);​​: Модуль — библиотека?​ Файл-Параметры-Формулы-Стиль_ссылок.​Казанский​ сделать так что​Число — это​

​Если мы возьмем первый​​ этих двух формул​

​Это без сомнения очень​Для подсчета суммы в​
​и это даст​ + -40 +​

​ нужно просто знать.​​ ячейки. Для этого,​ его. Если же​ листе, следующую формулу:​ = Эксель.Workbooks.Open(ИмяФайла); КоличествоЛистов​

​djbaze​​Зачем его создавать,​В 2003 (не​

planetaexcel.ru

Как вставить код в модуль листа? (Настройки Excel)

​: Добавить ABS и​​ бы в этой​ действительное число, абсолютную​ вариант формулы, получим​ становится непредпочтительным. Обе​ хороший способ, но​
​ строке итогов используется​ нам результат​
​ -50 = -60​Автор: Максим Тютюшев​ нужно стать на​
​ вы хотите взять​ «=ABS(-8)».​
​ = Эксель.Worksheets.Count; //​

​: эта ссылка не​​ он уже есть.​

excelworld.ru

Как создать модуль для вывода данных на Excel в приложениях WinForms?

​ точно): Параметры-Вычисления-Стиль_ссылок.​​ ввести как формулу​ ячейке значение было​ величину которого требуется​ следующее:​

​ формулы прекрасно работают​​ что же делать,​
​ функция​180​Если бы мы рассматривали​Мой коллега однажды спросил​

​ нижний левый угол​​ число из данных,​Чтобы произвести расчет, жмем​
​ … Для Каждого​
​ работает… tut posle​ Покури форум, тут​
​Guest​ массива (Ctrl+Shift+Enter)?​ по модулю числа?​ найти.​= 60-(-120) = 180​ с небольшими диапазонами​ когда необходимо все​ПРОМЕЖУТОЧНЫЕ.ИТОГИ​.​ абсолютные значения (числа​ меня, как использовать​ ячейки, в которой​

​ которые хранятся в​​ на кнопку ENTER.​ Книга Из Эксель.WorkBooks​ Microsofta 6 podmenu,​ такого полно.​
​: В 2003 (точно):​=R[-1]C/МАКС(ABS(R[-3]C[-2]:R[-2]C[-2]))​
​Спасибо!​Примеры​Для полноты картины, подсчитаем​ данных, уверен, вы​

​ уместить в одну​​(SUBTOTAL). Это универсальная​=СУММ(B2:B8)​ без знака «-«),​ формулы Excel, чтобы​ уже есть формула,​

​ какой-либо ячейке документа,​​ Как видим, программа​ Цикл Книга.Close(Ложь,Неопределено,Истина); КонецЦикла;​ v kotorix netu​kenny69​ Сервис — Параметры​vsem medved​vikttur​ABS(2) равняется 2​ сумму с помощью​ даже не ощутите​
​ формулу без каких-либо​ функция, которая может​=SUM(B2:B8)​

​ то результат был​ вычислить сумму абсолютных​ зажать кнопку мыши,​ то нажмите на​ выдает в ответ​ Эксель.Quit();​ Office​: Подключаешь Microsoft.Office.Interop.Excel.dll в​
​ — Общие -​: =R[-1]C/МАКС(ABS(R[-3]C[-2]:R[-2]C[-2])) не работает​: =ABS()​
​ABS(-2) равняется 2​ второго варианта:​ разницу. Если же​ вспомогательных столбцов?​ выполнять суммирование, так​В моем примере диапазон​ бы​ значений в указанном​

CyberForum.ru

​ и провести ею​

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

Большинство пользователей не являются гуру Microsoft Office. Они могут не знать всех тонкостей работы той или иной функции, и не смогут ответить на вопрос, как отличается скорость выполнения макроса VBA в Excel 2010 и 2013. Многие просто используют Excel, как инструмент для обработки данных.

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

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

    1. Открываем рабочую книгу в Excel.
    2. Нажатием Alt+F11 вызываем окно редактора Visual Basic
    3. На панели Project-VBAProject кликаем правой кнопкой мыши по имени рабочей книги (в левой верхней части окна редактора) и в контекстном меню выбираем Insert > Module.
    4. Копируем код VBA (с веб-страницы или из другого источника) и вставляем его в правую область редактора VBA (окно Module1).Подсказка: Как увеличить скорость выполнения макроса?

    В самом начале кода Вашего макроса VBA должны содержаться строки:

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Если таких строк нет, то обязательно добавьте следующие строки в свой макрос, чтобы он работал быстрее (см. рисунок выше):

      В самое начало кода после всех строк, начинающихся с Dim (если строк, начинающихся с Dim нет, то вставляем сразу после строки Sub):

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    Вставляем и запускаем макрос в Excel

    1. Нажимаем Alt+Q, чтобы закрыть окно редактора VBA и вернуться к книге Excel.

    Запускаем макрос VBA в Excel

    Чтобы запустить только что добавленный макрос, нажмите Alt+F8. Откроется диалоговое окно Макрос (Macro). В списке Имя макроса (Macro name) выберите нужный макрос и нажмите кнопку Выполнить (Run).

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

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

    Способ 1. Создание макросов в редакторе Visual Basic

    Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно — редактор программ на VBA, встроенный в Microsoft Excel.

    macro1.jpg

    • В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис — Макрос — Редактор Visual Basic(Toos — Macro — Visual Basic Editor).
    • В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)

      :

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

    macro2.jpg

    Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:

      Обычные модули — используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert — Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:

    macro3.jpg

    macro4.jpg

    macro5.jpg

    Обычный макрос, введенный в стандартный модуль выглядит примерно так:

    macro6.jpg

    Давайте разберем приведенный выше в качестве примера макрос Zamena:

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

    Способ 2. Запись макросов макрорекордером

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

    • Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу — запись останавливается.
    • Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
    • Если во время записи макроса макрорекордером вы ошиблись — ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) — во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.

    Чтобы включить запись необходимо:

    • в Excel 2003 и старше — выбрать в меню Сервис — Макрос — Начать запись(Tools — Macro — Record New Macro)
    • в Excel 2007 и новее — нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)

    Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:

    macro7.jpg

    • Имя макроса — подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
    • Сочетание клавиш — будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис — Макрос — Макросы — Выполнить(Tools — Macro — Macros — Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
    • Сохранить в. — здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
      • Эта книга — макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
      • Новая книга — макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
      • Личная книга макросов — это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.

      После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .

      Запуск и редактирование макросов

      Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или — в старых версиях Excel — через меню Сервис — Макрос — Макросы (Tools — Macro — Macros) :

      macro8.jpg

      • Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
      • Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
      • Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.

      Создание кнопки для запуска макросов

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

      Кнопка на панели инструментов в Excel 2003 и старше

      Откройте меню Сервис — Настройка (Tools — Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый «колобок» — Настраиваемую кнопку (Custom button) :

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

      Кнопка на панели быстрого доступа в Excel 2007 и новее

      Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :

      macro11.jpg

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

      macro12.jpg

      Кнопка на листе

      Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:

      • В Excel 2003 и старше — откройте панель инструментов Формы через меню Вид — Панели инструментов — Формы (View — Toolbars — Forms)
      • В Excel 2007 и новее — откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)

      Выберите объект Кнопка (Button) :

      macro13.jpg

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

      Создание пользовательских функций на VBA

      Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция — только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).

      Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert — Module и введем туда текст нашей функции:

      macro14.jpg

      Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка — Функция) в категории Определенные пользователем (User Defined) :

      macro15.jpg

      После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:

      Любой код VBA должен где-то храниться. Для хранения кодов в VBA используются модули, которые хранятся в книге. Книга может содержать сколько угодно модулей. Каждый модуль в свою очередь может содержать множество процедур(макросов).
      Все имеющиеся в книге модули можно посмотреть через редактор VBA (Alt+F11). Имеющиеся модули отображены в левой части редактора в проводнeике объектов(Project Explorer).
      рис.1
      Сам проводник объектов может быть не отображен по умолчанию и тогда его необходимо отобразить: нажать Ctrl+R либо в меню редактора VBA-View-Project Explorer

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

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

      Для того, чтобы создать новый стандартный модуль(Module), модуль класса(ClassModule) или пользовательскую форму(UserForm) надо просто в окне Проводника объектов(Project Explorer) щелкнуть правой кнопкой мыши, выбрать пункт Insert и затем тип добавляемого объекта(Module, ClassModule, UserForm). Так же добавить модуль можно и через меню: Insert -тип модуля.
      Удалить тоже просто: щелкнуть правой кнопкой мыши на нужном модуле в окне проекта и выбрать Remove. Подробнее про удаление в конце статьи этой статьи: Удаление модулей

      СТАНДАРТНЫЙ МОДУЛЬ
      на рис.1 Module1 .
      Самый распространенный тип модулей, который используется в большинстве случаев. Именно в них макрорекордер создает записываемые макросы. Все коды и процедуры в таких модулях пишутся вручную, либо копируются из других источников(другого модуля, с этого сайта и т.п.). В основном именно в стандартных модулях содержится большая часть кодов. Они предназначены для хранения основных процедур и Public переменных, которые могут быть доступны впоследствии из любого модуля. Как создать стандартный модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert-Module. При записи макрорекордером модули создаются автоматически и им автоматически присваиваются имена.
      Многие коды, опубликованные в статьях на сайте необходимо размещать именно в стандартных модулях. Для этого достаточно создать новый стандартный модуль, скопировать текст кода с сайта и вставить.

      МОДУЛЬ ЛИСТА
      Лист1 или Sheet1 — на рис.1: Лист1(Лист1),Лист2(Лист2),Лист3(Лист3) .
      Для каждого листа книги имеется свой отдельный модуль. Попасть в модуль листа проще, чем в остальные модули. Для этого надо просто щелкнуть правой кнопкой мыши по ярлычку листа и выбрать из контекстного меню пункт Исходный текст (View Code)
      в зависимости от версии Excel этот пункт на русском может называться так же: Просмотреть код или Исходный код :

      Можно и более трудным путем пойти — через редактор VBA: Alt+F11 и в окне Проводника объектов(Project Explorer) дважды щелкнуть по объекту с именем листа или правая кнопка мыши на модуле листа -View code.
      Размещая код в модуле листа следует помнить, что при копировании или переносе данного листа в другую книгу код так же будет скопирован, т.к. является частью листа. Это и плюс и минус одновременно. Плюс в том, что разместив код в модуле листа можно использовать этот лист в качестве шаблона для распространения со своими кнопками вызова этих кодов(в том числе создания книг кодом) и весь функционал будет доступен. Минус же заключается в некоторых нюансах обращения к ячейкам(подробнее можно ознакомиться в этой статье: Как обратиться к диапазону из VBA) и необходимости размещения ВСЕХ используемых процедур в этом листе, иначе при переносе в другие книги коды могут работать с ошибками.

      В модуле листа содержатся встроенные событийные процедуры, каждая из которых отвечает за обработку определенного события на этом листе. Посмотреть их можно так: выбираете объект(на рисунке ниже список в левой части) Worksheet, а в правом списке выбираете событие(в этом списке все процедуры, доступные для выбранного листа):

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

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

      • Activate — возникает при активации самого листа(но не возникает, если произошел переход из одной книги в другую и этот лист является там активным)
      • BeforeDoubleClick — возникает при двойном клике мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену режима редактирования
      • BeforeRightClick — возникает при клике правой кнопкой мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену показа всплывающего меню
      • Calculate — возникает при пересчете функций и формул на листе
      • Change — возникает при изменении значений ячеек на листе. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на ячейку, которая была изменена. Может отличаться от активной в момент обработки ячейки
      • Deactivate — возникает при переходе с этого листа на другой лист этой же книги
      • FollowHyperlink — возникает при переходе по гиперссылке, созданной в этом листе
      • SelectionChange — возникает при изменении адреса выделенной ячейки/области. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на диапазон ячеек, которые были выделены. Совпадает с выделенными на текущий момент ячейками

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

      Примечание : для всех кодов, приведенных на сайте, достаточно просто открыть необходимый модуль(книги или листа) и вставить предложенный код. Корректировка может понадобиться только в случаях, когда в модуле Листа или Книги вашего файла уже имеется код в необходимой событийной процедуре.

      МОДУЛЬ КНИГИ
      ЭтаКнига или ThisWorkbook — на рис.1: ЭтаКнига .
      В модуль книги можно попасть только через проводник объектов(Project Explorer) редактора VBA — двойной щелчок по ЭтаКнига (ThisWorkbook) или правая кнопка мыши на модуле -View code. В модуле книги так же содержатся «встроенные» событийные процедуры. Так же как и для листа выбираем в списке объектов(вверху слева) Workbook . В правом окне выбора процедур, так же как и с модулем листа, будут все процедуры, доступные для объекта ЭтаКнига. Пример использования событийных процедур книги можно посмотреть в статье Как отследить событие(например выделение ячеек) в любой книге?
      Но там применяются все те же правила — главное не забывать про аргументы, доступные из этих процедур и передаваемые им самим Excel. Например, для события Workbook_BeforeClose доступен аргумент Cancel. Это можно использовать, если не хотите, чтобы книгу закрыл пользователь, не заполнив ячейку A1. Вот пример подобного кода:

      Из кода видно, что на листе «Отчет» должна быть не пустой ячейка A1(лист «Отчет» тоже должен существовать в этой книге). Но есть и еще одна вещь — какое-то Me. Это краткое обращение к объекту модуля класса, в данном случае это равнозначно обращению ThisWorkbook. И еще один пример кода для модуля ЭтаКнига, который запрещает сохранять исходную книгу, разрешая сохранить её только через пункт Сохранить как(SaveAs):

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

      МОДУЛИ ФОРМ
      UserForm — на рис.1 UserForm1 .
      Содержатся внутри Пользовательской формы(UserForm) и её объектов. В Пользовательских формах в основном все завязано именно на событийных процедурах самой формы и на элементах этой формы(Кнопки, ТекстБоксы, КомбоБоксы(выпадающие списки) и т.д.). Очень удобно использовать Пользовательские формы в своих приложениях для общения с пользователем. Т.к. через формы очень удобно отслеживать действия пользователя и можно запретить доступ к листам с данными, путем их скрытия. Создается форма так же как и модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert-UserForm. Примеры кодов с использованием форм можно посмотреть в статьях: Каждому пользователю свой лист/диапазон, Как оставить в ячейке только цифры или только текст?

      МОДУЛЬ КЛАССА
      ClassModule — на рис.1 Class1 .
      В большинстве случаев создается специально для отслеживания событий различных объектов. Вряд ли понадобиться начинающим изучение VBA, хотя все зависит от поставленной задачи. Но обычно начинающим изучать это кажется слишком сложным. В любом случае, перед работой с модулями классов лучше научиться хоть чуть-чуть работать с обычными модулями и самостоятельно писать процедуры. Как добавить такой модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert-Class Module. Подробнее про модули классов и работу с ними можно почитать в этой статье: Работа с модулями классов. Там описаны все основные принципы и приложен файл примера.

      УДАЛЕНИЕ МОДУЛЯ
      Действия по удалению любого из модулей одинаковы для всех типов. Для этого необходимо перейти в проект VBA нужной книги, выбрать нужный модуль, щелкнуть по нему правой кнопкой мыши и в появившемся меню выбрать Remove (Имя модуля). (Remove Module1, Remove UserForm1, Remove Class1 и т.п.). После этого появится окно с запросом «Do you want to export (имя модуля) before removing it?». Это означает, что VBA спрашивает: хотите ли Вы сохранить копию кодов модуля перед удалением? Как правило выбирать следует Нет. Но если Вы хотите сохранить текст кодов из удаляемого модуля в отдельном файле, то соглашаетесь, нажав Да. Будет предложено выбрать папку для сохранения модуля и можно даже задать ему отдельное имя.

      ПЕРЕНОС, ИМПОРТ и ЭКСПОРТ МОДУЛЯ
      Иногда нужно модуль из одной книги переместить в другую. Сделать это можно несколькими способами. Самый простой — открыть обе книги, перейти в проводник проектов -найти нужный модуль -захватить его левой кнопкой мыши и не отпуская кнопку перетащить на проект другой книги:

      Следует помнить, что так можно перенести и скопировать только стандартный модуль, модуль класса и модуль UserForm . Коды модулей листов и книги придется переносить как обычный текст: переходим в модуль ЭтаКнига (откуда хотим копировать) -копируем весь код -переходим в модуль ЭтаКнига второй книги и вставляем скопированное:

      Экспорт модуля(сохранение в отдельный файл)
      Если же надо сохранить стандартный модуль, модуль класса или модуль формы и не переносить сразу же в другую книгу, то можно экспортировать модуль. Для чего это может быть нужно? Как правило, чтобы перенести коды из дома на работу, переслать кому-то на другой ПК(пересылка файла с макросами может быть запрещена политикой безопасности компании) и т.п. Делается это просто: щелкаем на модуле правой кнопки мыши -Export file.
      У экспортируемых модулей есть разные расширения, в зависимости от типа модуля. Для стандартных модулей это .bas (Module1.bas), для модулей класса — .cls (Class1.cls). А вот для модулей форм будет создано целых два файла: UserForm1.frm и UserForm1.frx . Их важно хранить вместе — один без другого не может быть импортирован в дальнейшем в файл. В файле .frx хранится информация об визуальном отображении формы и её элементах, если можно так сказать. В файле .frm хранятся непосредственно тексты кодов для формы и служебная информация(имя и размеры формы, некоторые глобальные директивы и ссылка на файл .frx). Поэтому не рекомендуется без соответствующих навыков переименовывать эти два файла в надежде, что потом все заработает.
      Импорт модуля(перенос экспортированного ранее в новую книгу)
      Для переноса экспортированного модуля в другую книгу надо просто в проводнике объектов выделить нужный проект правой кнопкой мыши -Import module -выбрать в диалоговом окне нужный модуль.
      Экспортировать можно любой модуль, а вот импортировать — нет. Модули листов и книг хоть и экспортируются в отдельные файлы(кстати, с расширением .cls), но импортировать их не получится в том виде, как это предполагается. Они будут импортированы как новые модули класса и только. Поэтому для переноса кодов из модулей листов и книг придется использовать все равно копирование и вставку непосредственно кодов.
      И в довершение — можно переносить модули автоматически, кодами VBA: Как добавить код процедуры программно, скопировать модуль







      Информация о сайте

      Инструменты и настройки

      Excel Windows
      и
      Excel Macintosh

      Вопросы и решения

      Работа и общение

      Работа форума и сайта

      Функции листа Excel


      = Мир MS Excel/Как вставить код в модуль листа? — Мир MS Excel

      Войти через uID

      Войти через uID

      Подскажите пожалуйста как вставить код в модуль листа (куда заходить надо в Excel)

      вот код который нужно вставить:

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Target = Format(Time, «Long Time»)
      End Sub

      Подскажите пожалуйста как вставить код в модуль листа (куда заходить надо в Excel)

      вот код который нужно вставить:

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Target = Format(Time, «Long Time»)
      End Sub Руслан

      вот код который нужно вставить:

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Target = Format(Time, «Long Time»)
      End Sub Автор — Руслан
      Дата добавления — 21.09.2013 в 11:22

      Читайте также:

          

      • Как обрабатывать фуд фото в фотошопе
      •   

      • Получить курс валюты 1с упп
      •   

      • Gearbest com как удалить из браузера опера
      •   

      • Как сохранить слайсы в фотошопе
      •   

      • Установка и удаление программ в windows 7 от имени администратора
  • Понравилась статья? Поделить с друзьями:

    А вот еще интересные статьи:

  • Как в книге excel ссылаться на другой лист
  • Как в книге excel раскрывающийся список
  • Как в книге excel получить список всех листов
  • Как в книге excel изменить связи
  • Как в книге excel добавить лист если их нет

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии