Содержание
- Объявление переменных
- Оператор Public
- Оператор Private
- Оператор Static
- Оператор Option Explicit
- Объявление объектной переменной для автоматизации
- См. также
- Поддержка и обратная связь
- Использование переменных в под процедурах Excel в Visual Basic для приложений
- Введение
- Дополнительные сведения
- Переменные в под процедуре
- Объявление переменной в макросе
- Сводка по типам данных
- тип данных Variant
- Область действия переменной
- Область на уровне процедуры
- Объем личных и общедоступных модулей
- Срок жизни переменной
- Инициализация значения переменной
- Переменные уровня процедуры
- Статическое ключевое слово
- Сброс проектов для сброса переменных
Объявление переменных
При объявлении переменных обычно используется оператор Dim. Оператор объявления может быть помещен внутрь процедуры для создания переменной на уровне процедуры. Или он может быть помещен в начале модуля в разделе объявлений, чтобы создать переменную на уровне модуля.
В примере ниже создается переменная и указывается тип данных «String».
Если данный оператор отображается в процедуре, переменная strName может использоваться только в этой процедуре. Если же оператор отображается в разделе объявлений модуля, переменная strName доступна для всех процедур данного модуля, но недоступна для процедур других модулей проекта.
Чтобы предоставить доступ к переменной всем процедурам проекта, перед ней нужно поставить оператор Public, как показано в примере ниже:
Дополнительные сведения об именовании переменных см. в статье Правила именования в Visual Basic.
Переменные могут быть объявлены одним из следующих типов данных: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (для строк переменной длины), String * length (для строк фиксированной длины), Object или Variant. Если тип данных не указан, по умолчанию присваивается тип данных Variant. Вы также можете создать определяемый пользователем тип с помощью оператора Type.
Вы можете объявить несколько переменных в одном операторе. Чтобы указать тип данных, необходимо задать тип данных для каждой переменной.
В приведенном ниже операторе переменные intX , intY и intZ объявлены типом Integer.
В приведенном ниже операторе intX и intY объявлены как Variant и только intZ объявлен как тип Integer.
Нет необходимости указывать тип данных переменной в операторе объявления. Если вы не укажите тип данных, переменной будет присвоен тип Variant.
Сокращение для объявления переменных x и y типом Integer в приведенном выше операторе
Сокращение для типов: % -integer; & -long; @ -currency; # -double; ! – Single; $ – String
Оператор Public
Используйте оператор Public для объявления общих переменных на уровне модуля.
Общие переменные могут использоваться в любой процедуре проекта. Если общая переменная объявлена в стандартном модуле или модуле класса, она может использоваться в любых проектах, содержащих ссылку на проект, в котором объявлена данная общая переменная.
Оператор Private
Используйте оператор Private для объявления частных переменных на уровне модуля.
Частные переменные могут использоваться только процедурами одного модуля.
На уровне модуля оператор Dim является эквивалентным оператору Private. Вы можете использовать оператор Private, чтобы упростить чтение и интерпретацию кода.
Оператор Static
Если для объявления переменной в процедуре используется оператор Static вместо оператора Dim, объявленная переменная сохраняет свое значение между вызовами в этой процедуре.
Оператор Option Explicit
В Visual Basic можно неявно объявить переменную, просто используя оператор присвоения значения. Все неявно объявленные переменные относятся к типу Variant. Для переменных типа Variant требуется больший объем памяти, чем для большинства других переменных. Приложение будет работать эффективнее, если переменные будут явно объявленными и им будет присвоен определенный тип данных. Явное объявление переменных снижает вероятность возникновения ошибок, вызванных конфликтом имен или опечатками.
Если вы не хотите, чтобы в Visual Basic были неявные объявления, то оператор Option Explicit должен стоять в модуле перед всеми процедурами. Этот оператор требует явного объявления всех переменных модуля. Если модуль содержит оператор Option Explicit, то при обнаружении необъявленной ранее переменной или опечатки в ее имени Visual Basic выдаст ошибку времени компиляции.
В программной среде Visual Basic имеется возможность задавать параметр, который будет автоматически включать оператор Option Explicit во все новые модули. Справочная информация по изменению параметров среды Visual Basic предоставлена в документации приложения. Обратите внимание, что данный параметр не меняет уже написанный код.
Статические и динамические массивы нужно объявлять в явном виде.
Объявление объектной переменной для автоматизации
При использовании приложения для управления объектами другого приложения необходимо указать ссылку на библиотеку типов этого другого приложения. Когда ссылка указана, можно объявлять объектные переменные в соответствии с наиболее подходящими для них типами. Например, если вы указываете ссылку на библиотеку типов Microsoft Excel при работе в Microsoft Word, то можете объявить переменную типа Worksheet внутри Word, чтобы она представляла объект Worksheet приложения Excel.
При использовании другого приложения для управления объектами Microsoft Access, как правило, можно объявлять объектные переменные согласно наиболее подходящим для них типам. Вы можете также использовать ключевое слово New для автоматического создания нового экземпляра объекта. Однако может возникнуть необходимость указать, что объект принадлежит Microsoft Access. Например, при объявлении объектной переменной, представляющей форму Access внутри Visual Basic, необходимо сделать различимыми объект Form приложения Access и объект Form приложения Visual Basic. Для этого следует включать имя библиотеки типов в объявление переменной, как показано в примере ниже:
Некоторые приложения не распознают отдельные объектные типы Access. Даже если в этих приложениях указана ссылка на библиотеку типов Access, все объектные переменные Access необходимо объявлять с типом Object. Также невозможно использовать ключевое слово New для создания нового экземпляра объекта.
В примере ниже показано, как объявлять переменную, представляющую экземпляр объекта Application Access в приложении, которое не распознает объектные типы Access. Затем приложение создает экземпляр объекта Application.
В документации приложения предоставлена информация о поддерживаемом им синтаксисе.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Использование переменных в под процедурах Excel в Visual Basic для приложений
Введение
В этой статье описано, как использовать переменные Microsoft Excel под процедурах в Microsoft Visual Basic для приложений.
Дополнительные сведения
Переменные в под процедуре
Мощной функцией языков программирования является возможность хранить данные в переменной, чтобы содержимое переменной можно было использовать или менять позже. В этом документе обсуждается следующее использование переменных в Visual Basic:
Как объявляются переменные.
Процедуры и проекты, которые могут использовать переменную.
Время жизни переменной.
Объявление переменной в макросе
Самый простой способ объявить переменную в макросах — использовать отчет Dim. В следующей строке две переменные объявлялись как integers(integers).
Dim x As Integer, y As Integer
Если для переменных x и y заданы целые числа, вы указываете Visual Basic выделить достаточно памяти для переменной целого числа (по 2 на x и y) и что данные, хранимые в x или y, являются целым числом в период между -32768 и 32767.
ПРИМЕЧАНИЕ: Если вы объявляете несколько переменных с помощью одной выписки Dim, необходимо указать тип данных для каждой переменной.
Если не указать тип данных для каждой переменной, как в следующем коде Visual Basic, то переменная y будет настроена как переменная с типом данных типа integer. Переменная x будет иметь тип типа variant:
Dim x, y As Integer
Дополнительные сведения см. в приведенной ниже таблице Variant.
Чтобы выполнить проверку переменной, выполните следующие действия:
Сохраните и закроите все открытые книги, а затем откройте новую книгу.
Запустите редактор Visual Basic (нажмите ALT+F11).
В меню Вставка выберите пункт Модуль.
Введите следующий код:
Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox «значение x — » & x & _
Chr(13) & «значение y — » & y
End Sub
Запустите Variable_Test макрос. Вы получаете следующее сообщение: the value of x is 10
the value of y is 100
Нажмите кнопку ОК.
В макро Variable_Test изменить следующую строку:
Запустите Variable_Test макрос.
Вы получите ошибку во время запуска, так как «ошибка» не является integer, и вы пытаетесь назначить это строковую величину для переменной x.
Сводка по типам данных
Это распространенные типы данных переменных:
тип данных Variant
Если не указать тип данных при объявлении переменной или вообще не объявлять переменную, Visual Basic автоматически определяет тип данных переменной типа переменной. Ниже следующую информацию о преимуществах переменных, объявленных в качестве этого типа данных:
Переменные могут содержать строку, дату, время, boolean или числовую величину.
Переменные могут автоматически преобразовывать содержащиеся в них значения.
Недостатком является то, что для переменных требуется не менее 16байт памяти. 16 bytes of memory can be significant in large procedures or in complex modules.
Чтобы узнать, как это работает в макросе Variable_Test, выполните следующие действия:
Измените код макроса Variable_Test на:
Запустите Variable_Test макрос.
Вы не получите сообщение об ошибке, так как вы можете назначить что-либо переменным x и y.
ПРИМЕЧАНИЕ: Вы также можете не использовать следующую строку, и макрос будет по-прежнему работать, так как переменные x и y будут рассматриваться как типы данных Variant:
Область действия переменной
Когда вы объявляете переменную, она может быть видна другими макросами в том же модуле, в других модулях или в других проектах. Такое доступность переменной в модулях называется областью действия. Область действия может быть трех типов: на уровне процедуры, на уровне частного модуля и на уровне общего модуля. Область действия зависит от того, как и где объявлять переменные или переменные.
Область на уровне процедуры
Переменная с областью на уровне процедуры не видна за пределами процедуры, в которой она объявлена. Если установить значение переменной, которая имеет область действия на уровне процедуры, ее содержимое не будет видно другими макросами.
Чтобы убедиться, что переменная с областью на уровне процедуры не видна за пределами процедуры, в которой она объявлена, выполните указанные ниже действия.
Вставка нового модуля в проект.
Введите в этот модуль оба макроса:
Sub Macro1() Dim x As Integer x = 10 MsgBox «x, as seen by Macro1 is » & x ‘next line runs Macro2 Macro2 End Sub Macro2() MsgBox «x, as seen by Macro2 is » & x End Sub
Запустите Макрос1, и вы получите следующее сообщение:
x, as seen by Macro1 is 10
Нажмите кнопкуОК, и вы получите следующее сообщение:
x, as seen by Macro2 is
Нажмите кнопку ОК.
Макрос2 не отображает значение переменной x, так как переменная x является локальной для параметра Macro1.
Объем личных и общедоступных модулей
Вы можете определить переменные в разделе объявлений модуля (в верхней части модуля, над всеми под процедурами) и настроить область действия переменной с помощью открытой выписки, затемной или закрытой выписки. Если перед переменной поместить открытое заявление, переменная будет доступна всем макросам во всех модулях проекта. Если перед переменной поместить перед переменной утверждение Dim или Private, переменная будет доступна только макросам в модуле, в котором она объявлена.
Чтобы увидеть разницу между общедоступным заявлением и заявлением Dim, выполните следующие действия:
Сохраните и закроите все открытые книги, а затем откройте новую книгу.
Запустите редактор Visual Basic редактора.
Вставка модуля в проект.
Вставка другого модуля в проект.
Введите следующий код в этот модуль:
Sub Macro2() x = x * 3
MsgBox x
End Sub
Запустите Macro_1a макрос в первом модуле.
С переменной x, объявленной как «Public x As Integer», все три макроса в проекте имеют доступ к значению x. В первом окне сообщения отображается значение 10. Во втором поле сообщения отображается значение 20 (поскольку x умножается на 2 в Macro_1b). В третьем окне сообщения отображается значение 60 (поскольку значение x было изменено на 20 в Macro_1b а затем умножено на 3 в Макросе2).
Измените строку объявления в первом модуле из:
Public x As Integer
Dim x As Integer
Запустите Macro_1a макрос.
Если переменная x объявлена как «Dim x As Integer», только макрос в первом модуле имеет доступ к значению x. В первом поле сообщения отображается значение 10, во втором — 20 (поскольку x умножается на 2 в Macro_1b), а в третьем — значение 0 (так как в Макросе2 не отображается значение x, а в макросе 2 используется неинициализированное значение нуля).
Измените строку объявления в первом модуле из:
Dim x As Integer
Private x As Integer
Запустите Macro_1a макрос.
Те же поля сообщений отображаются с использованием области Private statement, как при использовании statement Dim. Переменная x имеет ту же область действия, что и модуль, где она объявлена.
ПРИМЕЧАНИЕ: Если вы хотите ограничить область действия переменной модулем, в котором она объявлена, используйте privatestatement вместо dim. Оба этих эффекта будут одинаковыми, но при использовании закрытой выписки область действия будет более четкой.
Срок жизни переменной
Время, в течение которого переменная сохраняет значение, называется сроком жизни. Значение переменной может изменяться в течение ее жизненного времени, но при этом сохраняется значение. Кроме того, если переменная теряет область действия, она теряет значение.
Инициализация значения переменной
При запуске макроса все переменные инициализируются со значением. Числовая переменная инициализирована до нуля, строка переменной длины — в нулевую строку («»), а строка фиксированной длины заполняется кодом ASCII 0. Переменные Variant инициализируются как пустые. Пустая переменная представлена нулем в числовом контексте и пустой строкой («») в строковом контексте.
Переменные уровня процедуры
Если переменная объявляется в макрос с помощью макроса Dim, значение переменной сохраняется до тех пор, пока работает макрос. Если этот макрос вызывает другие макрос, значение переменной сохраняется (но не доступно другим макросам), пока работают и другие макросы.
Чтобы продемонстрировать работу переменных на уровне процедуры, выполните указанные ниже действия.
Вставка нового модуля в проект.
В этом модуле введите оба макроса:
Sub Macro1()
‘set x as a procedure level variable
Dim x As Integer
MsgBox «инициализированное значение x — » & x
x = 10
MsgBox «x is » & x
‘следующая строка запускает Макрос2
Макрос2
MsgBox «x is still » & x
End Sub
Sub Macro2()
MsgBox «x, as seen by Macro2 is » & x
End Sub
Вы получаете следующее сообщение:
the initialized value of x is 0
Нажмите кнопкуОК, и вы получите сообщение:
Нажмите кнопкуОК, и вы получите следующее сообщение:
x, as seen by Macro2 is
Нажмите кнопку ОК.
Макрос2 не отображает значение переменной x, так как переменная x является локальной для параметра Macro1. Вы получите следующее сообщение:
Нажмите кнопку ОК.
Вы получаете те же сообщения, что и в шагах 3–6, так как как макрос1 перестал работать на шаге 6, значение переменной x было потеряно. Таким образом, при повторном повторе макроса 1 в шаге 7 в первом сообщении будет показано значение x в качестве нуля (инициализированное значение).
Статическое ключевое слово
Если переменная на уровне процедуры объявлена с помощью статического ключевого слова, переменная сохраняет значение до сброса проекта. Таким образом, если у вас есть статическая переменная, то при следующем вызове процедуры статическая переменная инициализирована до последнего значения.
Чтобы узнать, как работает статическое ключевое слово, выполните следующие действия:
Вы получите сообщение: the initialized value of x is 0
Нажмите кнопкуОК, и вы получите сообщение:
Нажмите кнопку ОК.
Запустите Макрос1, и вы получите следующее
сообщение: the initialized value of x is 10
Нажмите кнопкуОК, и вы получите следующее сообщение:
Нажмите кнопку ОК.
Значения, которые отображаются в сообщениях, во второй раз отличаются, так как переменная x объявляется как статическая переменная, а значение переменной сохраняется после первого запуска макроса Macro1.
ПРИМЕЧАНИЕ: Если у вас есть переменная уровня модуля, ее время существования будет таким же, как если бы она была статической переменной на уровне процедуры.
Чтобы проверить срок жизни переменной уровня модуля, выполните указанные ниже действия.
Запустите Макрос1, и вы получите следующее сообщение:
the initialized value of x is 0
Нажмите кнопку ОК, и вы получите следующее сообщение:
Нажмите кнопку ОК,
Запустите Макрос1, и вы получите сообщение:
the initialized value of x is 10
Нажмите кнопку ОК.
Вы получаете следующее сообщение:
Нажмите кнопку ОК.
Значения, которые отображаются в сообщениях, во второй раз отличаются, так как переменная x объявлена как статическая переменная и сохраняет значение после первого запуска макроса Macro1.
Сброс проектов для сброса переменных
Если вы хотите сбросить значение статической переменной или переменной на уровне модуля, нажмите кнопку Сброс на
Стандартная панель инструментов или нажмите кнопку Сброс в меню Выполнить.
Если вы сделаете это для проекта Macro1, а затем повторно запроизводили макрос1,значение переменной x инициализировано до нуля, и вы получите первое сообщение:
Источник
Уважаемые Эксперты! Подскажите, плиззз, как мне объявить переменную и присвоить ей значение, чтобы она была доступна всему коду этой формы. Заранее благодарен! |
|
Dim i As Integer |
|
не работает, ругается |
|
Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре). |
|
{quote}{login=СердЖиГ}{date=29.05.2008 05:52}{thema=Народ помогите плизз!}{post}Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре). Пример кода формы: Dim i ‘ Задаем i ‘ Увеличиваем i на единичку |
|
{quote}{login=:)}{date=29.05.2008 06:19}{thema=Re: Народ помогите плизз!}{post}{quote}{login=СердЖиГ}{date=29.05.2008 05:52}{thema=Народ помогите плизз!}{post}Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре). Пример кода формы: Dim i ‘ Задаем i ‘ Увеличиваем i на единичку Спасиб огромный!!! Сейчас попробую. Я знал, что истина где-то рядом |
|
{quote}{login=СердЖиГ}{date=29.05.2008 06:30}{thema=Re: Re: Народ помогите плизз!}{post}{quote}{login=:)}{date=29.05.2008 06:19}{thema=Re: Народ помогите плизз!}{post}{quote}{login=СердЖиГ}{date=29.05.2008 05:52}{thema=Народ помогите плизз!}{post}Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре). Пример кода формы: Dim i ‘ Задаем i ‘ Увеличиваем i на единичку Спасиб огромный!!! Сейчас попробую. Я знал, что истина где-то рядом :-){/post}{/quote} Не работает :-(((( ругается на строку, в которой в первые появляется эта переменная….ничё не понял…как же быть |
|
Я так понимаю, что код формы не отличается принципиально от обычного модуля |
|
{quote}{login=СердЖиГ}{date=29.05.2008 07:06}{thema=Re: Re: Re: Народ помогите плизз!}{post}{quote}{login=СердЖиГ}{date=29.05.2008 06:30}{thema=Re: Re: Народ помогите плизз!}{post}{quote}{login=:)}{date=29.05.2008 06:19}{thema=Re: Народ помогите плизз!}{post}{quote}{login=СердЖиГ}{date=29.05.2008 05:52}{thema=Народ помогите плизз!}{post}…{/post}{/quote} Пример кода формы: Dim i ‘ Задаем i ‘ Увеличиваем i на единичку Спасиб огромный!!! Сейчас попробую. Я знал, что истина где-то рядом :-){/post}{/quote} |
|
СердЖиГ Гость |
#10 31.05.2008 17:41:33 Всем спасибо! Всё получилось! |
Глобальная переменная в проекте VBA Excel. Объявление глобальной переменной в модуле проекта VBA и обращение к ней из других модулей того же проекта.
Объявление глобальной переменной
Глобальная переменная — это переменная, которая объявлена в одном из модулей проекта VBA и доступна для использования во всех остальных модулях.
Чтобы переменная стала глобальной, она должна быть объявлена в начале модуля перед первой процедурой (раздел Declarations) с помощью оператора Public. Этот способ работает во всех модулях проекта VBA Excel.
Допускается объявление глобальной переменной с помощью оператора Global, но такой способ считается устаревшим и на сайте разработчиков уже не упоминается. Объявить глобальную переменную с оператором Global можно только в стандартном модуле.
Пример объявления глобальных переменных в любом модуле проекта VBA:
Public myGlobVar1 ‘по умолчанию — As Variant Public myGlobVar2 As String Public myGlobVar3 As Double |
Объявление глобальных переменных
Обращение к глобальной переменной
Примеры обращения к глобальной переменной, объявленной в разных типах модулей проекта VBA Excel. Актуально для обращения из модуля любого типа данного проекта.
Переменная в стандартном модуле
Если глобальная переменная (myGlobVar) объявлена в стандартном модуле (Module1) с уникальным именем, не повторяющимся в других модулях, к ней можно обращаться из других модулей по одному имени (в примере — из модуля формы):
Private Sub CommandButton1_Click() myGlobVar = «Глобальная переменная» TextBox1.Text = myGlobVar End Sub |
Стандартное обращение с указанием имени модуля (Module1), в котором объявлена глобальная переменная (myGlobVar):
Private Sub CommandButton1_Click() Module1.myGlobVar = «Глобальная переменная» TextBox1.Text = Module1.myGlobVar End Sub |
Переменная в модуле книги
Глобальная переменная (myGlobVar), объявленная в модуле книги, доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:
Sub Primer1() ThisWorkbook.myGlobVar = «Глобальная переменная» MsgBox ThisWorkbook.myGlobVar End Sub |
Переменная в модуле листа
Обращение к глобальной переменной (myGlobVar), объявленной в модуле рабочего листа (Лист1), из других модулей по имени листа (в проводнике проекта находится без скобок слева от имени ярлыка):
Sub Primer2() Лист1.myGlobVar = «Глобальная переменная» MsgBox Лист1.myGlobVar End Sub |
По имени ярлыка (в проводнике проекта находится в полукруглых скобках справа от имени листа):
Sub Primer3() Worksheets(«Лист1»).myGlobVar = «Глобальная переменная» MsgBox Worksheets(«Лист1»).myGlobVar End Sub |
Переменная в модуле формы
Глобальная переменная (myGlobVar), объявленная в модуле формы (UserForm1), доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:
Sub Primer4() UserForm1.myGlobVar = «Глобальная переменная» MsgBox UserForm1.myGlobVar End Sub |
Переменная в личной книге макросов
Обращение к глобальной переменной (myGlobVar), объявленной в модуле ЭтаКнига
проекта VBAProject (PERSONAL.XLSB)
из модуля проекта VBA обычной книги Excel:
Sub Primer5() Workbooks(«PERSONAL.XLSB»).myGlobVar = «Глобальная переменная» MsgBox Workbooks(«PERSONAL.XLSB»).myGlobVar End Sub |
Мне не удалось получить доступ из проекта VBA текущей книги Excel к глобальной переменной, объявленной в стандартном модуле личной книги макросов.
0 / 0 / 0 Регистрация: 04.05.2013 Сообщений: 16 |
|
1 |
|
Передача глобальной переменной в форму24.07.2013, 10:48. Показов 5380. Ответов 5
Добрый день. Public cell as range Далее в пользовательской форме есть элемент комбо бокс, его значения хочу сохранять в найденную ячейку: Private sub combobox1_change() На этапе обработки последней процедуры выдает ошибку говорящую о том что переменная не определена. Объясните пожалуйста почему.
0 |
аналитика здесь больше нет… 3372 / 1670 / 184 Регистрация: 03.02.2010 Сообщений: 1,219 |
||||
24.07.2013, 11:12 |
2 |
|||
перенеси это
в стандартн. модуль модуль «ЭтаКнига» — это модуль класса и объявленная в нем переменная относится к экземпляру класса
1 |
0 / 0 / 0 Регистрация: 04.05.2013 Сообщений: 16 |
|
24.07.2013, 12:29 [ТС] |
3 |
Спасибо)) Добавлено через 2 минуты Добавлено через 59 минут
0 |
Dragokas 17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||||||
24.07.2013, 16:09 |
4 |
|||||||
при событии queryclose (нажатие на крестик) для справки: http://msdn.microsoft.com/en-u… 78635.aspx
текст который я указал по умолчанию, в свойстве text, переносился по строкам
Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 04.05.2013 Сообщений: 16 |
|
25.07.2013, 09:31 [ТС] |
5 |
Спасибо большое, я понял, буду использовать тэги.
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||||||
25.07.2013, 11:04 |
6 |
|||||||
Фрагмент
не определяет с какой Sheet брать Cells и Range. Хорошим правилом является однозначное и полное определения источника данных:
End(xldown) — пишется без точки перед скобкой.
0 |
Переменные, типы данных и константы
Главное предназначение VB А — обработка данных. Некоторые данные сохраняются в объектах, например, диапазонах рабочих листов. Другие данные хранятся в созданных вами переменных.
Переменная представляет собой именованное место хранения данных в памяти компьютера.
Переменные могут содержать данные разных типов — от простых логических, или булевых, значений ( True или False ) до больших значений с двойной точностью (см. следующий раздел).
Значение присваивается переменной с помощью оператора равенства (подробнее об этом — далее в главе).
VBA поддерживает несколько ограничений в именовании переменных:
- Можно использовать в названиях символы букв, числа и некоторые знаки препинания, но первой в имени переменной всегда должна вводиться буква.
- VBA не различает регистры.
- Нельзя использовать в именах пробелы или точки.
- Чтобы сделать имена переменных удобочитаемыми, используют смешанный регистр (например, InterestKate , а не interestkate ) или вводят символ подчеркивания ( lnterest _ Rate ).
- Специальные символы объявления типов (#, $, %, & или !) не применяются в имени переменной.
- Названия переменных ограничены длиной 254 символов.
- Не допускается применять в качестве названий переменных или процедур зарезервированные слова, т.е. такие слова, которые используются VBA .
Определение типов данных
- Тип данных указывает, в каком виде данные хранятся в памяти: как целые значения, действительные числа, текст н т.п.
- VBA может автоматически типизировать данные, что приводит к медленному выполнению операций и не эффективному использованию памяти.
- При явном объявлении типа данных всех используемых переменных VBA может выполнять дополнительную проверку ошибок на этапе компиляции.
- При явном объявлении типа данных программа работает быстрее и занимает меньше места в оперативной памяти.
- Чтобы обеспечить обязательное объявление всех используемых переменных, необходимо включить строку
Option . Explicit
в качестве первой инструкции в модуле VBA .
В таблице перечислены поддерживаемые в VBA типы данных
Тип данных |
Резервируется байт |
Наименьшее значение |
Наибольшее значение |
Byte |
1 |
0 |
255 |
Boolean |
2 |
False (Ложь) |
True (Истина) |
Integer |
2 |
-32768 |
32767 |
Long |
4 |
-2147483648 |
2147483647 |
Single |
4 |
-3.402823 Е38 |
-1.401298 Е-45 |
1.401298Е-45 |
3.402823Е38 |
||
Double |
8 |
-1,79769313486232Е308 |
-4,94065645341247Е-324 |
4,94065645841247Е-324 |
1,79769313486232Е308 |
||
Currency |
8 |
-922337203685477,5808 |
922337203685477,5807 |
Decimal |
14 |
+/-79228162514264337593543950335 без десятичных знаков |
+/-7,9228162514264337593543950335 с 28-ью знаками после запятой |
Date |
8 |
1 января 100 года |
31 декабря 9999 года |
Object |
4 |
Любая ссылка на объект |
|
string (переменной длины) |
10 байт + длина строки |
0 |
приблизительно 2 млрд |
string (фиксированной длины) |
Длина строки |
1 |
65400 |
Variant (числа) |
16 |
Любое числовое значение в рамках диапазона типа данных Double |
|
Variant (символы) |
22 байта + длина строки |
0 |
приблизительно 2 млрд |
Пользовательский |
Зависит от типа |
Зависит от элемента |
- Чтобы в тексте программы распознать тип данных переменной или константы можно использовать стандартную приставку (префикс) в нижнем регистре в названии переменной в соответствии с приведенной таблицей.
Префикс |
Тип данных |
b |
Boolean |
i |
Integer |
l |
Long |
s |
Single |
d |
Double |
с |
Currency |
dt |
Date / Time |
str |
String |
obj |
Object |
v |
Variant |
u |
Пользовательский |
Объявление переменных
- Если для переменной, используемой в процедуре VBA , не объявлен тип данных, то, по умолчанию, будет задан тип данных Variant .
- Данные, которые хранятся в Variant , изменяют свой тип, в зависимости от того, какие операции над ними выполняются.
Пример 1 .
Sub VariantDemo ()
MyVar = «123»
MyVar = MyVar / 2
MyVar = «Ответ: » & MyVar
MsgBox MyVar
End Sub
- При обработке типа данных Variant могут возникнуть проблемы.
Пример 2 . Какое сообщение выдаст следующая процедура?
Sub VariantDemo 2()
MyVar = «123»
MyVar = MyVar + MyVar
MyVar = «Ответ: » & MyVar
MsgBox MyVar
End Sub
Функция определения типа данных
Для определения типа данных переменной используется функция VBA TypeName .
Пример 1.
Sub VariantDemo2()
MyVar = «123»
MsgBox TypeName(MyVar)
MyVar = MyVar / 2
MsgBox TypeName(MyVar)
MyVar = «Ответ: » & MyVar
MsgBox TypeName(MyVar)
MsgBox MyVar
End Sub
Тестирование явного объявления типов данных
Чтобы оценить важность определения типа данных, рассмотрим следующую процедуру, в которой выполняются циклические вычисления, а затем отображается общее время выполнения процедуры.
Sub TimeTestU
Dim x As Integer, у As Integer
Dim A As Integer, В As Integer, С As Integer
Dim i As Integer, j As Integer
Dim StartTime As Date, EndTime As Date
‘ Сохранение времени начала вычислений
StartTime = Timer
‘ Выполнение вычислений
х = 0
у = 0
For i = 1 То 5000
For j = 1 То 1000
А = х + у + i
В = у — х — i
С = х — у — i
Next j
Next i
‘ Получение времени окончания вычислений
EndTime = Timer
‘ Отображение общего времени
MsgBox Format(EndTime – StartTime)
End Sub
Задача.
Сравните время выполнения этой программы и время выполнения этой же программы при превращении операторов Dim в комментарии.
Область действия переменных
Область действия переменной определяет, в каких модулях и процедурах она может использоваться. Существуют следующие типы областей действия переменных.
Область действия |
Способ объявления переменной |
Отдельная процедура |
В процедуру включается оператор Dim или static |
Отдельный модуль |
Перед первой процедурой в модуле вводится оператор Dim или private |
Все модули |
Перед первой процедурой в модуле вводится оператор Public |
Локальные переменные
- Локальная переменная — это переменная, объявленная в процедуре.
- Локальные переменные могут использоваться только в процедуре, в которой они объявлены.
- После выполнения процедуры переменная становится невостребованной, поэтому Excel освобождает соответствующую область памяти.
- Если требуется сохранить значение переменной, объявите ее как static .
- Чтобы объявить локальную переменную — вставьте оператор Dim между операторами Sub и End Sub .
- Dim – сокращение от Dimension (Размерность). В старых версиях BASIC этот оператор использовался исключительно для объявления размерности массива.
- Другой способ указания типа данных для переменной : язык VBA позволяет присоединить символ к названию, чтобы указать ее тип данных.
Пример, можно объявить переменную MyVar как целое число, добавив к ее названию символ %: Dim MyVar % - Символы объявления типов данных представлены для большинства типов данных VBA (отсутствующие в таблице типы данных не имеют собственного символа объявления типа).
Тип данных |
Символ объявления типа |
Integer |
% |
Long |
& |
Single |
! |
Double |
# |
Currency |
@ |
String |
S |
• Локальные переменные позволяют экономно использовать память, так как VBA освобождает память, которую они используют, после окончания выполнения процедуры.
Переменные уровня модуля
Иногда необходимо, чтобы переменная была доступна во всех процедурах модуля. В таком случае объявите переменную перед первой процедурой модуля (за пределами процедур или функций).
В приведенном ниже примере оператор Dim — первая инструкция в модуле. Обе процедуры MySub и YourSub имеют доступ к переменной CurrentValue .
Dim CurrentValue As Integer
Sub MySub{)
‘ -[Здесь вводится текст процедуры] —
End SUb
Sub YourSub()
‘-[Здесь вводится текст процедуры] —
End Sub
Значение переменной уровня модуля не изменяется при окончании выполнения процедуры.
Переменные Public
Чтобы сделать переменную доступной во всех процедурах всех модулей VBA в проекте, необходимо объявить переменную на уровне модуля с помощью ключевого слова Public перед первой процедурой модуля, например, так:
Public CurrentRate as Long
Код объявления переменных Public должен вводиться в стандартном модуле VB А, а не в коде модуля листа или формы.
Переменные Static
Переменные Static — особый случай. Они объявляются на уровне процедуры и сохраняют свое значение после окончания процедуры.
Sub MySub()
Static Counter As Integer
‘-[Здесь вводится текст процедуры] –
End Sub
Работа с константами
Константа – именованное значение или строка, которая не меняется при выполнении программы.
Объявление констант
Константы объявляются с помощью оператора Const .
Примеры :
Const NumQuarters as Integer = 4
Const Rate = .0725, Period = 12
Const ModName as String = «Budget Macros»
Public Const AppName as String = «Budget Application»
Во втором примере тип данных не объявлен. Следовательно, указанные две константы имеют тип Variant .
Константы имеют область действия как и переменные.
Область действия |
Способ объявления константы |
Отдельная процедура |
В процедуре или функции |
Отдельный модуль |
Перед первой процедурой в модуле |
Все модули |
Перед первой процедурой в модуле с ключевым словом Public |
При попытке изменить значение константы в процедуре VBA вы получите ошибку.
Использование предопределенных констант
В Excel и VBA существует целый ряд предопределенных констант, которые можно использовать без объявления.
В следующей процедуре для изменения ориентации страницы активного листа на альбомную применена встроенная константа ( xlLandscape ):
Sub SetToLandscape()
ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub
Константу xlLandscape можно обнаружить путем записи макроса.
Описание констант можно найти в справочной системе.
Если включен параметр AutoList Members , то можно получить помощь непосредственно при вводе кода. Во многих случаях VBA автоматически перечисляет все константы, присваиваемые определенному свойству.
Управление строками
В VBA представлено два типа строк.
- Строки фиксированной длины объявляются с определенным количеством символов. Максимальная длина строки составляет 65535 символов.
- Строки переменной длины теоретически могут вмещать до 2 млрд. символов.
Память для строки отводится из расчета 1 байт на каждый символ и для хранения заголовка строки.
В следующем примере переменная MyString объявляется как строка с максимальной длиной 50 символов. YourString тоже объявлена как строка, но она имеет переменную
длину:
Dim MyString As String * 50
Dim YourString As String
Работа с датами
Переменная, определенная как Date , занимает 8 байт памяти и может содержать даты в диапазоне от 1 января 100 года до 31 декабря 9999 года.
В VBA дата и время определяются как значения, заключенные между знаками # (см. далее).
Ошибка дат в Excel
В Excel используется неправильное предположение, что 1900 год – високосный.
В ячейке с формулой =ДАТА(1900;2;29) появится значение 29 февраля 1900 года.
Функция DateSerial (190 Q ,2,29) в VBA возвратит 1 марта 1900 года (!).
Операторы присвоения
Оператор присвоения — это инструкция VBA , выполняющая математическое вычисление и присваивающая результат переменной или объекту.
Выражение определяется как комбинация ключевых слов, операторов, переменных и констант. Эта комбинация возвращает в результате строку, число или объект. Выражение может осуществлять вычисление, обрабатывать символы или тестировать данные.
В VBA оператором присвоения выступает знак равенства (=).
Примеры использования операторов присвоения (выражения приводятся справа от знака равенства):
х = 1
X = X + 1
х = ( у * 2) ! ( г * 2) FileOpen = True FileOpen = Not FileOpen Range С «The Year»).Value = 2001
Выражения могут быть очень сложными. Чтобы сделать длинные выражения более удобными для восприятия, используйте символ продолжения строки (пробел с подчеркиванием).
Зачастую в выражениях применяются функции. Это могут быть встроенные функции VBA , функции рабочих листов Excel или специальные функции, разработанные в VBA .
Булевы операторы VBA
Таблица. Булевы операторы VBA
Оператор |
Действие |
not |
Логическое отрицание выражения |
And |
Логическая конъюнкция двух выражений |
Or |
Логическая дизъюнкция двух выражений |
xoR |
Логическое отрицание двух выражений |
Eqv |
Логическая эквивалентность двух выражений |
imp |
Логическая импликация двух выражений |
Примеры.
- Свойство DisplayGridLines принимает значение True или False . Следовательно, применение оператора Not изменяет True на False , a False — на True :
ActiveWindow . DisplayGridLines = _
Not ActiveWindow . DisplayGridLines - Представленное далее выражение осуществляет логическую операцию And . Оператор MsgBox отображает True , только если Лисг1 — активный лист и активная ячейка находится в строке 1. Если одно или оба этих условия неверны, оператор MsgBox отображает False :
MsgBox ActiveSheet . Name = «Лист1» And ActiveCell . Row = 1 - Следующее выражение осуществляет логическую операцию Or . Оператор MsgBox отображает True , если активен лист Лист1 или Лист2:
MsgBox ActiveSheet.Name = » Лист 1″ Or ActiveSheet.Name = » Лист 2″
Массивы
Массив — это именованная группа проиндексированных элементов одного типа. На конкретный элемент массива ссылаются, используя имя массива и индекс. Например, массив MonthNames из 12-ти строк (каждая переменная соответствует названию месяца). Можно обратиться к первому элементу массива как
MonthNames(0), ко второму — как MonthNames(1) и т.д., до MonthNames(11).
Одномерные массивы
Массив объявляется с помощью операторов Dim или Public . Можно определить количество элементов в массиве: введите первый индексный номер, ключевое слово То и последний индексный номер — вся конструкция будет заключена в скобки. Например, так можно объявить массив, содержащий ровно 100 целых чисел:
Dim MyArray(1 To 100) As Integer
Многомерные массивы
Массивы VBA могут иметь до 60-ти измерений. Показанный ниже оператор объявляет двухмерный 100-элементный массив целых чисел:
Dim MyArray(1 To 10, 1 То 10) As Integer
Так присваивается значение элементу предыдущего массива
МуАггау(1, 4) = 125
Трехмерный массив
Dim MyArray(1 To 5, 1 То 6, 1 То 7) As Integer
состоит из 420 чисел типа Double.
Динамические массивы
Динамический массив не имеет предопределенного количества элементов. Динамический массив объявляется с незаполненными значениями в скобках:
Dim MyArray () As Integer
Перед использованием динамического массива необходимо обратиться к оператору
ReDim , указывающему VBA , сколько элементов находится в массиве
или
ReDim Preserve , если решено сохранить текущую длину массива.
Оператор ReDim можно использовать сколько угодно раз, изменяя, если требуется, размер массива.
Переменные объектов
Переменная объекта — это переменная, представляющая целый объект, например, диапазон или рабочий лист. Переменные объектов имеют особое значение по двум причинам:
¦ значительно упрощают программу;
¦ ускоряют выполнение программы.
Переменные объектов, как и обычные переменные, объявляются с помощью оператора Dim или Public . Например, в следующем операторе переменная inputArea объявляется как объект Range : Public InputArea As Range
Чтобы узнать, каким образом переменные объектов упрощают программу, проанализируем процедуру, написанную без их использования:
Sub KoObjVar()
Worksheets(» Лист 1″).Range(«Al»).Value =124
Worksheets(» Лист 1″).Range(«Al»).Font.Bold = True
Worksheets(» Лист 1″).Range(«Al»).Font.Italic = True
End Sub
Эта процедура вводит значение в ячейку А1 листа Лист1 активной рабочей книги, а затем делает шрифт содержимого ячейки полужирным и курсивным. В примере введено довольно много кода для такой простой операции. Чтобы пощадить себя, сведите процедуру к использованию объектной переменной:
Sub ObjVar()
Dim MyCell As Range
Sec MyCell = Worksheets(» Лист 1″).Range(«Al»)
MyCell.Value =124
MyCell.Font.Bold = True
MyCell.Font.Italic = True
End Sub
После объявления переменной MyCell как объекта Range оператор Set присваивает ей сам объект. В результате в следующих операторах используется упрощенная ссылка MyCell вместо длинной Worksheets (» Лист1″) . Range(» Al «).
Пользовательские типы данных
VBA позволяет создавать специальные, или пользовательские, типы данных . Определенный пользователем тип данных может облегчить управление некоторыми типами данных. Например, если приложение обрабатывает сведения о клиенте, то можно создать пользовательский тип данных с названием
Customerlnfo:
Type Customerlnfo
Company As String * 25
Contact As String * 15
RegionCode As Integer
Sales As Long
End Type
Пользовательские типы данных определяются вверху модуля перед началом
Если пользовательский тип данных уже создан для объявления переменной этого типа примените оператор Dim . Обычно пользовательский тип данных определяется для массивов:
Dim Customers ( 1 To 100) As Customerlnfo
Все 100 элементов этого массива состоят из четырех компонентов (как указано в пользовательском типе данных— Customerlnfo ). Вы можете сослаться на конкретный компонент элемента :
Customers(5).Company = «Acme Tools»
Customers(1).Contact = «Tim Robertson»
Customers(1).RegionCode = 3
Customers(1).Sales = 150677
Чтобы скопировать информацию из Customers (1) в Customers ( 2 ), используется следующая инструкция:
Customers (2) = Customers (1)
Предыдущий пример эквивалентен приведенному далее блоку инструкций:
Customers(2).Company = Customers(1).Company
Customers(2).Contact = Customers(1).Contact
Customers(2}.RegionCode = Customers(1).RegionCode
Customers(2).Sales = Customers(1).Sales