Excel vba значение переменной по умолчанию

4377 / 661 / 36

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

Сообщений: 2,134

1

Как в функции определить параметр со значением по умолчанию

06.12.2012, 16:19. Показов 7966. Ответов 2


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

Добрый день. Посоветуйте, пожалуйста, как при написании функции установить по умолчанию свойство True параметра boolean. Если такое возможно, конечно. При моем условии Public Function mFnct(ByVal string as String, Optional ByVal mBln as Boolean), по умолчанию устанавливается mBln = False (нужно = True).



0



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

06.12.2012, 16:39

2

Вы не поверите

Visual Basic
1
Public Function mFnct(ByVal str As String, Optional ByVal mBln As Boolean = True)

Переменная не может называться string.



2



4377 / 661 / 36

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

Сообщений: 2,134

06.12.2012, 16:52

 [ТС]

3

Да… Ужжж. А я вставлял «= True» перед As Boolean. Во клоун! А «str» — это только здесь и для быстроты.



0



Хитрости »

1 Май 2011              225375 просмотров


Что такое переменная и как правильно её объявить?

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

Для чего нужна переменная? Чтобы хранить значение и применить его позже в любой момент. Например, в ячейке А1 записана сумма, а нажатием на кнопку запускается обновление отчета. После обновления отчета сумма в А1 изменится. Необходимо сверить сумму до обновления с суммой после и в зависимости от этого сделать какое-либо действие. Переменная как раз позволит запомнить значение ячейки до того, как она обновится и использовать именно это значение после обновления.


  • Требования к переменным
  • Типы данных, хранимых в переменных
  • Как объявлять переменные
  • Как правильно назвать переменную
  • Пример использования переменных
  • Константы

В качестве имен переменных можно использовать символы букв и числа, но первой в имени переменной всегда должна быть буква. Не допускается использование точки, запятой, пробела и иных знаков препинания, кроме нижнего подчеркивания. Длина имени не должна превышать 254 символов. Так же нельзя использовать в качестве имен для переменных зарезервированные константы редактора VBA(например Sub, Msgbox, ubound, Date и т.п.). Так же для переменных неважен регистр букв.

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

типы данных, которые можно хранить в переменных:

Тип данных Занимает байт в памяти Пределы значений
Byte 1 Целые числа от 0 до 255
Boolean 2 True или False
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.94065645841247Е-324
Decimal 12 От ±79228162514264337593543950335 без десятичных знаков до ±7,9228162514264337593543950335 с 28-ю знаками после запятой
Currency 8 От (–922337203685477.5808) до 922337203685477.5807
Date 8 От 01.01.100 до 31.12.9999(не надо путать с датами в Excel — 01.01.1900 до 31.12.9999)
String 10(+длина строки) От 0 до 65400 символов для фиксированных строк и чуть более 2 млрд. для строк переменной длины
Object 4 Любой объект
Array Определяется кол-вом и размером элементов
Variant от 16-ти Любой из встроенных типов данных

Как видно из таблицы больше всего памяти занимает Variant. Притом это если он хранит числовые данные. Если же такая переменная будет хранить данные строкового типа(текст), то размер занимаемой памяти будет измеряться уже начиная с 22 байт + длина строки, хранящейся в переменной. Чем больше памяти занимает переменная, тем дольше она инициализируется в памяти и тем медленнее код будет выполняться. Вот поэтому и важно явно задавать тип данных, хранимых в переменной — это называется объявить переменную.

Тип данных Decimal больше не используется, поэтому объявить переменную данного типа в VBA не получится — подобная попытка приведет к синтаксической ошибке. Для работы с данными типа Decimal переменную необходимо изначально объявить как Variant или вообще без типа (например Dim a), т.к. тип данных Variant используется в VBA по умолчанию и принимает любой тип данных.

Так же переменным можно назначать и другие типы данных, которых нет в таблице выше — это типы, которые поддерживаются объектной моделью приложений, к которым «подключен» VBA. Например, если зайти в VBA из Excel, то библиотека типов объектной модели Excel подключена по умолчанию и для переменных становится доступно множество типов этой объектной модели. Многие из них знакомы всем: Workbook, Worksheet, Range, Cells, Chart и т.д. Т.е. это книги, листы, ячейки, диаграммы. Типов много, почти на каждый объект и коллекцию. Рассматривать здесь все бессмысленно. Могу лишь привести пару строк кода:

Dim rRange as Range 'назначили переменной тип ячейка/диапазон
Set rRange = Range("A1") 'присвоили ссылку на ячейку A1 текущего листа

Про объявление переменных подробно написано чуть ниже.
А более подробно про обращение к диапазонам из VBA можно почитать в этой статье: Как обратиться к диапазону из VBA

как объявлять переменные

На самом деле все очень просто. Это делается при помощи операторов области действия: Dim, Public,Static и оператора присвоения типа As. Самый распространенный оператор — Dim. Его и возьмем в качестве примера. Синтаксис объявления:

[оператор области действия] Имя_переменной As [тип данных]

Очень частая ошибка при объявлении переменных, совершаемая начинающими изучать VBA:

Dim MyVar1, MyVar2, MyVar3 As Integer

Вроде бы исходя из логики всем переменным присвоен тип данных Integer. Но это ошибочное суждение. Тип Integer присвоен только последней переменной, к которой он «привязан» оператором AsMyVar3. Все остальные переменные имеют тип данных Variant. Т.е. если Вы не задаете каждой переменной свой тип хранимых данных явно(т.е. не указываете для неё тип данных через As), то VBA сам присваивает для такой переменной тип данных Variant, т.к. он может хранить любой тип данных. А вот так выглядит правильное присвоение типа данных:

Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer

Это и есть объявление переменных. Т.е. сначала идет оператор области действия (Dim, Public,Static), сразу за ним имя переменной, затем оператор As и тип.
Но это не все. Некоторые типы переменным можно присваивать еще короче — даже без оператора As:

Dim MyVar1%, MyVar2%, MyVar3%

Всего шесть типов, которые можно объявить подобным методом:
! — Single
# — Double
$ — String
% — Integer
& — Long
@ — Currency
На что стоит обратить внимание, при объявлении переменных подобным образом: между именем переменной и знаком типа не должно быть пробелов.
Я лично в большинстве статей предпочитаю использовать первый метод, т.е. полное указание типа. Это читабельнее и понятнее. В каких-то проектах могу использовать краткое указание, в общих(разработка в команде) — полное. В своих кодах Вы вправе использовать удобный Вам метод — ошибки не будет.

Теперь разберемся с операторами области действия(Dim, Public и Static):

  • Dim — данный оператор используется для объявления переменной, значение которой будет храниться только в той процедуре, внутри которой данная переменная объявлена. Во время запуска процедуры такая переменная инициализируется в памяти и использовать её значение можно внутри только этой процедуры, а по завершению процедуры переменная выгружается из памяти(обнуляется) и данные по ней теряются. Переменную, объявленную подобным образом еще называют локальной переменной. Однако с помощью данного оператора можно объявить переменную, которая будет доступна в любой процедуре модуля. Необходимо объявить переменную вне процедуры — в области объявлений(читать как первой строкой в модуле, после строк объявлений типа — Option Explicit). Тогда значение переменной будет доступно в любой процедуре лишь того модуля, в котором данная переменная была объявлена. Такие переменные называются переменными уровня модуля. Также для использования переменных во всех процедурах и функциях одного конкретного модуля можно использовать оператор Private. Но он в данном случае ничем не отличается от Dim, а пишется длиннее :) Плюс, Private нельзя использовать внутри процедуры или функции(только в области объявлений), что еще больше сужает её применимость. По сути чаще этот оператор применяется к функциям и процедурам(об этом см.ниже)
  • Static — данный оператор используется для объявления переменной, значение которой предполагается использовать внутри конкретной процедуры, но не теряя значения данной переменной по завершении процедуры. Переменные данного типа обычно используют в качестве накопительных счетчиков. Такая переменная инициализируется в памяти при первом запуске процедуры, в которой она объявлена. По завершении процедуры данные по переменной не выгружаются из памяти, но однако они не доступны в других процедурах. Как только Вы запустите процедуру с этой переменной еще раз — данные по такой переменной будут доступны в том виде, в котором были до завершения процедуры. Выгружается из памяти такая переменная только после закрытия проекта(книги с кодом).
  • Public — данный оператор используется для объявления переменной, значение которой будет доступно в любой процедуре проекта(в обычных модулях, модулях класса, модулях форм, модулях листов и книг). Переменная, объявленная подобным образом, должна быть объявлена вне процедуры — в области объявлений. Такая переменная загружается в память во время загрузки проекта(при открытии книги) и хранит значение до выгрузки проекта(закрытия книги). Использовать её можно в любом модуле и любой процедуре проекта. Важно: объявлять подобным образом переменную необходимо строго в стандартном модуле. Такие переменные называются переменными уровня проекта. В простонародье такие переменные еще называют глобальными(возможно из-за того, что раньше подобные переменные объявлялись при помощи оператора Global, который в настоящее время устарел и не используется).
    Для большего понимания того, где и как объявлять переменные уровня проекта два небольших примера.
    Неправильное объявление

    Option Explicit
     
    Sub main()
    Public MyVariable As String
    MyVariable = "Глобальная переменная"
    'показываем текущее значение переменной
    MsgBox MyVariable
    'пробуем изменить значение переменной
    Call sub_main
    'показываем измененное значение переменной
    MsgBox MyVariable
    End Sub
    'доп.процедура изменения значения переменной
    Sub ChangeMyVariable()
    MyVariable = "Изменили её значение"
    End Sub

    переменные не будут видны во всех модулях всех процедур и функций проекта, потому что:
    1. Оператор Public недопустим внутри процедуры(между Sub и End Sub), поэтому VBA при попытке выполнения такой процедуры обязательно выдаст ошибку — Invalid Attribut in Sub or Function.
    2. Даже если Public заменить на Dim — это уже будет переменная уровня процедуры и для других процедур будет недоступна.
    3. Т.к. объявление неверное — вторая процедура(ChangeMyVariable) ничего не знает о переменной MyVariable и естественно, не сможет изменить именно её.
    Правильное объявление

    'выше глобальных переменных и констант могут быть только декларации:
    Option Explicit     'принудительное объявление переменных
    Option Base 1       'нижняя граница объявляемых массивов начинается с 1
    Option Compare Text 'сравнение текста без учета регистра
    'глобальная переменная - первой строкой, выше всех процедур
    Public MyVariable As String
    'далее процедуры и функции
    Sub main()
        MyVariable = "Глобальная переменная"
        'показываем текущее значение переменной
        MsgBox MyVariable, vbInformation, "www.excel-vba.ru"
        'пробуем изменить значение переменной
        Call ChangeMyVariable
        'показываем измененное значение переменной
        MsgBox MyVariable, vbInformation, "www.excel-vba.ru"
    End Sub
    'доп.процедура изменения значения переменной
    Sub ChangeMyVariable()
        MyVariable = "Изменили её значение"
    End Sub

    Если при этом вместо Public записать Dim, то эта переменная будет доступна из всех функций и процедур того модуля, в котором записана, но недоступна для функций и процедур других модулей.
    Переменные уровня проекта невозможно объявить внутри модулей классов(ClassModule, ЭтаКнига(ThisWorkbook), модулей листов, модулей форм(UserForm) — подробнее про типы модулей: Что такое модуль? Какие бывают модули?)

  • Операторы области действия так же могут применяться и к процедурам. Для процедур доступен еще один оператор области действия — Private. Объявленная подобным образом процедура доступна только из того модуля, в котором записана и такая процедура не видна в диалоговом окне вызова макросов(Alt+F8)
  • 'процедура записана в Module1
    'эта процедура будет доступна для вызова исключительно из процедур в этом же модуле
    'но не будет доступна при вызове из других модулей
    Private Sub PrivateMain()
        MsgBox "Процедура может быть вызвана только из модуля, в котором записана", vbInformation, "www.excel-vba.ru"
    End Sub
    'другая процедура, записанная в этом же модуле
    Sub CallPrivate()
        Call PrivateMain
    End Sub
    'эта процедура записана в другом модуле - Module2
    'при попытке вызова этой процедурой получим ошибку
    ' Sub or Function not defined
    ' потому что процедура PrivateMain объявлена только для Module1
    Sub CallPrivate_FromModule1()
        Call PrivateMain
    End Sub

    При этом, если из Excel нажать сочетание клавиш Alt+F8, то в окне будут доступны только CallPrivate_FromModule1 и CallPrivate. Процедура PrivateMain будет недоступна.

Как правильно назвать переменную:

«Что самое сложное в работе программиста? — выдумывать имена переменным.» :-)А ведь придумать имя переменной тоже не так-то просто. Можно, конечно, давать им имена типа: a, d, f, x, y и т.д.(я сам иногда так делаю, но либо в простых кодах, либо для специального запутывания кода). Но стоит задуматься: а как Вы с ними будете управляться в большом коде? Код строк на 10 еще потерпит такие имена, а вот более крупные проекты — не советовал бы я в них оперировать такими переменными. Вы сами запутаетесь какая переменная как объявлена и какой тип данных может хранить и что за значение ей присвоено. Поэтому лучше всего давать переменным осмысленные имена и следовать соглашению об именовании переменных. Что за соглашение? Все очень просто: перед основным названием переменной ставится префикс, указывающий на тип данных, который мы предполагаем хранить в данной переменной. Про имеющиеся типы данных я уже рассказал выше. А ниже приведена примерная таблица соответствий префиксов типам данных:

Префикс Тип хранимых данных
b Boolean
bt Byte
i Integer
l Long
s Single
d Double
c Currency
dt Date
str String
obj Object
v Variant

Лично я немного для себя её переделал, т.к. некоторые обозначения мне кажутся скудными. Например Double я обозначаю как dbl, а Single как sgl. Это мне кажется более наглядным.

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

DefBool B
Sub test()
    Dim bCheck
End Sub

Автоматически переменной bCheck будет присвоен тип Boolean, т.к. она начинается с буквы b — регистр здесь не имеет значения(впрочем как в VBA в целом). Оператор Def задается в области объявления. Можно задать не одну букву, а целый диапазон букв:

DefBool B-C
Sub test()
    Dim bCheck, cCheck
End Sub

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

DefBool B
DefStr S
Sub test()
    Dim bCheck, sCheck
End Sub

Ниже приведен полный перечень операторов типов и данные, которые задает каждый из них:
DefBool — Задает тип Boolean
DefByte — Задает тип Byte
DefCur — Задает тип Currency
DefDate — Задает тип Date
DefDbl — Задает тип Double
DefInt — Задает тип Integer
DefLng — Задает тип Long
DefObj — Задает тип Object
DefSng — Задает тип Single
DefStr — Задает тип String
DefVar — Задает тип Variant
По умолчанию в VBA применена инструкция DefVar для всех букв(иначе говоря для всех переменных, которым не назначен тип данных явно через оператор As).

Ну и немаловажный момент это непосредственно осмысленное имя переменной. Имя переменной должно примерно отражать то, что в ней будет храниться. Например, Вы создаете отчет и Вам надо объявить две переменные: одна имя листа, другая имя книги. Можно было сделать так: str1, str2. Коротко, здорово. Но если подумать — и как можно понять, какая из этих переменных что хранит? Никак. Надо просматривать код и вспоминать, какой переменной какое значение было присвоено. Не совсем удобно, правда? А если бы Вы задали имена так: strBookName, strSheetName, то вроде как более понятно, что мы в них будем хранить. Это удобно не только вам самим при работе с кодом, но и другим людям, которые, возможно в будущем будут пользоваться Вашим кодом. Им будет удобнее читать код, если он будет оформлен грамотно, а переменные названы осмысленно. И не стоит экономить на длине имени — имя должно быть понятным. Без фанатизма, конечно :-). Хоть VBA и позволяет нам создавать переменные длиной до 254 символов, но читать такую переменную так же неудобно, как и с одним символом. Но здесь уже все зависит от Ваших предпочтений и фантазии.
Небольшое дополнение: лучше привыкать давать названия переменным на латинице(т.е. английский алфавит), т.к. для VBA английский язык «родной» и лучше использовать его.

Небольшой пример использования переменных в кодах:
Sub main()
'объявляем переменные с назначением конкретных типов
'As String - текст
'As Long   - целое число
Dim sAddress As String, sNewAddress As String, sShName As String
Dim lRow As Long
Dim rRange as Range 'назначили переменной тип ячейка/диапазон
 
'присвоили переменной rRange ссылку на текущую выделенную ячейку
Set rRange = Selection
'меняем выделение - выделяем ячейку D9
Range("D9").Select
'назначаем переменной адрес выделенных ячеек
sAddress = Selection.Address
'назначаем переменной lRow значение первой строки выделенной области
lRow = Selection.Row
'показываем сообщение
MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www.excel-vba.ru"
MsgBox "Номер первой строки: " & lRow, vbInformation, "www.excel-vba.ru"
'назначаем другой переменной значение адреса ячейки A1
sNewAddress = "A1"
'выделяем ячейку, заданную переменной sNewAddres
Range(sNewAddress).Select
MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.excel-vba.ru"
'выделяем изначально выделенную ячейку, используя переменную rRange
rRange.Select
MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.excel-vba.ru"
'задаем значение переменной
sShName = "excel-vba"
'переименовываем активный лист на имя, заданное переменной
ActiveSheet.Name = sShName
End Sub

Просмотреть пошагово выполнение данного кода поможет статья: Отлов ошибок и отладка кода VBA
Важно! Назначение значений переменным задается при помощи знака равно(=). Однако, есть небольшой нюанс: для переменных типа Object(а так же других объектных типов(Workbook, Worksheet, Range, Cells, Chart и т.п.)) присвоение идет при помощи ключевого оператора Set:

'присвоили переменной rRange ссылку на текущую выделенную ячейку
Set rRange = Selection

это так же называется присвоением ссылки на объект. Почему именно ссылки? Все просто: при помещении в переменную непосредственно ячейки или диапазона(Set var = Range(«A1») или Set rRange = Selection) нет никакого запоминания самой ячейки. В переменную помещается лишь ссылка на эту ячейку(можете считать, что это как ссылка в формулах) со всеми вытекающими: такое назначение не запоминает свойства ячейки до или после — в переменной хранится ссылка на конкретную ячейку и доступ есть исключительно к свойствам ячейки на текущий момент. Чтобы запомнить для этой ячейки значение, цвет или даже адрес (а так же и другие свойства) до её изменения и применить запомненное даже после изменения/перемещения самой ячейки — необходимо запоминать в переменные именно свойства ячейки:

Sub main()
    Dim val, l_InteriorColor As Long, l_FontColor As Long
    Dim rRange As Range 'назначили переменной тип ячейка/диапазон
 
    'присвоили переменной rRange ссылку на активную ячейку
    Set rRange = ActiveCell
    'запоминаем свойства ячейки
    val = rRange.Value                      'значение
    l_InteriorColor = rRange.Interior.Color 'цвет заливки
    l_FontColor = rRange.Font.Color         'цвет шрифта
    'копируем другую ячейку и вставляем на место активной
    ActiveSheet.Range("D1").Copy rRange
 
    'проверяем, что rRange теперь имеет совершенно другие свойста - как у D1
    MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _
           "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _
           "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.excel-vba.ru"
 
    'назначаем свойства из сохраненных в переменных
    rRange.Value = val                      'значение
    rRange.Interior.Color = l_InteriorColor 'цвет заливки
    rRange.Font.Color = l_FontColor         'цвет шрифта
 
    'проверяем, что rRange возвращены параметры до копирования
    MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _
           "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _
           "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.excel-vba.ru"
End Sub

Это так же распространяется на все другие объекты. Т.е. те переменные, значения которым назначаются через оператор Set.
Для других же типов Set не нужен и в переменную значение заносится без этих нюансов.


Константы

Так же есть и иной вид «переменных» — константы. Это такая же переменная, только(как следует из её названия) — она не может быть изменена во время выполнения кода, т.к. является величиной постоянной и значение её назначается только один раз — перед выполнением кода.

Const sMyConst As String = "Имя моей программы"

Константам могут быть назначены данные тех же типов, что и для переменных, за исключением типа Object, т.к. Object это всегда ссылка на объект, который как правило обладает «динамическими»(т.е. обновляющимися) свойствами. А изменение для констант недопустимо.
Для дополнительной области видимости/жизни констант используется только Public. Если область видимости не указана, то константа будет доступна только из того модуля, в котором объявлена. Здесь обращаю внимание на то, что Dim уже не используется, т.к. Dim это идентификатор только для переменных. Пару важных отличий объявления констант от объявления переменных:

  • при объявлении константы необходимо обязательно указывать явно, что это константа ключевым словом Const
  • сразу в момент объявления необходимо назначить константе значение: = «Имя моей программы»

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

Sub TestConst()
    Const sMyConst As String = "Имя моей программы"
    MsgBox sMyConst 'показываем сообщение с именем программы
End Sub

то она не может быть использована в другой процедуре:

Sub TestConst()
    Const sMyConst As String = "Имя моей программы"
    MsgBox sMyConst 'показываем сообщение с именем программы
End Sub
Sub TestConst2()
    MsgBox sMyConst 'вызовет ошибку Variable not defined
End Sub

Чтобы использовать одну константу во всех процедурах модуля(того, в котором она объявлена), необходимо объявить её в области объявлений:

Const sMyConst As String = "Имя моей программы"
Sub TestConst()
    MsgBox sMyConst 'показываем сообщение с именем программы
End Sub
Sub TestConst2()
    MsgBox sMyConst 'уже не вызовет ошибку Variable not defined
End Sub

Чтобы использовать одну константу во всех процедурах проекта(книги), необходимо объявить её как Public:

Public Const sMyConst As String = "Имя моей программы"
Sub TestConst()
    MsgBox sMyConst 'показываем сообщение с именем программы
End Sub
Sub TestConst2()
    MsgBox sMyConst 'не вызовет ошибку Variable not defined, даже если процедура в другом модуле
End Sub

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

Также см.:
Variable not defined или что такое Option Explicit и зачем оно нужно?
Что такое модуль? Какие бывают модули?
Что такое макрос и где его искать?
Отлов ошибок и отладка кода VBA


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

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


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



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

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

Например, константа Pi хранит значение 3,14159265… Число «Пи» не будет изменяться в ходе выполнения программы, но все же хранить такое значение удобнее как константу.

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

Содержание

  1. Типы данных
  2. Объявление переменных и констант
  3. Option Explicit
  4. Область действия переменных и констант

Типы данных

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

Тип данных Размер Описание Диапазон значений
Byte 1 байт Положительные целые числа; часто используется для двоичных данных от 0 до 255
Boolean 2 байта Может принимать значения либо True, либо False True или False
Integer 2 байта Целые числа (нет дробной части) от -32 768 до +32 767
Long 4 байта Большие целые числа (нет дробной части) от -2 147 483 648 до +2 147 483 647
Single 4 байта Число с плавающей точкой одинарной точности от -3.4e38 до +3.4e38
Double 8 байт Число с плавающей точкой двойной точности от -1.8e308 до +1.8e308
Currency 8 байт Число с плавающей точкой, с фиксированным количеством десятичных разрядов от -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Date 8 байт Дата и время – данные типа Date представлены числом с плавающей точкой. Целая часть этого числа выражает дату, а дробная часть – время от 1 Января 100 до 31 Декабря 9999
Object 4 байта Ссылка на объект Любая ссылка на объект
String изменяется Набор символов. Тип String может иметь фиксированную или изменяющуюся длину. Чаще используется с изменяющейся длиной Фиксированной длины — приблизительно до 65 500 символов. Переменной длины — приблизительно до 2 миллиардов символов
Variant изменяется Может содержать дату, число с плавающей точкой или строку символов. Этот тип используют в тех случаях, когда заранее не известно, какой именно тип данных будет введён Число – Double, строка – String

Очевидно, что пользуясь приведённой выше таблицей и правильно выбирая тип данных, можно использовать память более экономно (например, выбрать тип данных Integer вместо Long или Single вместо Double). Однако, используя более компактные типы данных, нужно внимательно следить за тем, чтобы в коде не было попыток уместить в них не соразмерно большие значения.

Объявление переменных и констант

Примечание переводчика: Говоря о переменных в VBA, стоит упомянуть ещё один очень важный момент. Если мы объявляем переменную, но не присваиваем ей какое-либо значение, то она инициализируется значением по умолчанию:
• текстовые строки — инициализируются пустыми строками;
• числа — значением 0;
• переменные типа Boolean — False;
• даты — 30 декабря 1899.

Прежде чем использовать переменную или константу, её нужно объявить. Для этого в макрос добавляют вот такую простую строку кода:

Dim Имя_Переменной As Тип_Данных

В показанной выше строке кода Имя_Переменной – это имя переменной, которая будет использована в коде, а Тип_Данных – это один из типов данных из таблицы, приведённой чуть ранее в этой статье. Например:

Dim sVAT_Rate As Single
Dim i As Integer

Аналогично объявляются константы, но при объявлении констант обязательно сразу указывается их значение. Например, вот так:

Const iMaxCount = 5000
Const iMaxScore = 100

Объявлять переменные в Excel не обязательно. По умолчанию все введённые, но не объявленные переменные в Excel будут иметь тип Variant и смогут принять как числовое, так и текстовое значение.

Таким образом, программист в любой момент сможет использовать новую переменную (даже если она не была объявлена), и Excel будет рассматривать её как переменную типа Variant. Однако, есть несколько причин, почему так поступать не следует:

  1. Использование памяти и скорость вычислений. Если не объявлять переменную с указанием типа данных, то по умолчанию для неё будет установлен тип Variant. Этот тип данных использует больше памяти, чем другие типы данных.Казалось бы, несколько лишних байт на каждую переменную – не так уж много, но на практике в создаваемых программах могут быть тысячи переменных (особенно при работе с массивами). Поэтому излишняя память, используемая переменными типа Variant, по сравнению с переменными типа Integer или Single, может сложится в значительную сумму.К тому же, операции с переменными типа Variant выполняются гораздо медленнее, чем с переменными других типов, соответственно лишняя тысяча переменных типа Variant может значительно замедлить вычисления.
  2. Профилактика опечаток в именах переменных. Если все переменные объявляются, то можно использовать оператор VBA — Option Explicit (о нём расскажем далее), чтобы выявить все не объявленные переменные.Таким образом исключается появление в программе ошибки в результате не верно записанного имени переменной. Например, используя в коде переменную с именем sVAT_Rate, можно допустить опечатку и, присваивая значение этой переменной, записать: «VATRate = 0,175». Ожидается, что с этого момента, переменная sVAT_Rate должна содержать значение 0,175 – но, конечно же, этого не происходит. Если же включен режим обязательного объявления всех используемых переменных, то компилятор VBA сразу же укажет на ошибку, так как не найдёт переменную VATRate среди объявленных.
  3. Выделение значений, не соответствующих объявленному типу переменной. Если объявить переменную определённого типа и попытаться присвоить ей данные другого типа, то появится ошибка, не исправив которую, можно получить сбой в работе программы.На первый взгляд, это может показаться хорошей причиной, чтобы не объявлять переменные, но на самом деле, чем раньше выяснится, что одна из переменных получила не те данные, которые должна была получить – тем лучше! Иначе, если программа продолжит работу, результаты могут оказаться неверными и неожиданными, а найти причину ошибок будет гораздо сложнее.Возможно также, что макрос будет «успешно» выполнен. В результате ошибка останется незамеченной и работа продолжится с неверными данными!

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

Option Explicit

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

Option Explicit

Если хотите всегда вставлять Option Explicit в начало каждого нового созданного модуля VBA, то это можно делать автоматически. Для этого необходимо включить параметр Require Variable Declaration в настройках редактора VBA.

Это делается так:

  • В меню редактора Visual Basic нажмите Tools > Options
  • В появившемся диалоговом окне откройте вкладку Editor
  • Отметьте галочкой параметр Require Variable Declaration и нажмите ОК

При включенном параметре строка Option Explicit будет автоматически вставляться в начало каждого нового созданного модуля.

Область действия переменных и констант

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

Option Explicit

Dim sVAT_Rate As Single

Function Total_Cost() As Double


...


End Function
Если переменная sVAT_Rate объявлена в самом начале модуля, то областью действия этой переменной будет весь модуль (т.е. переменная sVAT_Rate будет распознаваться всеми процедурами в этом модуле).

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

Однако, если будет вызвана какая-то функция, расположенная в другом модуле, то для неё переменная sVAT_Rate будет не известна.

Option Explicit

Function Total_Cost() As Double

Dim sVAT_Rate As Single


...


End Function
Если переменная sVAT_Rate объявлена в начале функции Total_Cost, то её область действия будет ограничена только этой функцией (т.е. в пределах функции Total_Cost, можно будет использовать переменную sVAT_Rate, а за её пределами – нет).

При попытке использовать sVAT_Rate в другой процедуре, компилятор VBA сообщит об ошибке, так как эта переменная не была объявлена за пределами функции Total_Cost (при условии, что использован оператор Option Explicit).

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

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

Для объявления констант также можно использовать ключевые слова Public и Private, но не вместо ключевого слова Const, а вместе с ним.

В следующих примерах показано использование ключевых слов Public и Private в применении к переменным и к константам.

Option Explicit

Public sVAT_Rate As Single

Public Const iMax_Count = 5000

...

В этом примере ключевое слово Public использовано для объявления переменной sVAT_Rate и константы iMax_Count. Областью действия объявленных таким образом элементов будет весь текущий проект.

Это значит, что sVAT_Rate и iMax_Count будут доступны в любом модуле проекта.

Option Explicit

Private sVAT_Rate As Single

Private Const iMax_Count = 5000

...

В этом примере для объявления переменной sVAT_Rate и константы iMax_Count использовано ключевое слово Private. Областью действия этих элементов является текущий модуль.

Это значит, что sVAT_Rate и iMax_Count будут доступны во всех процедурах текущего модуля, но не будут доступны для процедур, находящихся в других модулях.

Оцените качество статьи. Нам важно ваше мнение:

Переменные и константы в VBA

​Смотрите также​ конкретным вопросом (что​ данных Long​ тип указать. Поверьте,​ и объявлять переменные​ по ссылке​ vbNewLine & TypeName(l)​, Запустите для проверки​ пользователю должно быть​Нажмите​

​ выражение:​​ полезным ещё раз​​Sub​ константам.​ зависит от того,​Если все переменные​вместо​В VBA, как и​ нужно сделать/для чего)​

​DefCur — Тип​ столько было ошибок​ и их количество.​​RAN​​ & vbNewLine &​ такой макрос​ показано сообщение об​​Alt+F8​​=SumMinus(10, 5, 2)​ взглянуть на особенности​в VBA добавляет​Option Explicit Public sVAT_Rate​

Типы данных

​ где было сделано​ объявляются, то можно​Double​ в любом другом​ — возможно получится​ данных Currency​ из-за того, что​ Варианты переменных я​

​: Вот уж воистину​ TypeName(d)​

​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub tt()​ ​ ошибке и процедура​ ​(нажмите клавишу​Редактор VBA понимает, что​ и отличия этих​ ​ заданное целое число​
​ As Single Public​ ​ объявление переменной или​ ​ использовать оператор VBA​). Однако, используя более​ ​ языке программирования, переменные​
​ всё решить более​ ​DefSng — Тип​ ​ использовали Variant, а​ изучал, но как​ ​ — «Смотрю в​
​End Sub​ ​Dim w, e​ ​ должна быть тут​Alt​ ​ перед ним процедура​
​ двух типов процедур.​ ​ (Integer) в каждую​ ​ Const iMax_Count =​ константы. Возьмём, к​ ​ —​
​ компактные типы данных,​ ​ и константы используются​ ​ «деликатно»​ данных Single​ ​ не конкретный тип.​
​ выбирать до конца​ ​ книгу, вижу …»​ ​Но с Option​ As Boolean​ же завершена:​ ​и, удерживая её​
​Sub​ ​ Далее приведены краткие​ ​ ячейку в выделенном​ 5000 …​ примеру, переменную​Option Explicit​ нужно внимательно следить​ для хранения каких-либо​FreddyLumix​DefDbl — Тип​ ​Юрий М​ не понимаю. Считать​Там и ссылочка​
​ Explicit будет ругаться.​ ​w = 2​ ​Function VAT_Amount(sVAT_Rate As​ ​ нажатой, нажмите клавишу​
​, когда встречает группу​ ​ обсуждения процедур VBA​ ​ диапазоне. Передать процедуре​В этом примере ключевое​sVAT_Rate​(о нём расскажем​ за тем, чтобы​ ​ значений. Как и​: «…или используйте Application.InputBox​ данных Double​: Плохой совет )​ по битам или​
​ есть Что такое​ ​alex77755​ ​e = 2​ Single) As Single​F8​ команд, заключённую между​Function​ это число можно​ слово​, которая используется в​ далее), чтобы выявить​ ​ в коде не​ следует из названия,​

​ с соответствующим параметром.»​DefDate — Тип​Все_просто​ байтам- тёмный лес.​ модуль? Какие бывают​: Насколько мне известно​[a1] = w​​ VAT_Amount = 0​​).​​ вот такими открывающим​​и​​ при помощи аргумента,​​Public​​ функции​​ все не объявленные​ было попыток уместить​ переменные могут изменяться,​А вот этого,​ данных Date​: Если хотите работать​ Вот если не​ модули?​

Объявление переменных и констант

​ такой способ возможен​​[a2] = e​ If sVAT_Rate​В появившемся списке макросов​ и закрывающим операторами:​Sub​ вот так:​использовано для объявления​Total_Cost​ переменные.Таким образом исключается​ в них не​
​ константы же хранят​ если честно, не​DefStr — Тип​
​ профессионально в VBA,​ трудно, то в​
​combat​​ только в VB.NET.​​End Sub​
​Обратите внимание, что перед​ выберите тот, который​

​Sub … End​и показаны простые​Sub AddToCells(i As​ переменной​. В следующей таблице​ появление в программе​

​ соразмерно большие значения.​​ фиксированные значения.​​ понял. Знаний еще​​ данных String​

​ то нужно приучать​ каком случае выбирать​​: Так у меня​​Ни в VB6,​и Вам сразу​ тем, как завершить​ хотите запустить.​​ Sub​​ примеры.​ Integer) … End​sVAT_Rate​ рассмотрены два варианта​ ошибки в результате​

​Примечание переводчика:​Например, константа​ маловато….​

​DefObj — Тип​ себя объявлять все​ string, а в​ один код в​ ни в VBA​

​ все станет ясно​ выполнение процедуры​Нажмите​

​Рассмотрим пример простой VBA​Редактор VBA распознаёт процедуру​ Sub​и константы​ области действия переменной​ не верно записанного​​Говоря о переменных​​Pi​Jack Famous​ данных Оbject​

​ переменные. Для дисциплинирования​ каком Boolean, а​ форме, а другой​ он не катит.​Wowick​Function​Выполнить​ процедуры​​Function​​Имейте в виду, что​iMax_Count​sVAT_Rate​

  1. ​ имени переменной. Например,​ в VBA, стоит​​хранит значение 3,14159265…​: тем более на​DefVar — Тип​ можно нажать на​ в каком variant.​ на листе, переменную​​Кстати в VB.NET​​: Неужели самому сложно​–​(Run)​Sub​, когда встречает группу​ наличие аргументов для​. Областью действия объявленных​, объявленной в двух​ используя в коде​ упомянуть ещё один​ Число «Пи» не​ форум​ данных Variant​ птичку в настройках,​Спасибо​​ я привязываю от​​ тип данных относится​ проверить???​​VAT_Amount​​Чтобы выполнять процедуру​​, задача которой –​​ команд, заключённую между​ процедур​ таким образом элементов​ различных позициях в​​ переменную с именем​​ очень важный момент.​ будет изменяться в​А перед этим​Jack Famous​ где указывается, что​​vikttur​​ формы, где должно​ ко всем переменным​
  2. ​Написал вот такой​, в код вставлена​​Sub​ изменить форматирование выделенного​ вот такими открывающим​Function​​ будет весь текущий​​ модуле:​sVAT_Rate​ Если мы объявляем​ ходе выполнения программы,​ почитать про диалоги​: Alemox, так по​ в самом верху​: В зависимости от​ присвоится к «rrr»​ в строке:​​ макрос:​​ встроенная VBA функция​быстро и легко,​ диапазона ячеек. В​ и закрывающим операторами:​и​ проект.​​Option Explicit Dim sVAT_Rate​​, можно допустить опечатку​ переменную, но не​ но все же​ и их особенности​ вашей же ссылке​ модуля всегда будет​ данных, для которых​ либо значение 21​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim i, j, k​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub start()​MsgBox​​ можно назначить для​​ ячейках устанавливается выравнивание​
  3. ​Function … End​Sub​​Это значит, что​ As Single Function​ и, присваивая значение​ присваиваем ей какое-либо​ хранить такое значение​Как минимум, InputBox​ всё это есть)​ указываться option explicit.​ предназначены переменные.​ либо 25 для​ As Integer​Dim i, k,​, которая показывает пользователю​ неё комбинацию клавиш.​ по центру (и​ Function​в VBA не​sVAT_Rate​ Total_Cost() As Double​ этой переменной, записать:​ значение, то она​ удобнее как константу.​ и Application.InputBox —​ крутая вещь, но​Примитивы объявлять большого​Текстовые -​ кода листа (РСИ),​В VB.NET все​ n As Integer​ всплывающее окно с​ Для этого:​

​ по вертикали, и​Как упоминалось ранее, процедура​ является обязательным. Для​и​ … End Function​ «VATRate = 0,175».​ инициализируется значением по​В то же время​ разные вещи. К​ я пока «ручками»​

Option Explicit

​ смысла нет, можно​​Sring​​модуль в общем​ переменный будут Integer​i = 1.65​ предупреждением.​Нажмите​ по горизонтали) и​Function​ некоторых процедур аргументы​iMax_Count​Если переменная​ Ожидается, что с​ умолчанию:​ мы можем использовать​ тому же, там​

​ каждую всё-таки задаю​

​ все оставлять variant​​, логические -​​ проекте есть но​В VB6 и​k = 2.65​Урок подготовлен для Вас​Alt+F8​ размер шрифта изменяется​​в VBA (в​​ не нужны.​будут доступны в​

​sVAT_Rate​

  • ​ этого момента, переменная​• текстовые строки​​ переменную​​ есть другие параметры,​​Alemox​
  • ​ и не сильно​Boolean​​ он не использует​
  • ​ VBA k Integer​​n = 7.65​​ командой сайта office-guru.ru​​.​

​ на заданный пользователем:​​ отличие от​​Процедуры VBA могут иметь​ любом модуле проекта.​объявлена в самом​

Область действия переменных и констант

​sVAT_Rate​ — инициализируются пустыми​sVAT_Rate​ кроме названия (например​: Jack Famous, Да​ заморачиваться (хотя лучше​. Всяческие счетчики, количества​ эту переменную​i, j -​MsgBox i &​Источник: http://www.excelfunctions.net/VBA-Functions-And-Subroutines.html​В появившемся списке макросов​​Sub Format_Centered_And_Sized(Optional iFontSize​​Sub​ необязательные аргументы. Это​​Option Explicit Private sVAT_Rate​​ начале модуля, то​должна содержать значение​ строками;​​для хранения ставки​​тип получаемых данных​ я увидел тоже​ объявлять — правило​

​ (не дробные), номера​или я вообще​ Variant​ » » &​ ​Перевел: Антон Андронов​​ выберите тот, которому​​ As Integer =​), возвращает значение. Для​ такие аргументы, которые​ As Single Private​ областью действия этой​​ 0,175 – но,​​• числа —​ НДС на покупаемые​— как раз​

​ потом уже. Просто​​ хорошего тона), с​​ строк -​​ не в ту​​SkyPro​ k & «​Автор: Антон Андронов​ хотите назначить сочетание​ 10) Selection.HorizontalAlignment =​ возвращаемых значений действуют​​ пользователь может указать,​​ Const iMax_Count =​ переменной будет весь​

​ конечно же, этого​ значением 0;​ товары. Величина переменной​ то, о чём​ у меня свои​​ массивами ситуация несколько​​Byte, Integer или Long​

​ степь, как нужно?​:​ » & n​Анатолий​ ​ клавиш.​​ xlCenter Selection.VerticalAlignment =​​ следующие правила:​ если захочет, а​​ 5000 …​​ модуль (т.е. переменная​ не происходит. Если​• переменные типа​sVAT_Rate​ Юрий говорит)… В​​ источники для переменных,​​ другая: объявляйте по​. Эти типы переменных​​ не понимаюююююю​​alex77755​End Sub​

​: Прошу прощения но​​Нажмите​​ xlCenter Selection.Font.Size =​Тип данных возвращаемого значения​ если они пропущены,​В этом примере для​sVAT_Rate​ же включен режим​​Boolean​​может изменяться в​ общем, читайте и​​ поэтому дал статью,​​ возможности (особенно, если​

​ предназначены для хранения​RAN​, Зато вот так​Запустил и тут​​ в интернете встречаются​​Параметры​ iFontSize End Sub​ должен быть объявлен​ то процедура использует​ объявления переменной​будет распознаваться всеми​ обязательного объявления всех​​— False;​​ зависимости от того,​ создавайте тему на​​ в которой хорошо​​ массив достаточно большой).​

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

​ что за товар​ форуме.​ описано не вникая​​ А вот объекты​​ зависимости от разрядности​​_Boroda_​​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub test()​Анатолий​​Вот на одном​​ появившемся диалоговом окне​Sub​

​Function​ по умолчанию значения.​​и константы​​ модуле).​​ компилятор VBA сразу​​ 30 декабря 1899.​ приобретается.​FreddyLumix​

​ в глубину текста​ всегда объявляем согласно​ (​: Немного поясню словами​ ​For n% =​:​​ сайте:​​ введите сочетание клавиш.​выполняет действия, но​​.​​Возвращаясь к предыдущему примеру,​​iMax_Count​​Следовательно, если в функции​ же укажет на​Прежде чем использовать переменную​Все переменные и константы​

​: Спасибо откликнувшимся за​​ и не заметил,​​ используемому типу: либо​​Byte​​Даже если у​ 0 To 3​

​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub start()​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Можно объявить несколько переменных​Нажмите​ не возвращает результат.​ ​Переменная, которая содержит возвращаемое​ чтобы сделать целочисленный​​использовано ключевое слово​​Total_Cost​​ ошибку, так как​​ или константу, её​​ относятся к определённому​​ помощь и понимание!​ что там это​ object/пусто (например, dim​

​- от 0​​ Вас модуля вообще​​MsgBox TypeName(n)​​Dim i, k,​​ в одном операторе​ОК​В этом примере также​ значение, должна быть​ аргумент функции необязательным,​Private​

​переменной​ не найдёт переменную​
​ нужно объявить. Для​
​ типу данных. В​

​Иду читать про​

office-guru.ru

Процедуры «Function» и «Sub» в VBA

Встроенные функции VBA

​ тоже имеется. Ну​ obj/dim obj as​ до 255, другие​ нет, а весь​Next​ n As Integer​ без повторения типа​и закройте диалоговое​ использован необязательный (Optional)​

​ названа так же,​ его нужно объявить​. Областью действия этих​

  • ​sVAT_Rate​VATRate​ этого в макрос​ таблице ниже приведены​​ диалоги!..)))​​ ладно. Повторение мать​​ object), если используем​​ и +, и​
  • ​ код где-то в​End Sub​i = 1.65​​ данных. В следующих​​ окно​
  • ​ аргумент​ как и процедура​ вот так:​ элементов является текущий​будет присвоено некоторое​среди объявленных.​ добавляют вот такую​​ типы данных, используемые​​Юрий М​ учения.​

​ late binding, либо​ -). Для дробных​ других местах, Вам​combat​k = 2.65​ операторах переменные i​

Пользовательские процедуры «Function» и «Sub» в VBA

​Макрос​iFontSize​Function​Sub AddToCells(Optional i​​ модуль.​​ значение, то следующая​​Выделение значений, не соответствующих​​ простую строку кода:​ в VBA, с​​: Я не думаю​​FreddyLumix​​ по типу (dim​​ данных​ нужно его (модуль)​​: В исполняемом коде​​n = 7.65​​ ,j и k​​(Macro).​

​. Если аргумент​. Эту переменную не​ As Integer =​Это значит, что​ функция, выполняемая в​ объявленному типу переменной.​​Dim​​ описанием и диапазоном​ — я знаю.​: Доброго времени суток!​ rng as range/dim​Single, Double​ создать и там​​ формы объявил глобальную​​MsgBox i &​

Аргументы

​ объявляются как тип​Внимание:​iFontSize​ нужно объявлять отдельно,​ 0)​sVAT_Rate​​ пределах этого же​​Если объявить переменную​Имя_Переменной​ возможных значений:​ А, если Вы​Я чайник в​ cln as collection/dim​… и т.д.​ написать одну строку​

​ переменную rrr​ » » &​ Integer, l и​

​Назначая сочетание клавиш​не передан процедуре​ так как она​​В таком случае целочисленный​​и​​ модуля, будет использовать​​ определённого типа и​As​Тип данных Размер​ сомневаетесь,- проверьте )​

Необязательные аргументы

​ VBA, только делаю​ appOutlook as Outlook.Application),​Если переменная для​ -​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Option Explicit​ k & «​ m как Long,​ для макроса, убедитесь,​Sub​

​ всегда существует как​ аргумент​iMax_Count​ переменную​ попытаться присвоить ей​

​Тип_Данных​ Описание Диапазон значений​Про Application.InputBox -​

​ первые шаги…Подскажите, как​ если используем early​​ объекта (диапазон, лист,​​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Public rrr As Integer​’​

​ » & n​ x и y​ что оно не​, то его значение​ неотъемлемая часть процедуры​

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

​i​будут доступны во​sVAT_Rate​

  • ​ данные другого типа,​​В показанной выше строке​Byte​ почитайте справку. Ну​ решить следующую проблемку.​ binding.​ книга), можно​combat​Public rrr As​End Sub​ как Single:​ используется, как стандартное​
  • ​ по умолчанию принимается​​Function​по умолчанию будет​ всех процедурах текущего​с этим же​ то появится ошибка,​ кода​1 байт​ не дело здесь​ Создан скрипт, который​В использовании Early​

​Object,​​: Что то я​​ Integer​​Ясно. Значит нужно​​Dim i, j,​ в Excel (например,​ равным 10. Однако​.​ равен 0.​ модуля, но не​

​ значением.​ не исправив которую,​Имя_Переменной​ ​Положительные целые числа; часто​ мне её пересказывать.​​ циклически сравнивает два​​ binding, есть большое​но правильнее указывать​ все таки не​​Dim SRng As​​ только так:​​ k As Integer​​Ctrl+C​
​ же, если аргумент​Это отлично проиллюстрировано в​Необязательных аргументов в процедуре​ ​ будут доступны для​Однако, если будет вызвана​​ можно получить сбой​​– это имя​ используется для двоичных​Юрий М​​ массива данных.​​ преимущество в виде​​ тип -​​ понимаю, или туплю,​ Range ‘, InRng​Dim S1 As​​’ All three​​). Если выбрать уже​

​iFontSize​ следующем примере.​ может быть несколько,​ процедур, находящихся в​ какая-то функция, расположенная​ в работе программы.На​​ переменной, которая будет​​ данных​​: Ещё про​​В нем, как​ intellisense (автопоказ свойств/методов/пр.)​

​Range, Worksheet​ не знаю​​ As Range​​ String, S2 As​​ variables in the​​ существующее сочетание клавиш,​ передается процедуре​Ниже приведён пример кода​ все они перечисляются​ других модулях.​ в другом модуле,​ первый взгляд, это​​ использована в коде,​​от 0 до 255​​InputBox:​​ переменная, обьявляется массив:​ после вставки точки​

VBA процедура «Function»

​…​​в вашем примере​​Dim roww As​ String, S3 As​ preceding statement are​ то оно будет​

​Sub​ VBA процедуры​

​ в конце списка​​Урок подготовлен для Вас​​ то для неё​ может показаться хорошей​​ а​​Boolean​возможно, выручит неявное​Dim My_Data (1​

  • ​ (например rng.)​Variant​ глобальную переменную объявили​​ Long​​ String​
  • ​ declared as Integer.​ переназначено макросу, и​, то в выделенном​Function​​ аргументов.​​ командой сайта office-guru.ru​ переменная​ причиной, чтобы не​Тип_Данных​2 байта​​ преобразование текста в​​ to 20) As​

​И еще одно​можно не указывать​

Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами

​ в модуле, где​в этой форме​​Спасибо​​Dim l, m​ в результате пользователь​​ диапазоне ячеек будет​​, которая получает три​Аргументы в VBA могут​Источник: http://www.excelfunctions.net/VBA-Variables-And-Constants.html​sVAT_Rate​ объявлять переменные, но​​– это один​​Может принимать значения либо​ число, но лучше​ Variant​

​ замечание. Старайтесь объявлять​ — по умолчанию​ и прописали код,​ должен получить значения​Hugo​ As Long, x,​ может запустить выполнение​

​ установлен размер шрифта,​ аргумента типа​​ быть переданы процедуре​​Перевел: Антон Андронов​будет не известна.​ на самом деле,​ из типов данных​ True, либо False​ не рисковать )​​’где 20 -​​ ВСЕ переменные/константы. При​ так и есть.​​ но я то​​Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Private Sub OptionButton1_Change()​: Такой вариант:​ y As Single​ макроса случайно.​​ заданный пользователем.​​Double​ двумя способами:​Автор: Антон Андронов​

Вызов VBA процедуры «Function»

​Option Explicit Function Total_Cost()​ чем раньше выяснится,​​ из таблицы, приведённой​​True или False​eugene.v​ длина массива, впрочем​ необходимости вводите enum/создавайте​ Под​ не использую модуль​Frame1.Height = 150​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Option Explicit​

Вызов VBA процедуры «Function» из другой процедуры

​’ In the​​В части 2 данного​​Следующая процедура похожа на​(числа с плавающей​ByVal​Перед тем, как приступить​ As Double Dim​ что одна из​ чуть ранее в​​Integer​​: Есть 2 файла,​ для людей сведующих​

​ новые классы.​Variant​прописал там переменную​If OptionButton1.Value =​’Иногда удобнее использовать​

Вызов VBA процедуры «Function» из рабочего листа

​ preceding statement, l​​ самоучителя обсуждалась тема​​ только что рассмотренную,​ точкой двойной точности).​– передача аргумента​ к созданию собственных​ sVAT_Rate As Single​ переменных получила не​ этой статье. Например:​​2 байта​​ ниже выдержки из​​ понятно и без​​Например намного приятнее​выделяется область памяти​ и то же​ True Then​

​ префиксы, причём по​

VBA процедура «Sub»

​ and m are​ области действия переменных​​ но на этот​​ В результате процедура​ по значению. Это​ функций VBA, полезно​ … End Function​

​ те данные, которые​Dim sVAT_Rate As​

VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек

​Целые числа (нет дробной​ кода. В представленном​​ комментов.​​ разбираться в коде,​ с запасом, по​ самое​rrr = 21​ двум причинам​ Long, x and​ и констант и​ раз, вместо изменения​ возвращает ещё одно​

​ значит, что процедуре​ знать, что Excel​Если переменная​ должна была получить​ Single Dim i​ части)​

​ виде все работает,​​Теперь формулирую вопрос:​​ когда написано:​ максимуму, т.к. программа​

​может быть я​…​’1 — первая​​ y are Single.​​ роль ключевых слов​​ размера, применяется полужирное​​ число типа​​ передаётся только значение​​ VBA располагает обширной​sVAT_Rate​ – тем лучше!​ As Integer​​от -32 768 до +32 767​​ но стоит в​​ С учетом того,​​arr(enProduct1) = …​ не знает. что​ не так объясняю,​End Sub​

VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек

​ буква имени уже​Вот на другом:​Public​ начертание шрифта в​Double​ (то есть, копия​ коллекцией готовых встроенных​объявлена в начале​​ Иначе, если программа​​Аналогично объявляются константы, но​Long​

​ первом дописать объявление​ что длина массива​ arr(enOrder2) = …​ Вы собрались помещать​ может быть весь​

Вызов процедуры «Sub» в Excel VBA

Вызов VBA процедуры «Sub» из другой процедуры

​Private Sub OptionButton2_Change()​​ подсказывет её тип​​Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Очень частая ошибка​и​ выделенном диапазоне ячеек.​​, равное сумме первых​​ аргумента), и, следовательно,​​ функций, которые можно​​ функции​ продолжит работу, результаты​ при объявлении констант​4 байта​

​ переменных через «Dim​ ( в нашем​

​чем​​ в переменную.​​ файл скинуть​Frame1.Height = 150​’2 — не​ при объявлении переменных,​

​Private​ Это пример процедуры​ двух аргументов минус​

Вызов VBA процедуры «Sub» из рабочего листа

​ любые изменения, сделанные​​ использовать при написании​​Total_Cost​ могут оказаться неверными​ обязательно сразу указывается​Большие целые числа (нет​ x, y», или​ случае 20), возможно​​arr(75)= … arr(23)​​Да все это​​после заполнения бланка​​If OptionButton2.Value =​ указываем тип при​​ совершаемая начинающими изучать​​. Эти ключевые слова​Sub​​ третий аргумент:​​ с аргументом внутри​ кода.​, то её область​ и неожиданными, а​ их значение. Например,​ дробной части)​​ во втором эту​​ будет меняться, хотелось​ = …​ описано-переописано…​​ и нажатия кн.​​ True Then​ объявлении (что и​ VBA:​ так же можно​​, которой не передаются​​Function SumMinus(dNum1 As​ процедуры, будут потеряны​Список этих функций можно​

​ действия будет ограничена​ найти причину ошибок​​ вот так:​​от -2 147 483 648 до +2 147 483 647​ строку убрать, добавив​

  • ​ бы реализовать скрипт​​Кроме того, если​​Количество — в​​ Печать идет сохранение​​rrr = 25​ требовалось)Код Visual Basic​​Dim MyVar1, MyVar2,​​ использовать применительно к​
  • ​ никакие аргументы:​ Double, dNum2 As​ при выходе из​
  • ​ посмотреть в редакторе​​ только этой функцией​​ будет гораздо сложнее.Возможно​

​Const iMaxCount =​​Single​​ «Set» перед присвоением​ в таком виде:​ в будущем константа​ зависимости от решаемой​

  • ​ вот здесь ругается,​​…​​’В секции Declaration​
  • ​ MyVar3 As Integer​ VBA процедурам:​Sub Format_Centered_And_Bold() Selection.HorizontalAlignment​ Double, dNum3 As​
  • ​ неё.​​ VBA:​​ (т.е. в пределах​ также, что макрос​ 5000 Const iMaxScore​
  • ​4 байта​​ значения переменной, как​​Dim My_Data (1​ поменяется, вы это​​ задачи и применяемых​​ выскочит ошибка​

​End If​​DefInt I​Вроде бы исходя​Public Sub AddToCells(i As​ = xlCenter Selection.VerticalAlignment​ Double) As Double​​ByRef​​Откройте рабочую книгу Excel​ функции​ будет «успешно» выполнен.​ = 100​Число с плавающей точкой​ редактор VBA ругается.​ to a) As​

Область действия процедуры VBA

​ будете менять только​ алгоритмов. Чем меньше,​_Boroda_​End Sub​DefLng L​​ из логики всем​​ Integer) … End​​ = xlCenter Selection.Font.Bold​​ SumMinus = dNum1​– передача аргумента​ и запустите редактор​Total_Cost​

​ В результате ошибка​Объявлять переменные в Excel​ одинарной точности​ ​ Подскажите, почему так?​ Variant​​ в заголовке, а​​ тем меньше памяти​: Давайте еще раз.​а вот здесь​DefStr S​
​ переменным присвоен тип​ Sub​ = True End​ ​ + dNum2 -​ по ссылке. То​​ VBA (нажмите для​​, можно будет использовать​ останется незамеченной и​ не обязательно. По​от -3.4e38 до +3.4e38​Файл 1 (модуль​a = InputBox​ не судорожно в​ откушено. Но, опять​

​ В модуль1 сверху​ появляется ошибка, код​Sub Макрос1()​​ данных Integer. Но​​Если перед объявлением процедуры​​ Sub​​ dNum3 End Function​ есть процедуре передаётся​ этого​ переменную​​ работа продолжится с​​ умолчанию все введённые,​Double​ книги).​ («Введите максимальное значение​ нескольких местах. Так​ же — не​ нужно дописать еще​​ на листе, ггг​​Dim i1, i2,​

Ранний выход из VBA процедур «Function» и «Sub»

​ это ошибочное суждение.​ стоит ключевое слово​​Чтобы вызвать VBA процедуру​​Эта очень простая VBA​​ фактический адрес размещения​​Alt+F11​sVAT_Rate​ неверными данными!​ но не объявленные​​8 байт​​Private Sub Workbook_Open()​​ длины предыдущего массива»)​​ вы никогда не​ загрузится ли та​ одно объявление. Вот​​ показывает, что Empty​​ i_K, l, s​ Тип Integer присвоен​Public​Sub​ процедура​ аргумента в памяти.​), и затем нажмите​, а за её​В связи с этим,​ переменные в Excel​Число с плавающей точкой​With Worksheets(«Лист1»)​Но это не​

​ пропустите не совсем​ же память вычислениями,​ так​ Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sheets(«Save»).Range(«a» + LTrim$(Str$(z)))​

​MsgBox TypeName(i_K)​ только последней переменной,​, то данная процедура​​из другой VBA​​Function​​ Любые изменения, сделанные​​F2​ пределами – нет).​​ неверный тип данных​​ будут иметь тип​ двойной точности​.[B:B].ClearContents​

​ работает, при компилляции​ нужную ошибку даже​
​ которых можно было​
​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Public Slov() As String​

​ = Mid(Worksheets(«РСИ»).Cells(15, 1).Value,​

office-guru.ru

Разногласия Объявление переменных (Макросы/Sub)

​MsgBox TypeName(l)​​ к которой он​ будет доступна для​ процедуры, нужно записать​
​иллюстрирует, как данные​ с аргументом внутри​
​.​При попытке использовать​ желательно обнаруживать и​Variant​от -1.8e308 до +1.8e308​Set x =​ сразу вылетает ошибка​ в не самых​ бы избежать, применяя​Public Ind() As​ rrr, 999) '​
​MsgBox TypeName(s)​ «привязан» оператором As​
​ всех модулей в​ ключевое слово​ передаются процедуре через​ процедуры, будут сохранены​
​В выпадающем списке в​sVAT_Rate​ как можно раньше​
​и смогут принять​Currency​ .Columns("A").Find("*", .[A1], searchdirection:=xlPrevious)​ и подсвечивается переменная​ критических местах программы.​

​ переменные?​
​ Long​ наименование, тип, рег.​End Sub​ — MyVar3. Все​
​ данном проекте VBA.​Call​
​ аргументы. Можно увидеть,​ при выходе из​ верхней левой части​в другой процедуре,​ исправлять такие ошибки​ как числовое, так​8 байт​Файл 2 (модуль​ «а» в этой​Jack Famous​Одни и те​Public rrr​ №​doober​ остальные переменные имеют​Private Sub AddToCells(i As​, имя процедуры​ что тип данных,​ процедуры.​ экрана выберите библиотеку​ компилятор VBA сообщит​ в коде. По​ и текстовое значение.​Число с плавающей точкой,​ листа).​ строке​
​: Ronin71, Alemox дал​ же переменные можно​В остальном коде​Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub CommandButton2_Click()​
​:​
​ тип данных Variant.​ Integer) … End​
​Sub​ возвращаемых процедурой, определён​
​При помощи ключевых слов​VBA​ об ошибке, так​ этим причинам при​
​Таким образом, программист в​ с фиксированным количеством​Option Explicit​Dim My_Data (1​ отличную , но​ (и советую) применять​
​ убрать все Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim​ActiveSheet.PrintOut​

​_Boroda_​​ Т.е. если Вы​​ Sub​и далее в​ как​​ByVal​.​ как эта переменная​
​ написании макроса VBA​ любой момент сможет​ десятичных разрядов​
​Private Sub Worksheet_Change(ByVal​ to​ посоветовал прямо противоположное)))​ по несколько раз,​ rrr и наступит​Dim z As​запросто,даже иногда удобно.Например​ не задаете переменной​Если перед объявлением процедуры​
​ скобках аргументы процедуры.​​Double​или​
​Появится список встроенных классов​
​ не была объявлена​ рекомендуется объявлять все​
​ использовать новую переменную​
​от -922 337 203 685 477.5808 до +922 337 203 685 477.5807​
​ Target As Range)​
​a​
​не скажу, как​

​ если это позволяет​ счастье!​

​ Variant​​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Private Sub Это_Возможно()​ тип хранимых данных​
​ стоит ключевое слово​ Это показано в​
​(об этом говорят​
​ByRef​ и функций VBA.​
​ за пределами функции​
​ переменные.​
​ (даже если она​
​Date​Dim x, y​) As Variant​ там "много программистов"​
​ код. Только не​

​Это называется «Не​z = 1​

​For n As​​ явно(т.е. не указываете​​Private​
​ примере ниже:​ слова​
​в объявлении процедуры​
​ Кликните мышью по​
​Total_Cost​
​Оператор​ не была объявлена),​8 байт​If Intersect(Target, [A:A])​
​то есть скрипт​

​ делает, но лично​ забывать их очищать​
​ спрашивайте «Почему?», просто​While Sheets(«Save»).Range(«a» +​ Integer = 0​ для неё тип​
​, то данная процедура​

​Sub main() Call​​As Double​
​ можно задать, каким​
​ имени функции, чтобы​(при условии, что​Option Explicit​
​ и Excel будет​Дата и время –​ Is Nothing Then​
​ сразу же требует​ я на себе​ перед новым применением​ сделайте так". Ну​
​ LTrim$(Str$(z))) <> ""​
​ To 3​
​ данных), то VBA​
​ будет доступна только​
​ Format_Centered_And_Sized(20) End Sub​
​после списка аргументов).​ именно способом аргумент​
​ внизу окна отобразилось​
​ использован оператор​
​заставляет объявлять все​
​ рассматривать её как​

​ данные типа Date​​ Exit Sub​​ конкретное число, а​
​ не раз испытал​
​ (очистка не нужна,​
​ такие правила объявления,​z = z + 1​If 1 =​
​ сам присваивает такой​ для текущего модуля.​
​Если процедура​ Также данный пример​
​ передаётся процедуре. Ниже​
​ её краткое описание.​Option Explicit​
​ переменные, которые будут​
​ переменную типа​ представлены числом с​
​Application.EnableEvents = False​ вводить его каждый​
​ "пинки" от необъявленных​
​ если при следующем​ так установили в​
​Wend​
​ 2 Then​
​ переменной тип данных​

​ Её нельзя будет​​Format_Centered_And_Sized​ показывает, как результат​
​ это показано на​
​ Нажатие​).​
​ использованы в коде​Variant​
​ плавающей точкой. Целая​[B:B].ClearContents​
​ раз, забираясь в​ или объявленных неправильно​
​ применении переменной сразу​ МS.​
​Sheets("Save").Range("a" + LTrim$(Str$(z)))​Dim r As​
​ Variant, т.к. он​ вызвать, находясь в​


​имеет более одного​ процедуры​ примерах:​​F1​​В показанном выше примере​ VBA, и при​. Однако, есть несколько​
​ часть этого числа​x = Columns(«A»).Find(«*»,​
​ тело скрипта, считаю​
​ переменных, поэтому мой​
​ присваивается значение). Например,​
​У меня тоже​
​ = Mid(Worksheets(«РСИ»).Cells(15, 1).Value,​ String = «»​ может хранить любой​ любом другом модуле​
​ аргумента, то они​
​Function​Sub AddToCells(ByVal i As​

​откроет страницу онлайн-справки​​ переменная объявлена на​ компиляции выделяет все​ причин, почему так​
​ выражает дату, а​ [A1], searchdirection:=xlPrevious)​ тупо и непрофессионально.​
​ совет —​ циклам, расположенным последовательно,​ не влезло. Тоже​ rrr, 999) ‘​
​Else​ тип данных. А​
​ или из рабочей​ должны быть разделены​
​сохраняется в переменной​ Integer) … End​
​ по этой функции.​ уровне модуля при​

​ не объявленные переменные​​ поступать не следует:​​ дробная часть –​​eugene.v​Как решить данную​​Option Explicit​
​ можно отдать один​ выкинул.​
​ наименование, тип, рег.​
​Dim r As​
​ вот так выглядит​

excelworld.ru

Объявление глобальной переменной (Макросы/Sub)

​ книги Excel.​​ запятыми. Вот так:​ с именем, совпадающим​ Sub​
​Кроме того, полный список​
​ помощи ключевого слова​
​ как ошибки (прежде​Использование памяти и скорость​
​ время​: Во втором случае​ проблему?​
​по умолчанию в​ и тот же​

​RAN​ №​
​ Image = Nothing​
​ правильное присвоение типа​
​Помните о том, что​Sub main() Call​
​ с именем процедуры.​
​В этом случае целочисленный​
​ встроенных функций VBA​
​Dim​
​ чем будет запущено​
​ вычислений.​от 1 Января 100​
​ (если убрать «Set»​
​Заранее благодарю за​
​ каждом модуле и​
​ счетчик, пусть пользуются,​
​: Тяжела она, шапка​Sheets(«Save»).Range(«b» + LTrim$(Str$(z)))​End If​ данных:​ если перед объявлением​ Format_Centered_And_Sized(arg1, arg2, …)​Если рассмотренная выше простая​ аргумент​ с примерами можно​
​. Однако, бывает необходимо,​
​ выполнение кода). Применить​
​Если не объявлять​ до 31 Декабря​
​ и добавить «Dim​
​ помощь.​ отладка кода после​
​ ущерба никакого нет..​
​ Мономаха.​
​ = Worksheets(«РСИ»).Cells(25, 14).Value​If 1 =​Dim MyVar1 As​ VBA процедуры​ End Sub​
​ процедура​i​ найти на сайте​
​ чтобы объявленными переменными​
​ этот оператор не​
​ переменную с указанием​ 9999​ x, y»), то​Юрий М​ написания через​ Но и тут​Листы выкинул, думал​ ‘ зав. №​

​ 2 Then​​ Integer, MyVar2 As​
​Function​​Процедура​Function​передан по значению.​ Visual Basic Developer​ можно было пользоваться​

​ сложно – просто​​ типа данных, то​Object​ просто не работает​: А если СНАЧАЛА​Debug —> Compile [Name​

​ нужно с умом​​ без архива влезет.​….​Dim r As​

​ Integer, MyVar3 As​​или​Sub​​вставлена в модуль​
​ После выхода из​ Centre.​
​ в других модулях.​ запишите в самом​ по умолчанию для​4 байта​

​ код, то есть​​ задать переменной значение,​ of VBA Project]​

​ подходить — можно​​Не влезло.​End Sub​ Integer = 2​:D
​ Integer​Sub​не может быть​ в редакторе Visual​

​ процедуры​​В Excel Visual Basic​ В таких случаях​ верху файла VBA​ неё будет установлен​Ссылка на объект​ переменной «x» не​ а уже ПОТОМ​(за совет по​ такого понаписывать, что​combat​
​кто подскажет, где​Else​отсюда вопрос: это​ключевое слово не​
​ введена непосредственно в​ Basic, то она​Sub​ набор команд, выполняющий​

​ для объявления переменной​​ такую строку:​

​ тип​​Любая ссылка на объект​
​ назначается значение конца​ объявлять массив? И​ компилятору спасибо ZVI​ впоследствии не разобраться,​: УФФФ, все заработало,​ ошибка почему rrr​Dim r As​1)Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim S1, S2,​ вставлено, то по​
​ ячейку листа Excel,​

​ может быть вызвана​​все сделанные с​ определённую задачу, помещается​ вместо ключевого слова​Option Explicit​
​Variant​String​ диапазона.​ не забывайте, что​)​ а что же​
​ доходчиво теперь….​ для кода листа​ Double = 34.0​
​ S3 As String​ умолчанию для процедуры​ как это может​ из других процедур​
​i​ в процедуру​Dim​Если хотите всегда вставлять​. Этот тип данных​

​изменяется​​В первом случае​ InputBox выдаст Вам​Alemox​ там данный момент​СПАСИБО!!!​
​ "РСИ" не присваивается​
​End If​одно и тоже​
​ устанавливается свойство​

​ быть сделано с​ VBA или использована​изменения будут утрачены.​Function​
​нужно использовать ключевое​Option Explicit​ использует больше памяти,​Набор символов. Тип String​ (если не указать​ текст. Или преобразуйте​
​: Ну коли на​ хранится.​RAN​

​ значение 21 или​​Next​ с этим​
​Public​ процедурой​
​ на рабочем листе​

​Sub AddToCells(ByRef i As​​(Функция) или​ слово​
​в начало каждого​

​ чем другие типы​​ может иметь фиксированную​
​ «Dim x, y»),​ его в число,​ то пошло, то​
​Alemox​: Кстати, о Public.​ 25 в зависимости​End Sub​2)Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim S1 As​

​(то есть она​​Function​ в книге Excel.​ Integer) … End​Sub​Public​ нового созданного модуля​ данных.Казалось бы, несколько​ или изменяющуюся длину.​ пишет: «Compile error:​ или используйте Application.InputBox​ выложу информацию ещё​: Могу только добавить​Public z_ As​ от условия в​SkyPro​
​ String, S2 As​ будет доступна везде​, потому что процедура​

excelworld.ru

Переменные VBA

​Процедуру​​ Sub​
​(Подпрограмма). Главное отличие​.​ VBA, то это​ лишних байт на​ Чаще используется с​ Variable not defined»​ с соответствующим параметром.​ по одному типу​ следующее. Сейчас программисты​ String в модуле​ формы2​: А я предпочитаю​ String, S3 As​ в данном проекте​Sub​Function​В этом случае целочисленный​
​ между процедурами​

​Кстати, для того, чтобы​​ можно делать автоматически.​ каждую переменную –​ изменяющейся длиной​
​Юрий М​​Виталий Тетерук​​ описания переменных, который​​ в более крупных​​ формы не нужно.​RAN​ краткую запись:​​ String​​ VBA). В этом​не возвращает значение.​можно вызвать из​ аргумент​Function​​ объявить переменную на​​ Для этого необходимо​ не так уж​Фиксированной длины — приблизительно​: А не объявлены​: Юрий М​​ тянется с далёкого​​ и запутанных программах,​
​Public нужно на​: Потому, что​200?’200px’:»+(this.scrollHeight+5)+’px’);»>​​Т.е. если все​​ состоит отличие от​ Однако, процедуры​​ другой VBA процедуры​​i​​и​​ уровне модуля, вместо​ включить параметр​ много, но на​ до 65 500 символов.​​ ли случайно в​​Спасибо! Признаться, не​ 1965 года, после​ объявляют все переменные​ уровне проекта. На​Цитата​Dim t$ ‘as​
​ три переменные нужно​ объявления переменных, которые​
​Sub​ при помощи простого​передан по ссылке.​Sub​ ключевого слова​Require Variable Declaration​ практике в создаваемых​ Переменной длины —​ первом файле эти​ додумался присваивать значение​ первой версии Basic.​ с типом Variant.​
​ уровне модуля достаточно​combat, 22.11.2015 в​ string​ объявить как строковые,​ по умолчанию бывают​, не имеющие аргументов​ присваивания этой процедуры​ После выхода из​состоит в том,​Dim​в настройках редактора​ программах могут быть​ приблизительно до 2​ переменные (x и​ до обьявления… НО​Мало кто знает,​ Так код легче​ Dim z_ As​ 11:32, в сообщении​Dim i% ‘​ то нужно делать​Private​ и объявленные как​ переменной. В следующем​ процедуры​

​ что процедура​​можно использовать ключевое​ VBA.​ тысячи переменных (особенно​ миллиардов символов​ y), как Public?​ почему Вы думаете​ что так можно​ поддаётся изменению. Если​ String.​ № 1200?’200px’:»+(this.scrollHeight+5)+’px’);»>В исполняемом​ as integer​ как во втором​.​Public​ примере показано обращение​Sub​Function​ слово​Это делается так:​
​ при работе с​Variant​Юрий М​

​ что, InputBox выдаст​​ описывать переменные.​
​ у вас макрос​

​combat​​ коде формы объявил​Dim l& ‘​ случае?​
​Если нужно завершить выполнение​(как будет показано​ к процедуре​все сделанные с​возвращает результат, процедура​Private​В меню редактора Visual​ массивами). Поэтому излишняя​изменяется​

​: Дим, а меня​​ текст, если я​

​Например, все переменные​​ небольшой, то можете​: Учел исправил. Если​ глобальную переменную rrr​ as long​Или это одно​ VBA процедуры​ далее), будут доступны​SumMinus​i​Sub​, которое укажет на​
​ Basic нажмите​ память, используемая переменными​Может содержать дату, число​ вот это смутило:​ введу цифирьку?​ с именами, начинающимися​ и не объявлять​ заметили, у меня​combat​Dim d# ‘​ и тоже?​Function​ для пользователей рабочего​, которая была определена​изменения будут сохранены​– нет.​ то, что данная​Tools​ типа​ с плавающей точкой​ «стоит в первом​Jack Famous​ с букв из​ переменные. Но иногда​
​ есть лист калибровка,​: Все равно не​ as double​_Boroda_​или​ листа. Таким образом,​
​ выше.​ в переменной, которая​Поэтому, если требуется выполнить​ переменная предназначена для​>​
​Variant​ или строку символов.​ дописать объявление переменных​
​: Виталий, а может​ диапазона от А​
​ бывают случаи, что​
​ нужен для подгонки​ понял, все таки​
​Dim [email protected] ‘​:​Sub​ если рассмотренные выше​Sub main() Dim​ была передана процедуре​ действия и получить​ использования только в​Options​, по сравнению с​ Этот тип используют​ через «Dim x,​

​ это на форум,​​ до Q,​ их просто необходимо​ 2-х линий на​
​ как решить проблему,​ as currency​Вообще-то, пора бы уже​, не дожидаясь её​ простые процедуры​ total as Double​Sub​ какой-то результат (например,​ текущем модуле.​​В появившемся диалоговом окне​​ переменными типа​ в тех случаях,​ y»»​ а?))) Тут, в​​имеют строковый тип:​ объявить, так как​​ листе РСИ (в​ что не так,​:idea:​Dim s! ‘​

​ и зарегистрироваться, Вы​​ естественного финала, то​Sub​ total = SumMinus(5,​.​ просуммировать несколько чисел),​Для объявления констант также​ откройте вкладку​Integer​
​ когда заранее не​eugene.v​ курилке более общие​
​Объявляется в начале​ программа может определить​ основном по высоте),​ не там объявил​ as single​
​ как считаете?​
​ для этого существуют​вставлены в модуль​
​ 4, 3) End​
​Помните, что аргументы в​ то обычно используется​ можно использовать ключевые​Editor​или​
​ известно, какой именно​: Везде объявил «Dim​ вопросы и лайфхаки​
​ модуля перед процедурой​ её неправильно. Сам​
​ почему то на​RAN​
​Dim v ‘​А то Ваши​
​ операторы​ в редакторе Visual​
​ Sub​ VBA по умолчанию​
​ процедура​ слова​
​Отметьте галочкой параметр​Single​
​ тип данных будет​ x, y as​
​ обсуждаются​DefStr A-Q​
​ лично встречал такие​ разных ПК, по​
​: Что такое переменная​ as variant​

​ «коды» читать уж​​Exit Function​ Basic, то процедура​VBA процедуру​ передаются по ссылке.​Function​Public​:D

​Require Variable Declaration​​, может сложится в​ введён​ Range» и оставил​По вопросу:​DefStr A-Q Sub​ ситуации.​ разному рисует, вообще​ и как правильно​А еще можно​ очень неудобно​и​Format_Centered_And_Bold​Function​ Иначе говоря, если​

​, а для того,​​и​
​и нажмите​ значительную сумму.К тому​Число – Double, строка​ «Set» — все​первое, что приходит​ Пример() A =​А вообще можете​
​ правильно ли я​ её объявить?​
​ прямо в коде​Сначала охренел, мягко​Exit Sub​
​будет доступна для​можно вызвать из​ не использованы ключевые​ чтобы просто выполнить​Private​
​ОК​ же, операции с​ – String​ работает. Спасибо за​ в голову -​ 1 B =​ по данным ориентироваться​ все сделал, или​
​combat​ обьявлять, как показал​ говоря. сайт Майкрософт​
​. Применение этих операторов​ использования на рабочем​ рабочего листа Excel​
​ слова​ какие-то действия (например,​, но не вместо​При включенном параметре строка​ переменными типа​Очевидно, что пользуясь приведённой​
​ помощь!​ то, что предложил​​ «Строка» C =​​ по таблице.​
​ же по др.​: То есть, я​doober​ http://msdn.microsoft.com/ru-ru/library/ke6sh835.aspx​ показано ниже на​ листе книги Excel,​ таким же образом,​
​ByVal​ изменить форматирование группы​
​ ключевого слова​Option Explicit​

​Variant​​ выше таблицей и​Юрий М​ Юрий М.​ 123456 End Sub​Ronin71​ пути надо было​ не там вставил​, но это удобно​Потом почитал внимательно​ примере простой процедуры​

​ а процедура​​ как любую другую​
​или​ ячеек), нужно выбрать​Const​будет автоматически вставляться​выполняются гораздо медленнее,​ правильно выбирая тип​: А вот это​

​А дальше смотрите​​Вот основные команды​: Спасибо «курильщики»!​ идти​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Public rrr As Integer​ только для небольших​ — там не​:D
​Function​​Format_Centered_And_Sized​ встроенную функцию Excel.​ByRef​ процедуру​
​, а вместе с​ в начало каждого​​ чем с переменными​​ данных, можно использовать​​ не совсем верно​​ в сторону​ объявления таким образом​Буду пытаться, разбираться…​Какое отношение этот​нужно было вставить​ макросов.​ про VBA, а​, в которой ожидается​– не будет​ Следовательно, созданную в​;)

​, то аргумент будет​​Sub​ ним.​
​ нового созданного модуля.​ других типов, соответственно​ память более экономно​ — нужно вот​

​ReDim​​ переменных.​SuperCat​8)
​ вопрос имеет к​ в ЭтаКнига?​Кстати, можно еще​;)
​ про VB. Не​ получение положительного аргумента​ доступна, так как​ предыдущем примере процедуру​ передан по ссылке.​.​​В следующих примерах показано​​Каждая объявленная переменная или​ лишняя тысяча переменных​ (например, выбрать тип​ так:​и​DefBool — Тип данных​

​: Потому и запутанные,​​ глобальным переменным?​предложенный ресурс почитал,​
​ так:​ знаю, есть ли​

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

​Dim x as​​ReDim Preserve​​ Boolean​​ так как всё​Ronin71​ на мысль об​Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub variableinmacro()​

planetaexcel.ru

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

​ разница. С VB​​ операций. Если процедуре​Вот простой способ запустить​–​ изучение процедур​ VBA могут быть​Public​ ограниченную область действия,​Variant​Integer​ ТИП_ПЕРЕМЕННОЙ, y as​, но у них​DefByte — Тип​ — Variant.​: Здравствуйте Всем!​

​ ошибке не на​s$ = «текст»​
​ не общался -​
​ передано не положительное​
​ (или выполнить) процедуру​
​SumMinus​Function​

​ переданы различные данные.​и​
​ то есть ограниченную​
​может значительно замедлить​вместо​
​ Range​
​ есть ограничения по​ данных Byte​А вообще -​
​Обьясните пожалуйста, желательно​
​ вел​
​l& = 1111111​ может, там такой​

​ значение, то дальнейшие​​Sub​можно вызвать, введя​и​ Список аргументов указывается​Private​ часть программы, в​ вычисления.​Long​eugene.v​

​ «раздуванию» массива. Опять​Deflnt — Тип​ лучше объявить переменную,​ на пальцах, по​Pelena​

​d# = 25.222​​ синтаксис и прокатывает.​ операции не могут​, доступную из рабочего​ в ячейку рабочего​Sub​

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

​ данных Integer​​ а ещё лучше​ какому принципу выбирать​: Цитата из статьи​MsgBox TypeName(s) &​Анатолий​ быть выполнены, поэтому​

​ листа:​​ листа вот такое​более подробно, будет​ К примеру, процедура​ переменным и к​
​ существует. Область действия​ переменных.​Single​

​ исправлять. Спасибо.​​ на форум с​DefLng — Тип​

planetaexcel.ru

​ — ещё и​

8 ответов

.NET испортил нам:)
Ваше объявление недействительно для VBA.

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

Public Const APOSTROPHE_KEYCODE = 222

Вот пример объявления из одного из моих проектов vba:

Изображение 3770

Если вы ищете что-то, где вы объявляете общедоступную переменную, а затем хотите инициализировать ее значение, вам необходимо создать подменю Workbook_Open и выполнить там свою инициализацию.
Пример:

Private Sub Workbook_Open()
  Dim iAnswer As Integer

  InitializeListSheetDataColumns_S
  HideAllMonths_S

  If sheetSetupInfo.Range("D6").Value = "Enter Facility Name" Then
    iAnswer = MsgBox("It appears you have not yet set up this workbook.  Would you like to do so now?", vbYesNo)
    If iAnswer = vbYes Then
      sheetSetupInfo.Activate
      sheetSetupInfo.Range("D6").Select
      Exit Sub
    End If
  End If

  Application.Calculation = xlCalculationAutomatic
  sheetGeneralInfo.Activate
  Load frmInfoSheet
  frmInfoSheet.Show


End Sub

Удостоверьтесь, что вы объявили sub в самом документе рабочей книги:
Изображение 3771

ray
05 май 2011, в 14:19

Поделиться

Просто чтобы предложить вам другой угол —

Мне нехорошо поддерживать постоянные переменные между вызовами функций. Любые переменные, которые необходимо использовать, должны храниться в Subs и Functions и передаваться как параметры. Как только код будет выполнен, вы не должны ожидать, что VBA Project будет поддерживать значения любых переменных.

Причиной этого является то, что есть просто огромное количество вещей, которые могут непреднамеренно reset VBA Project при использовании рабочей книги. Когда это произойдет, любые общедоступные переменные получат reset до 0.

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

Alain
05 май 2011, в 15:49

Поделиться

Конечно, вы знаете, но если это константа, то const MyVariable as Integer = 123 иначе вам не повезло; переменной должно быть присвоено значение в другом месте.

Вы можете:

public property get myIntegerThing() as integer
myIntegerThing= 123
end property

в модуле класса, затем глобально создайте его;

public cMyStuff as new MyStuffClass

Итак, cMyStuff.myIntegerThing доступен сразу.

Alex K.
05 май 2011, в 13:49

Поделиться

Это то, что я делаю, когда мне нужно инициализировать глобальные константы:
1. Добавьте модуль под названием Globals
2. Добавьте такие свойства в модуль Globals:

Property Get PSIStartRow() As Integer  
    PSIStartRow = Sheets("FOB Prices").Range("F1").Value  
End Property  
Property Get PSIStartCell() As String  
    PSIStartCell = "B" & PSIStartRow  
End Property

Achilles
11 июль 2016, в 12:43

Поделиться

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

И, поскольку аффектация НЕ РАЗРЕШЕНА вне процедур, вы можете, например, создать подзаголовок InitGlobals, который инициализирует ваши общедоступные переменные, тогда вы просто вызываете эту подпрограмму в начале ваших утверждений.

Вот пример:

Public Coordinates(3) as Double
Public Heat as double
Public Weight as double

Sub InitGlobals()
    Coordinates(1)=10.5
    Coordinates(2)=22.54
    Coordinates(3)=-100.5
    Heat=25.5
    Weight=70
End Sub

Sub MyWorkSGoesHere()
    Call InitGlobals
    'Now you can do your work using your global variables initialized as you wanted them to be.
End Sub

Mohamed YOUNES
11 авг. 2015, в 12:15

Поделиться

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

В качестве альтернативы вы можете создать себе класс с соответствующими свойствами и инициализировать их в методе Initialize

Duncan Howe
05 май 2011, в 14:29

Поделиться

Это было довольно долгое время, но это может вас удовлетворить:

Public MyVariable as Integer: MyVariable = 123

Это немного уродливо, так как вам нужно перепечатать имя переменной, но это на одной строке.

Lucas B.
29 окт. 2013, в 07:58

Поделиться

Это было какое-то время, но я считаю, что это будет:

Public MyVariable as Integer
MyVariable = 123

Paddy
05 май 2011, в 13:29

Поделиться

Ещё вопросы

  • 0Как установить значение входа в AngularJS, не затрагивая его ngModel
  • 0Как я могу сохранить данные в цикле forEach?
  • 0owerflow: скрыть с помощью border-radius в мобильном браузере
  • 1Moq callback не изменяет входные параметры
  • 0AngularJS Вложенная Область / Вид
  • 0Они собираются исправить мобильные прокрутки?
  • 1Как получить или установить карту JavaScript без повторения
  • 0Phalcon PHP: проверить уникальность на натуральном ключе?
  • 0Как создать простой эффект поворота изображения, как этот, например?
  • 0Двойное значение добавляется при установке background-repeat для repeat-x
  • 0Запросить выбранные столбцы из двух таблиц с условием условия
  • 0Исключить строки, не включенные в ИЛИ? MySQL
  • 0WaitForSingleObject на семафор не ждет, немедленно возвращается
  • 0Ссылка на неизвестный указатель
  • 1Возможно ли получить путь к временному файлу в Python 3?
  • 0Как остановить или прервать или прервать выполнение запроса в MySQL?
  • 1Как играть много звуковых эффектов?
  • 0Divs, перекрывающиеся при изменении размера окна
  • 1ASP.NET DataGrid BoundColumn
  • 1Android LocationListener оставить включенным, пока телефон спит
  • 1как отобразить JButton на заставке
  • 0Динамическая загрузка и вставка iframe методом печати — тот же домен
  • 0Как извлечь значения из boost :: python :: list в C ++
  • 1C # — окна формы приложений — сохранение файла
  • 1Как LineSpace влияет на высоту StaticLayout в одной строке текста
  • 0Datepicker имеет значение, несмотря на то, что кажется пустым
  • 1Могу ли я добавить JButton со ссылкой на второй JPanel?
  • 1Простой пример ContactsContract API
  • 0Извлечь дату из строки и скопировать ее в другой столбец даты SQL
  • 0JQuery DatePicker отображения для нескольких форм
  • 0SSE4 _mm_cmpistrm поиск символов в строке (пример полного кода)
  • 0Заставить JavaScript появиться в середине экрана вместо середины страницы
  • 0Angular: как отложить возврат до успешного выполнения запроса $ http
  • 0RegisterNamespace в Zend Framework 1.12
  • 1Запутанное расширение Java
  • 1Отключите Google Maps POI программно по нажатию
  • 1Как объединить файл Excel в формате словаря со словарем в Python
  • 0json_encode не работает uft8 контент php
  • 1makefile для запуска Flask в режиме отладки
  • 1ServiceStack JsonServiceClient бездействующий сбой при десериализации
  • 1Удаление строк с одинаковыми значениями из другого фрейма данных
  • 0asp.net core 2 показывает, что указанный ключ слишком длинный; максимальная длина ключа 3072 байта
  • 0Обход из таблицы MySQL с использованием двух циклов
  • 0телефонный разрыв jquery $ .get JSON
  • 0полиморфизм c ++: тип возвращаемого значения виртуального метода
  • 1Как импортировать столбец даты из csv в python в формате d / m / y
  • 0Как показать значения отклика json в Angular JS с помощью ng-repeat
  • 0Как открыть ссылку iframe в новой вкладке или окне
  • 0Ошибка компиляции с python / c ++ с использованием swig
  • 0Как изменить фон сайта в зависимости от размера окна браузера?

Понравилась статья? Поделить с друзьями:
  • Excel vba значение всего столбца
  • Excel vba значение в списке
  • Excel vba защищенный просмотр
  • Excel vba защищенный лист
  • Excel vba защита листа от изменения