Хитрости »
1 Май 2011 51622 просмотров
Option Explicit — начинающие программировать в Visual Basic могут увидеть данную строку в чужом коде, либо случайно в своем. Хотя кто-то может быть уже знает, что это и зачем и использует данное объявление намеренно. Я же постараюсь максимально подробно описать смысл этой строки и её полезность для кода в первую очередь для тех, кто еще не знает для чего она.
Строка данная записывается в самом начале модуля, самой первой строкой. Перед этой строкой ничего более не может быть записано, кроме, разве что других подобных строк(есть еще другие :-))
Собственно что же делает эта строка? А делает она следующее: она принуждает Вас объявлять переменные(если не знаете смысл объявления переменных — читайте здесь). Если какая-либо переменная внутри выполняемой процедуры не объявлена — Вы увидите такое вот сообщение:
рис.1
так же редактор VBA выделит ту переменную, которая не объявлена. Первое время это может раздражать. Да и вообще: зачем это? Вы и без всех этих объявлений неплохо жили. А вот зачем
- во-первых: объявление переменных считается хорошим тоном при программировании
- во-вторых: правильное присвоение типов недурно экономит память
- ну и в-третьих(я бы даже сказал в главных): это помогает избежать неявных ошибок кода при несовпадении типов данных
А теперь перейдем к сути и попробуем разобраться в чем же польза от использования Option Explicit. Ниже приведен простой код:
Sub Check_Variables() Dim a As String a = "Привет от www.excel-vba.ru" MsgBox а, vbInformation End Sub
Выполните данный код без строки Option Explicit. Какое значение выдаст MsgBox? Ничего. Что за странность? Ведь явно видно, что переменной присвоено значение текста. Ничего больше не происходит. Но переменная все равно пуста. Мистика…А теперь запишите первой строкой в модуле Option Explicit:
Option Explicit Sub Check_Variables() Dim a As String a = "Привет от www.excel-vba.ru" MsgBox а, vbInformation End Sub
Запустите код. И что же видите? Видите сообщение, показанное на рис.1 и выделенную переменную «а», в последней строке. Что это означает? Это означает, что переменная «а» у нас не объявлена. А все потому, что первой строкой (Dim a As String) я объявил переменную на английском языке, а в последней строке я записал её на русском. А для кода это разные символы. Если разглядеть логику работы VBA — первую «а» он видит как переменную с присвоенным типом String. И ей мы задаем значение «Привет от www.excel-vba.ru». А вторую…Вторую он не находит в объявленных переменных, не находит в функциях и сам инициализирует её как новую переменную с типом данных Variant. И, что вполне логично, со значением Empty, т.е. ничего, т.к. этой переменной мы никаких значений не присваивали.
Еще один классический пример, когда Option Explicit спасет от лишних мозговых штурмов. Имеем простую функцию пользователя(UDF), которая берет указанную дату и возвращает её в заранее заданном формате в текстовом виде:
Function GetDateAsText(Optional ByVal Дата As Date) If Дата = 0 Then Дата = Date End If GetDataAsText = Format(Дата, "DD MMMM YYYY") End Function
Хоть функция и короткая, но даже в ней не сразу порой бросается в глаза опечатка(представим, если функция в реальности строк на 200). В итоге чаще всего автор функции не понимает, почему при записи её на листе она возвращает не дату вида «21 мая 2016», а 0 и начинает пошагово выполнять функцию, искать ошибки в логике кода и т.д. Но если поставить в начало модуля Option Explicit, то при первом же выполнении этой функции VBA подсветит нам «GetDataAsText = «, указывая тем самым, что GetDataAsText в чем-то отличается от заданного имени функции — GetDateAsText. Банальная опечатка: GetDataAsText — GetDateAsText.
А теперь представьте себе, что Вы написали кучу длинного кода, строк на 100 или более. Конечно, Option Explicit Вы не используете. И вот Вы тестируете код, но он работает как-то не так…Где-то что-то неверно выполняется. И Вы начинаете пошагово ковыряться в листинге и искать ошибку…А ведь все может быть и проще: где-то в коде Вы могли банально опечататься и присвоить таким образом значение переменной, на которую Вы и не рассчитывали. А если использовать Option Explicit, то такая опечатка будет сразу обнаружена еще до выполнения кода и, что немаловажно — подсвечена. Так что Вам даже не придется её искать, а останется лишь исправить ошибку.
Так же эта строка поможет избежать неявных ошибок и в других ситуациях. В частности, при обращении к другим приложениями(Word, Outlook и т.д.). Например, в Excel применяются именованные константы для многих задач. Одна из распространенных — поиск последней ячейки в столбце: llast = Cells(Rows.Count, 1).End(xlUp).Row
здесь xlUp является именованной константой, значение которой равно числу: -4162. В других приложениях такой же подход. Это избавляет от необходимости помнить на память все значения констант и обращаться к ним при помощи intellisense. Но действуют эти константы исключительно внутри своего приложения(можете обратить внимание, у Excel константы начинаются с xl, а у Word — с wd). И т.к. объявлены эти константы в других приложениях — Excel про них не знает(как и другие приложения не знают про константы Excel). Для примера возьмем простой и рабочий код замены в Word:
Dim wdDoc As Object Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
Где wdFindContinue для Word-а равно 1, а wdReplaceAll = 2. Но это происходит только при выполнении изнутри самого Word-а(или при раннем связывании через Tools —References. Подробнее про это можно почитать в статье: Как из Excel обратиться к другому приложению).
Если же скопировать и выполнять данный код из Excel, то работать он будет не так как задумали. Дело в том, что Вы считаете, что Excel работает с обозначенными константами(wdFindContinue, wdReplaceAll) наравне с Word-ом. Но Excel на самом деле про них ничего не знает. И если директива Option Explicit будет отключена, то Excel просто назначает им значение по умолчанию — Empty. Которое преобразуется в 0. А это совсем иной поиск получается, т.к. должны быть значения 1 и 2. А если бы Option Explicit была включена, то Excel выделил бы их и указал, что они не объявлены. И тогда можно было бы сделать либо так:
Dim wdDoc As Object Const wdFindContinue As Long = 1 Const wdReplaceAll As Long = 2 Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
либо так(что удобнее, на мой взгляд):
Dim wdDoc As Object Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = 1 .Execute Replace:=2 End With
Так что думаю, не стоит недооценивать значимость строки Option Explicit при написании кодов. В довершение хотелось бы Вас обрадовать, что вписывание данной строки в начало каждого модуля можно сделать автоматическим: поставить в опциях редактора галочку: Tools—Options-вкладка Editor—Require Variable Declaration. Теперь во всех новых созданных модулях строка Option Explicit будет создаваться самим редактором VBA автоматически. К сожалению, в уже имеющихся модулях Вам придется проставить данную строку самим вручную. Но это того стоит, поверьте.
Так же см.:
Что такое переменная и как правильно её объявить?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Home / VBA / How to use Option Explicit Statement in VBA
KEY POINTS
- Option Explicit forces you to declare all the variables.
- It’s a statement that you can use at the start of a module.
- You can enter it manually or activate it from the options.
- You need to use Option Explicit only once.
- It also helps you to identify typing errors while using variables.
What is VBA Option Explicit
Option Explicit is a statement that you can use at the beginning of a module to force yourself to declare all the variables. When you add this statement, VBA shows you a compile error when you execute the code and also highlights the variable in the code that you need to declare.
When you add an option explicit at the beginning of a module, VBA adds a separator line below it, and then you can start writing a procedure. And when you have the option explicit statement, and you run a procedure, VBA checks if there is a variable that is not declared and shows you an error message.
Option Explicit
Sub myMacro()
a = 50
MsgBox a
End Sub
Above is the message that you get when a variable is not declared.
Activate Option Explicit in VBA
To activate the option explicit statement in a module, use the following steps.
- First, open the Visual Basic Editor and in the tools menu click on the options.
- After that, in the options in, go to the editor tab and tick mark “Require Variable Declaration”.
- In the end, click OK.
- Once you do that, VBA will add option explicit whenever you add a new module.
But it doesn’t add this statement to your existing module, so you need to add them manually to each of the existing modules one by one.
How to Add it Manually?
As I mentioned the Option Explicit statement must go before the first procedure in the module (Sub or Function). So, you need to add this statement above the first procedure (General Declarations area) and make sure to add it only once.
If you add it within a procedure, or between two procedures, VBA will show you an error when you try to execute any of the code in the module.
Examples (Why using Option Explicit Statement is a Good Habit)
Let me show you an example to make you understand why the Option Explicit statement is highly recommended to use. Look at the following code.
Sub myMacro()
Dim myText As String
myText = "Puneet"
MsgBox MyTxt
End Sub
In this code, I have declared a variable “myText” as a string and then defined the value of this variable. And in the end, I used a message box that shows the value of the variable, but if you look carefully I have miss-spelled that variable as “MyTxt” instead of “myText”.
Now when I run this code, it shows me a blank message box.
I need your 2 minutes to help you understand the real problem here.
When I mistyped the variable name, VBA takes it as a separate variable, and as I am not using the option explicit statement, it doesn’t show me an error.
That is why the message box uses the second variable (mistyped) which has no value assigned to it. Now think for a second; if you are writing a lengthy code and not using option explicit statement, it will be hard for you to trace down this error until you reread the entire code.
But with the option explicit statement ON, when I run this code, it shows an error.
Option Explicit
Sub myMacro()
Dim myText As String
myText = "Puneet"
MsgBox MyTxt
End Sub
title | keywords | f1_keywords | ms.prod | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|
Option Explicit statement (VBA) |
vblr6.chm1008808 |
vblr6.chm1008808 |
office |
f7871e28-9577-740b-e887-1109f52be30e |
12/03/2018 |
medium |
Used at the module level to force explicit declaration of all variables in that module.
Syntax
Option Explicit
Remarks
If used, the Option Explicit statement must appear in a module before any procedures.
When Option Explicit appears in a module, you must explicitly declare all variables by using the Dim, Private, Public, ReDim, or Static statements. If you attempt to use an undeclared variable name, an error occurs at compile time.
If you don’t use the Option Explicit statement, all undeclared variables are of Variant type unless the default type is otherwise specified with a Deftype statement.
[!NOTE]
Use Option Explicit to avoid incorrectly typing the name of an existing variable or to avoid confusion in code where the scope of the variable is not clear.
Example
This example uses the Option Explicit statement to force explicit declaration of all variables. Attempting to use an undeclared variable causes an error at compile time. The Option Explicit statement is used at the module level only.
Option Explicit ' Force explicit variable declaration. Dim MyVar ' Declare variable. MyInt = 10 ' Undeclared variable generates error. MyVar = 10 ' Declared variable does not generate error.
See also
- Data types
- Statements
[!includeSupport and feedback]
Return to VBA Code Examples
Declaring Option Explicit at the top of your code module tells VBA to require that you declare all the variables which you are using in the code. If this command is omitted, you can use variables which you haven’t declared. We recommend using the Option Explicit at the top of your module, as it helps you to avoid mistyping of the variables.
Using VBA Variables without Option Explicit
We will first show the example of the code when there is no Option Explicit command. Here is the code:
Private Sub ExampleWOOptionExplicit()
Dim strTextA As String
strTextA = "Testing VBA without Option Explicit"
MsgBox strTextA
End Sub
In the example, we declared the variable strTextA in the first row of the procedure and assigned it the text. After that, we want to return the message box with the value of strTextA. Here is the result when we run the code:
Image 1. The code without Option Explicit
As you can see in Image 1, the code is successfully executed. The message box with the value from strTextA appeared, even though we didn’t declare variable strTextA. Here there is no problem with the code, but what if we had misspelled the variable name:
MsgBox strTxtA
Here we wrote strTxtA (without an “e”) instead of strTextA. As a result we get a blank message box, because the variable strTxtA was not defined. Now we will see how to use Option Explicit to prevent errors.
Using the Variables with Option Explicit
If you want to prevent using variables that are not declared, you have to enter Option Explicit at the top of your module:
Option Explicit
Here is the complete code, including the typo:
Option Explicit
Private Sub ExampleWithOptionExplicit()
Dim strTextA As String
strTextA = "Testing VBA without Option Explicit"
MsgBox strTxtA
End Sub
Let’s see what happens if we run the code:
Image 2. The code with Option Explicit
As a result, we get the error “Variable not defined”, because we didn’t declare the strTxtA variable.
Adding Option Explicit at the top of your code modules helps prevent errors from misspelled variables.
If you want to learn more about VBA other VBA options, learn about how to make VBA case-insensitive: Prevent VBA Case Sensitive
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
- Информация о материале
- Категория: Основы VBA
-
Опубликовано: 08 октября 2012
В предыдущей статье уже рассматривались способы явного и неявного объявления переменных, но стоит отдельно обратить внимание на такую команду VBA, как Option Explicit. Не смотря на то, что неявное объявление переменных простым их использованием удобно, с ним могут быть связаны определенные проблемы. При неявном объявлении переменной существует риск случайно создать новую переменную, когда необходимо использовать уже существующую. Такая ситуация может приводить к ошибкам, которые очень сложно выявлять. Использование оператора Dim для объявления переменных не всегда помогает предотвращать ошибки в коде, относящиеся к неявному объявлению переменных.
Для того, чтобы было проще обнаруживать ошибки, связанные с неявным объявлением переменных, в VBA предусмотрена команда Option Explicit. Использование Option Explicit препятствует неявному объявлению переменных, при этом VBA требует объявления всех переменных с использованием оператора Dim. Такие команды, как Option Explicit, называются директивами компилятора и инструктируют VBA о специфических правилах, которым должен следовать VBA при компиляции исходного кода. Option Explicit действует только в пределах модуля, в котором она прописана.
Для того чтобы установить режим Option Explicit, при котором VBA требует явного объявления всех переменных в модуле, необходимо добавить команду Option Explicit в начало модуля, перед любыми объявлениями переменных.
Option Explicit 'требование явного объявления переменных в модуле Dim HelloMsg 'переменная будет использоваться всеми процедурами модуля Sub HelloWorld() HelloMsg="Hello, World!" MsgBox HelloMsg,, "Окно приветствия" End Sub
Если добавить неявное объявление переменной в этот модуль, VBA отобразит ошибку времени исполнения, сообщая о том, что переменная является необъявленной.
Редактором Visual Basic предусмотрена возможность автоматически включать Option Explicit в каждый новый модуль при его создании. Для этого необходимо в редакторе VB зайти в меню Tools/Options и в диалоговом окне «Options» на вкладке «Editor» поставить флажок перед опцией Require Variable Declaration (явное описание переменных).