Vba excel переменные на всю форму

Содержание

  1. Объявление переменных
  2. Оператор Public
  3. Оператор Private
  4. Оператор Static
  5. Оператор Option Explicit
  6. Объявление объектной переменной для автоматизации
  7. См. также
  8. Поддержка и обратная связь
  9. Использование переменных в под процедурах Excel в Visual Basic для приложений
  10. Введение
  11. Дополнительные сведения
  12. Переменные в под процедуре
  13. Объявление переменной в макросе
  14. Сводка по типам данных
  15. тип данных Variant
  16. Область действия переменной
  17. Область на уровне процедуры
  18. Объем личных и общедоступных модулей
  19. Срок жизни переменной
  20. Инициализация значения переменной
  21. Переменные уровня процедуры
  22. Статическое ключевое слово
  23. Сброс проектов для сброса переменных

Объявление переменных

При объявлении переменных обычно используется оператор 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

 

:-( не работает, ругается

 

Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре).  
Сейчас встала задача нажатием кнопки увеличивать i на 1(i=i+1) во всех процедурах userform, для этого, я понимаю, нуно её объявить и обозначить на общем уровне, а как это сделать не могу понять.  
Прошу помощи!

 

{quote}{login=СердЖиГ}{date=29.05.2008 05:52}{thema=Народ помогите плизз!}{post}Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре).  
Сейчас встала задача нажатием кнопки увеличивать i на 1(i=i+1) во всех процедурах userform, для этого, я понимаю, нуно её объявить и обозначить на общем уровне, а как это сделать не могу понять.  
Прошу помощи!{/post}{/quote}  
Написать первой строчкой кода формы:    
Dim i  
и нигде ниже по коду эту фразу больше не произносить.  

  Пример кода формы:  

  Dim i  

  ‘ Задаем i  
Sub МояПроцеДура()  
i = ActiveCell.Row    
End Sub  

  ‘ Увеличиваем i на единичку  
Private Sub CommandButton1_Click()  
i = i + 1  
MsgBox i  
End Sub

 

{quote}{login=:)}{date=29.05.2008 06:19}{thema=Re: Народ помогите плизз!}{post}{quote}{login=СердЖиГ}{date=29.05.2008 05:52}{thema=Народ помогите плизз!}{post}Короче, есть форма с замутным кодом. И в каждой процедуре используется переменная i = ActiveCell.Row (объявлял её в каждой процедуре).  
Сейчас встала задача нажатием кнопки увеличивать i на 1(i=i+1) во всех процедурах userform, для этого, я понимаю, нуно её объявить и обозначить на общем уровне, а как это сделать не могу понять.  
Прошу помощи!{/post}{/quote}  
Написать первой строчкой кода формы:    
Dim i  
и нигде ниже по коду эту фразу больше не произносить.  

  Пример кода формы:  

  Dim i  

  ‘ Задаем i  
Sub МояПроцеДура()  
i = ActiveCell.Row    
End Sub  

  ‘ Увеличиваем i на единичку  
Private Sub CommandButton1_Click()  
i = i + 1  
MsgBox i  
End Sub{/post}{/quote}  

    :-) Спасиб огромный!!! Сейчас попробую. Я знал, что истина где-то рядом :-)

 

{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 (объявлял её в каждой процедуре).  
Сейчас встала задача нажатием кнопки увеличивать i на 1(i=i+1) во всех процедурах userform, для этого, я понимаю, нуно её объявить и обозначить на общем уровне, а как это сделать не могу понять.  
Прошу помощи!{/post}{/quote}  
Написать первой строчкой кода формы:    
Dim i  
и нигде ниже по коду эту фразу больше не произносить.  

  Пример кода формы:  

  Dim i  

  ‘ Задаем i  
Sub МояПроцеДура()  
i = ActiveCell.Row    
End Sub  

  ‘ Увеличиваем i на единичку  
Private Sub CommandButton1_Click()  
i = i + 1  
MsgBox i  
End Sub{/post}{/quote}  

    :-) Спасиб огромный!!! Сейчас попробую. Я знал, что истина где-то рядом :-){/post}{/quote}  

    Не работает :-((((  ругается на строку, в которой в первые появляется эта переменная….ничё не понял…как же быть :-(

 

Я так понимаю, что код формы не отличается принципиально от обычного модуля    
А в модуле объявляем так:    
Public i    
Sub a()  
i = 1    
End Sub    
Sub b()  
i = i + 1    
End Sub

 

{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  
и нигде ниже по коду эту фразу больше не произносить.  

  Пример кода формы:  

  Dim i  

  ‘ Задаем i  
Sub МояПроцеДура()  
i = ActiveCell.Row    
End Sub  

  ‘ Увеличиваем i на единичку  
Private Sub CommandButton1_Click()  
i = i + 1  
MsgBox i  
End Sub{/post}{/quote}  

    :-) Спасиб огромный!!! Сейчас попробую. Я знал, что истина где-то рядом :-){/post}{/quote}  
Не работает :-((((  ругается на строку, в которой в первые появляется эта переменная….ничё не понял…как же быть :-({/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


Студворк — интернет-сервис помощи студентам

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

Public cell as range
Private sub workbook_open
Set cell=cells(range(«a1»).end.(xldown).row+1, 1)
Userform1.show
End sub

Далее в пользовательской форме есть элемент комбо бокс, его значения хочу сохранять в найденную ячейку:
Module: userform1

Private sub combobox1_change()
Cell=combobox1.value
End sub

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



0



аналитика

здесь больше нет…

3372 / 1670 / 184

Регистрация: 03.02.2010

Сообщений: 1,219

24.07.2013, 11:12

2

перенеси это

Visual Basic
1
Public cell as range

в стандартн. модуль

модуль «ЭтаКнига» — это модуль класса и объявленная в нем переменная относится к экземпляру класса



1



0 / 0 / 0

Регистрация: 04.05.2013

Сообщений: 16

24.07.2013, 12:29

 [ТС]

3

Спасибо))

Добавлено через 2 минуты
Еще вопрос в догонку:
Как сделать так, что бы в элементе управления, текст который я указал по умолчанию, в свойстве text, переносился по строкам. Свойство wordwrap в положении true

Добавлено через 59 минут
И еще один вопрос, для формы, при событии queryclose (нажатие на крестик) вывожу сообщение: действительно хотите выйти? Варианты ответа vbYesNo. Как при ответе no вернуть отображение формы?



0



Dragokas

Эксперт WindowsАвтор FAQ

17992 / 7618 / 890

Регистрация: 25.12.2011

Сообщений: 11,351

Записей в блоге: 17

24.07.2013, 16:09

4

Цитата
Сообщение от soskibobra
Посмотреть сообщение

при событии queryclose (нажатие на крестик)

для справки: http://msdn.microsoft.com/en-u… 78635.aspx

Visual Basic
1
2
3
4
5
6
7
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        If MsgBox("Do you really want to Close?", vbYesNo + vbQuestion, "Agree") = vbNo Then
            Cancel = True
        End If
    End If
End Sub

Цитата
Сообщение от soskibobra
Посмотреть сообщение

текст который я указал по умолчанию, в свойстве text, переносился по строкам

Visual Basic
1
TextBox1.multiline = true

Добавлено через 1 минуту
soskibobra, пользуйтесь тегами. [VB] Ваш код [/VB] . Выделяем код и нажимаем в редакторе кнопку «VB».



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

Фрагмент

Visual Basic
1
2
3
4
Private sub workbook_open
Set cell=cells(range("a1").end.(xldown).row+1, 1)
Userform1.show
End sub

не определяет с какой Sheet брать Cells и Range.
В такой редакции это будет первый активный лист открытой книги. Если книга будет сохранена, когда активным листом является другой лист, то работа макроса при открытии будет неправильной.

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

Visual Basic
1
Set cell=Sheets("Лист1").Сells(Sheets("Лист1").Range("a1").End(xldown).row+1, 1)

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

Логическая импликация двух выражений

Примеры.

  1. Свойство DisplayGridLines принимает значение True или False . Следовательно, применение оператора Not изменяет True на False , a False — на True :
    ActiveWindow . DisplayGridLines = _
    Not ActiveWindow . DisplayGridLines
  2. Представленное далее выражение осуществляет логическую операцию And . Оператор MsgBox отображает True , только если Лисг1 — активный лист и активная ячейка находит­ся в строке 1. Если одно или оба этих условия неверны, оператор MsgBox отображает False :
    MsgBox ActiveSheet . Name = «Лист1» And ActiveCell . Row = 1
  3. Следующее выражение осуществляет логическую операцию 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

Like this post? Please share to your friends:
  • Vba excel переменные в одну строку
  • Vba excel первые символы ячейки
  • Vba excel переменные integer
  • Vba excel первая буква заглавная excel
  • Vba excel пауза на 1 секунду