Names in Excel VBA – Explained with Examples!
Names in Excel VBA makes our job more easier. We can save lot of time using Names. It is easy to maintain the formulas, Cells,Ranges and Tables. You can define the names once in the workbook and use it across the workbook. The following examples will show some of the Names daily operations.
- Adding Names in Excel VBA
- Deleting Names in Excel VBA
- Hide UnHide Names in Excel VBA
Adding Names in Excel VBA:
Sometimes you may need to Add name to a particular range in excel worksheet. We can manage range names in excel vba with using names collection.
- Solution
- Code
- Output
- Example File
Adding Names in Excel VBA – Solution(s):
We can use Names.Add method or Name property of a range for adding names in excel VBA.
We can create range name in the following way. It contains several properties.We must define Name and the Refers To property.please find the following example.The following code creates a name “MyData” and referring to sheet1 of a range(“$A$1:$E$10”)
Code:
'Naming a range Sub sbNameRange() 'Adding a Name Names.Add Name:="myData", RefersTo:="=Sheet1!$A$1:$E$10" 'OR 'You can use Name property of a Range Sheet1.Range("$A$1:$E$10").Name = "myData" End Sub
Output:
Instructions:
- Open an excel workbook
- Press Alt+F11 to open VBA Editor
- Double click on ThisWorkbook from Project Explorer
- Copy the above code and Paste in the code window
- Press F5
- GoTo Sheet1 and Select Range A1 to D10
- You should see the following example
Example File
Download the example file and Explore it.
Analysistabs – Adding Name to Range in excel Workboobk
Deleting Names in Excel VBA:
Sometimes you may need to Delete range name in existing excel workbook for cleaning broken references in excel workbook.
- Solution
- Code
- Output
- Example File
Deleting Names in Excel VBA – Solution(s):
You can use Delete method for deleting existing names in excel workbook.We can delete range name in the following way.please find the following example.The following code Deletes a name “MyData”.
Code:
'Deleting Names Sub sbDeleteName() 'myData=Sheet1.range("A1:E10") Names("myData").Delete End Sub
Output:
Instructions:
- Open an excel workbook
- Press Alt+F11 to open VBA Editor
- Double click on ThisWorkbook from Project Explorer
- Copy the above code and Paste in the code window
- Press F5
- GoTo Sheet1 and Select Range A1 to D10
- You should see the following example
Example File
Download the example file and Explore it.
Analysistabs – Deleting Name to Range in excel Workboobk
Hide UnHide Names in Excel VBA:
Sometimes you may need to Hide UnHide names in Excel VBA.
- Solution
- Code
- Output
- Example File
Hide UnHide names in Excel VBA – Solution(s):
You Can Hide UnHide Names in Excel VBA using Visible Property in the following way. when we set visible proprty to false, We dont see defined range name . when we set visible proprty to true, We can see defined range name .
Code:
'Hiding a Name Sub sbHideName() Names("myData").Visible = False End Sub 'UnHide aName Sub sbUnHideName() Names("myData").Visible = True End Sub
Output:
Instructions:
- Open an excel workbook
- Press Alt+F11 to open VBA Editor
- Double click on ThisWorkbook from Project Explorer
- Copy the above code and Paste in the code window
- Press F5
- GoTo Sheet1 and Select Range A1 to D10
- You should see the following example
Example File
Download the example file and Explore it.
Analysistabs – Hide UnHide Names in excel Workboobk
A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.
Save Up to 85% LIMITED TIME OFFER
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates
Excel Pack
50+ Excel PM Templates
PowerPoint Pack
50+ Excel PM Templates
MS Word Pack
25+ Word PM Templates
Ultimate Project Management Template
Ultimate Resource Management Template
Project Portfolio Management Templates
Related Posts
-
- Adding Names in Excel VBA:
- Adding Names in Excel VBA – Solution(s):
- Deleting Names in Excel VBA:
- Deleting Names in Excel VBA – Solution(s):
- Hide UnHide Names in Excel VBA:
- Hide UnHide names in Excel VBA – Solution(s):
VBA Reference
Effortlessly
Manage Your Projects
120+ Project Management Templates
Seamlessly manage your projects with our powerful & multi-purpose templates for project management.
120+ PM Templates Includes:
5 Comments
-
Eric W
April 30, 2015 at 11:17 AM — ReplyI am having a problem copying Ranges from one point to another in Excel using VBA.
I have tried several methods and get the same result any way I’ve tried
When the copy action is triggered, the destination has the copy from the header row in the destination
Example: Range(“U14:AO14”).Copy Destination:=Range(“A40”)
I am receiving the data from U2:AO2.
I have named the range by selection using the spreadsheet name window. The array that shows in the window shows the correct value. The destination is correct.Do you have a clue what is happening, or what I am doing wrong?
Thank You -
Amar
September 9, 2015 at 5:23 PM — ReplyCan this defined name be used for coding or in vba editor
-
PNRao
September 11, 2015 at 11:51 PM — ReplyHi Amar,
Yes! we can use the defined names in VBA. Example:Sheet1.Range("$A$1:$E$10").Name = "myData" Range("myData").Interior.ColorIndex = 3
here, myData is a user defined name and the above code will change the background color of the defined range.
Thanks-PNRao! -
Silke Flink
September 12, 2015 at 12:35 AM — ReplyThank you for this post. I was wondering if it is possible to address a dynamic name range in VBA. I have a named range (though I use a lookup-function in the name manager) that is visible in the name manager and can be used in formulas in the Excel sheet.
I tried this
dim Taxes_from_Sales as Range
Set Taxes_from_Sales = Range(“Taxes_from_Sales”)whereas “Taxes_from_Sales” is a excel Lookup defined name range. VBA doesn’t recognize it cause of the formula.
Any idea how to approach this without writing Lookup in VBA?
Thanks for help
silke
-
PNRao
September 13, 2015 at 1:48 AM — ReplyHi,
It works for dynamic range. In your case, Lookup functions always returns a value, and we need a range to use in VBA.I have tried the below example and its working fine:
Sub DynamicNamedRange() 'Adding a dynamic Name Names.Add Name:="test", RefersTo:="=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!A:A),1)" 'Entering sample data For i = 1 To 10 Cells(i, 1) = i Next 'Formatting dynamic range Range("test").Interior.ColorIndex = 3 End Sub
Thanks-PNRao!
Effectively Manage Your
Projects and Resources
ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.
We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.
Project Management
Excel VBA
Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.
Page load link
3 Realtime VBA Projects
with Source Code!
Go to Top
Alex_p_123 Пользователь Сообщений: 16 |
#1 20.07.2017 09:32:50 Добрый день! Вставляю в ячейку файл — oleobject (не важно чем — диалоговым окном Вставка/объект или макросом).
Но имя его я не знаю и потому не могу к нему обратиться программно. Пробовал строки типа SelectedObject.Name, ActiveObject.Name и т.д. — не работает, выдает ошибку. С уважением, Алексей Изменено: Alex_p_123 — 20.07.2017 13:26:38 |
||
Илья Демид Пользователь Сообщений: 320 |
#2 20.07.2017 09:43:19 Добрый день, Вам наверное надо вот так пройтись в цикле? Но если объектов много, то как понять какое именно Вам надо имя это загадка для меня
Изменено: Илья Демид — 20.07.2017 09:45:42 |
||
Alex_p_123 Пользователь Сообщений: 16 |
#3 20.07.2017 09:54:08
Не совсем то. Попробовал для одной из ячеек сделать …Shapes(2)… — выдает «Button489» Получается, что неважно какая ячейка стоит в Вашем примере (Cells(5,5) или что-то другое), он возвращает имя именно для Spapes(1), Shapes(2)…. Изменено: Alex_p_123 — 20.07.2017 09:54:50 |
||
Приложите пример, пожалуйста. Самому интересно стало |
|
Alex_p_123 Пользователь Сообщений: 16 |
#5 20.07.2017 10:01:27 Сейчас попробую Камень преткновения сейчас для меня — строка ActiveSheet.Shapes(«Object 606»).IncrementLeft 42.8570866142 Вот в ней я хочу видеть имя активного (или выделенного) значка, потому что оператор with selection прекрасно работает (пробовал отдельно от этой проблемной строки, но в этот оператор я IncrementLeft вставить не могу — выдает ошибку).
Изменено: Alex_p_123 — 20.07.2017 10:03:13 |
||
Илья Демид Пользователь Сообщений: 320 |
#6 20.07.2017 10:04:26 Попробуйте так
Чтобы добавить ее в вашу строку сделайте переменную которой присвоите «.name» Правда легче сразу сделать
Изменено: Илья Демид — 20.07.2017 10:08:05 |
||||
Alex_p_123 Пользователь Сообщений: 16 |
Не работает конечно же, потому что он не понимает, имя чего я у него спрашиваю |
пример файла дайте, потому что у меня то работает. Надо сначало выделить обьект |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#9 20.07.2017 10:21:32 Доброе время суток.
Такая сложность справку по методу коллекции OLEObjects.Add посмотреть, чтобы увидеть, что возвращается ссылка на OLEObject с которым вы и можете сразу выполнять требуемые манипуляции?
Успехов. |
||||||||
Alex_p_123 Пользователь Сообщений: 16 |
|
Илья Демид Пользователь Сообщений: 320 |
#11 20.07.2017 10:40:08 Идите по варианту который предложил Андрей VG, в моем примере Вам необходимо выбрать именно объект (ПКМ по картинке), после чего
|
||
AndreTM Пользователь Сообщений: 454 |
#12 20.07.2017 11:15:51 Всё дело в том, что коллекция Shapes — по сути, независима от листа. То есть нельзя по определенному
помогает только в случаях, когда вы вставляете новый объект (.AddPicture/.Insert), а вот если копируете имеющийся шейп (через .Cut/.Dupclicate — .Copy/.Paste) — то никак. Потому что копируете-то вы объект через буфер, и вставляете на лист, не возвращается там объект из команды вставки.
и далее сразу его обработать. |
||||
Alex_p_123 Пользователь Сообщений: 16 |
#13 20.07.2017 14:27:23 Илья Демид
— да, вариант, предложенный Андрей VG , оказался работающим. Андрей VG — спасибо. Вот в каком виде это работает у меня в тестовом файле:
Если убрать вот этот отрезок:
то он при создании объекта создает какие-то книги, котjрые потом нигде кроме VBA редактора не видны, так как имеют свойство ActiveWindow.Visible = false Команда ActiveSheet.Shapes.Count может оказаться крайне полезной. AndreTM — Ваш вариант (собственно его я и имел в виду строкой выше) выглядит для моих целей наверное самым верным, но я его еще не тестировал, поэтому буду пробовать. Кстати обратил внимание, что в свойствах объекта можно задать Left и Top, но тогда он размещает его не в ячейке, а на соответствующем смещении от верхнего левого угла файла, то есть в районе ячейки A1. Всем спасибо, по-моему вопрос нашел свое решение, далее буду крутить циклы когда надо будет вставить в ячейку несколько объектов по определенным признакам (например когда название файлов содержит соответствующий номер строки), но это уже другая история. |
||||
What is VBA Name?
VBA NAME is a statement which can be used to move files from across drives and while moving the files we can rename the moving file as well.
- What if you want to copy the file but paste with different name???
- What is you want to copy the file but to delete the file in the original source folder??
- With manual work we do all this without much trouble, but if your VBA project requires all of these to be done in the middle of the code execution how will you do??
In this article, we will show you how to do all of these using “Name Statement” in VBA. Read on…
What Does Name Statement Do in VBA?
When you hear the word “Name” what comes to your mind?? The first thing I got was “Worksheet Name” and “Workbook Name”.
Renaming can be done within the same directory or folder, not across drives. Let’s look at the syntax of the NAME statement.
Name OldName as NewName
- Old Name: This is nothing but the current name of the file in the mentioned folder path.
- New Name: While moving the file what should be the new name to be allocated to it?
One thing we need to remember is, NAME statement is used to move and rename the files not to create any file, folder or directory.
In order to move or rename the file, we need to first close the targeted file and execute the task or else we will get an error message.
How to Use VBA Name in Excel?
We will learn how to use a VBA Name Function with few examples in excel.
You can download this VBA Name Excel Template here – VBA Name Excel Template
Example #1 – VBA Name
Take a look at the simple example of changing the name of the File in the same folder. For example, I have a file in the below folder.
With this file, I want to rename the file “Sales April 2019.xlsx” to “April 2019.xlsx”. This can be done by using the NAME statement. Follow the below steps to apply the code.
Step 1: Add the new module.
Step 2: Start the subprocedure.
Code:
Sub FileCopy_Example1() End Sub
Step 3: Declare two variables as a string.
Code:
Sub FileCopy_Example1() Dim OldName As String Dim NewName As String End Sub
Step 4: For Old, Name Variable assign the folder path and file name with extension.
Code:
Sub FileCopy_Example1() Dim OldName As String Dim NewName As String OldName = " D:VPB FileApril FilesNew ExcelSalesApril.xlsx" End Sub
Step 5: For the New Name variable we will mention the same path but will change the name of the file only.
Code:
Sub FileCopy_Example1() Dim OldName As String Dim NewName As String OldName = " D:VPB FileApril FilesNew ExcelSalesApril.xlsx" NewName = " D:VPB FileApril FilesNew ExcelApril.xlsx" End Sub
Step 6: Now I will use the NAME Statement.
Code:
Sub FileCopy_Example() Dim OldName As String Dim NewName As String OldName = " D:VPB FileApril FilesNew ExcelSalesApril.xlsx" NewName = " D:VPB FileApril FilesNew ExcelApril.xlsx" Name OldName As NewName End Sub
Step 7: Old Name & New Name are the variables which hold path references. Now execute the code to see the magic.
In the same folder itself, it has changed the file name from “Sales April 2019.xlsx” to “April 2019.xlsx”.
This is the way of changing the file name in the same folder how about changing from one folder to a different folder.
Example #2 – Change from One Folder to Another
In order to move from one folder to another, we need to change the New Name path. For an example look at the below code.
Sub FileCopy_Example1() Dim OldName As String Dim NewName As String OldName = "D:VPB FileApril FilesNew ExcelApril 1.xlsx" NewName = "D:VPB FileApril FilesFinal locationApril.xlsx" Name OldName As NewName End Sub
If you observe the difference from our previous code to this code, we have changed the New Name to a different folder in the same drive.
Now I will execute this code and see the impact in both the folders.
New Folder:
In the new folder, we got the new sheet named as “April 2019.xlsx”. Now, look at the Old Folder.
Old Folder:
It says “This folder is empty”.
This is unlike our File Copy method. Name statement has removed the original file from the old folder and moved to a new folder with a new name as we specified.
Like this, we can move files from one folder to another with different names by using the “NAME” statement.
Recommended Articles
This is a guide to VBA Name. Here we discuss how to use Excel VBA Name Function along with practical examples and downloadable excel template. You can also go through our other suggested articles –
- VBA Copy Paste
- VBA RGB
- VBA Subscript out of Range
- FileCopy in VBA
Работа с объектами
При создании приложения в VBA в основном происходит работа с объектами. Можно использовать объекты, предоставляемые VBA: элементы управления, формы и объекты доступа к данным. Можно также управлять объектами других приложений из приложения VBA. Можно даже создавать свои собственные объекты и определять для них дополнительные свойства и методы.
Что такое объект?
Объект — это комбинация кода и данных, которую можно рассматривать как одно целое. Объект может быть частью приложения, как элемент управления или форма. Целое приложение также может быть объектом. В таблице приведены примеры типов объектов, которые можно использовать в VBA:
Объект | Описание |
Кнопка управления | Элементы управления на форме, например кнопки управления и рамки, являются объектами |
Форма | Каждая форма в проекте VBA является отдельным объектом |
База данных | Базы данных являются объектами и содержат другие объекты, например, поля и индексы |
Диаграмма | Диаграмма в Microsoft Excel является объектом |
Происхождение объектов
Каждый объект в VBA определен классом (class). Класс используется для создания объектов и определяет их характеристики. Приведем два примера взаимоотношений между классами и объектами в VBA:
Элементы управления Панели элементов управления в VBA представляют классы. Объект, известный как элемент управления, не существует, пока он не нарисован на форме. Когда создается элемент управления, создается копия, или экземпляр (instance) класса элемента управления
Форма, используемая во время разработки, является классом. Во время выполнения VBA создает экземпляр класса формы
Окно Properties (Свойства) отображает класс и свойство Name (Имя) объектов в разработанном приложении VBA.
Все объекты создаются как идентичные копии своих классов. Свойства индивидуальных объектов можно изменять. Например, если на форме созданы три кнопки управления, каждый объект кнопка управления является экземпляром класса ConroandButton. Объекты одного класса используют общий набор характеристик и способностей (свойств, методов и событий). Каждому объекту дано свое имя, их можно по отдельности заблокировать и разблокировать, поместить в разные места на форме и т. д.
Понятие «класс объекта» не часто упоминается. Просто надо помнить, что, например, термин «элемент управления списком» означает «экземпляр класса ListBox».
Что можно делать с объектами?
Объект предоставляет в распоряжение разработчика готовый исполняемый код. Например, вместо того чтобы программировать собственные диалоги File Open (Открыть файл) и File Save (Сохранить файл), можно использовать элемент управления общим диалогом (объект, предоставляемый VBA). Можно написать собственный код управления планированием и ресурсами, но вместо этого проще использовать объекты Calendar (Календарь), Resources (Ресурсы) и Task (Задача), предоставляемые Microsoft Project (Проект).
VBA может комбинировать объекты из других источников
VBA предоставляет инструменты, которые позволяют комбинировать объекты из различных источников. Можно строить решения, комбинируя самые мощные возможности VBA и приложений, поддерживающих Automation (Автоматизация) (ранее известная как OLE Automation). Автоматизация (automation) — это свойство составной модели объекта (Component Object Model, СОМ), промышленного стандарта, используемого приложениями для раскрытия своих объектов инструментам разработки и другим приложениям.
Можно строить приложения, объединяя внутренние элементы управления VBA и объекты, предоставляемые другими приложениями. Предположим, что эти объекты помещены на форму VBA:
Объект Microsoft Excel chart (Диаграмма Microsoft Excel)
Объект Microsoft Excel Worksheet (Рабочий лист Microsoft Excel)
Объект Microsoft Word Document (Документ Microsoft Word)
Эти объекты можно использовать для создания приложения. Это сохранит время разработчика, так как не надо писать код, воспроизводящий все функциональные возможности объектов Microsoft Excel и Microsoft Word.
Основы работы с объектами
Объекты VBA поддерживают свойства, методы и события. В VBA данные объекта (установки или атрибуты) называются свойствами, тогда как процедуры, которые оперируют с объектом, называются его методами. Событие — это действие, распознаваемое объектом, например, щелчок кнопкой мыши или нажатие клавиши клавиатуры, и программист может написать код, реагирующий на это событие.
Можно изменять характеристики объекта, меняя его свойства. Рассмотрим радио: одно из свойств радио — громкость (volume). В терминах обсуждаемой темы можно сказать, что радио обладает свойством «Volume», которое регулируется изменением его значения. Предположим, что можно установить регулятор громкости радио в положения от 0 до 10. Если бы радио управлялось с помощью VBA, можно было бы написать код процедуры, которая изменяла бы значение свойства «Volume» от 3 до 5, чтобы радио работало громче:
Radio.Volume = 5
Кроме свойств объекты обладают методами. Методы — это такая же часть объектов, как и свойства. В целом, методы — это действия, которые можно выполнить, тогда как свойства — это атрибуты, которые устанавливаются или восстанавливаются. Например, чтобы позвонить по телефону, надо набрать номер (dial). Можно было бы сказать, что телефоны обладают методом «Dial», и использовать этот синтаксис для набора номера 555111:
Phone.Dial 5551111
Объекты также обладают событиями. События инициируются, когда изменяются некоторые свойства объекта. Например, радио может иметь событие «VolumeChange» (Изменение громкости). Телефон может иметь событие «Ring»(Звонок).
Управление объектами с помощью свойств
Индивидуальные свойства меняются. Некоторые можно установить во время разработки. Для этого лучше использовать окно Properties (Свойств), что позволяет вообще не писать никакого кода. Другие свойства не доступны во время разработки, следовательно, необходимо программировать установку таких свойств во время выполнения.
Свойства, которые можно установить или значения которых можно получить только во время выполнения, называются изменяемыми (read-write properties). Свойства, значения которых можно только прочитать во время выполнения, называются неизменяемыми (read-only properties).
Установка значений свойств
Значение свойства устанавливается, только если необходимо изменить внешний вид или поведение объекта. Например, свойство Text элемента управления TextBox изменяют, если необходимо изменить содержимое поля.
Для установки значения свойства применяется следующий синтаксис:
object.property = expression
Следующие операторы демонстрируют, как можно устанавливать значения свойств:
Textl.Top = 200 ‘ Значение свойства Тор равно 200 твипам.
Textl.Visible = True ‘ Отображает текстовое поле.
Textl.Text = «hello» ‘ Отображает ‘hello’ в текстовом поле.
Получение значений свойств
Получают значение свойства тогда, когда хотят определить состояние объекта до выполнения каких-либо действий из кода, например, присвоить значение свойству другого объекта. Можно проанализировать содержимое текстового поля (значение свойства Text этого элемента управления) перед выполнением кода, который может изменить это значение.
В большинстве случаев, чтобы получить значение свойства, применяется следующий синтаксис:
variable = object.property
Можно также использовать значение свойства, как часть более сложных выражений, без присваивания этого значения переменной. В следующем примере значение свойства Top (Верх) нового члена массива элементов управления вычисляется как значение свойства Top предыдущего члена плюс 400:
Private Sub cmdAdd_Click()
‘ [операторы]
optButton(n).Top = optButton(n-l).Top + 400
‘ [операторы] End Sub
Примечание
В случае многократного использования значения свойства код будет выполняться быстрее, если хранить это значение в переменной.
Использование методов в коде
Методы могут воздействовать на значения свойств. Например, в аналоге радио метод SetVolume (Установить громкость) изменяет свойство volume (громкость). Списки VBA имеют свойство List (Список), которое можно изменить методами clear (Очистить) и Additem (Добавить элемент).
При использовании метода в коде запись соответствующего оператора зависит от того, сколько параметров требуется передать в метод, и возвращает ли метод значение. Если методу не требуются параметры, его можно вызвать с помощью следующего синтаксиса:
object.теthod.
В следующем примере метод Refresh (Освежить) перерисовывает картинку:
Picturel.Refresh ‘ Перерисовка элемента управления.
Некоторые методы, как метод Refresh, не имеют параметров и не возвращают значения.
Если методу требуется более одного параметра, они отделяются друг от друга запятыми. Например, метод circle (Круг) требует задать положение, радиус и цвет круга на форме:
‘ Нарисовать голубой круг радиусом 1200 твипов.
Forml.Circle (1600, 1800), 1200, vbBlue
Если необходимо сохранить возвращаемое методом значение, следует заключить в круглые скобки его параметры. Например, метод GetData (Получить данные) возвращает картинку из буфера обмена (clipboard):
Picture = Clipboard.GetData (vbCFBitmap)
Если метод не возвращает никакого значения, параметры задаются без круглых скобок. Например, метод Additem (Добавить элемент) не возвращает значения:
Listi.Additem «yourname» ‘ Добавить текст ‘yourname’ в список.
Взаимосвязь объектов
Если на форму помещаются две кнопки управления, они являются отдельными объектами с различными значениями свойства Name (Имя) (command1 и Command2), НО ОНИ СОВМССТНО ИСПОЛЬЗУЮТ ОДИН И ТОТ ЖЕ КЛАСС: CommandButton.
Кроме того, они расположены на одной форме. Но рассмотренный выше в этой главе элемент управления также принадлежит этой форме. Это выстраивает элементы управления в некоторую иерархию. Чтобы сослаться на элемент управления, сначала нужно сослаться на форму, точно так же необходимо набрать код страны или код области, прежде чем набирать конкретный номер телефона.
Рассматриваемые кнопки управления также являются элементами управления — это их общая характеристика. Все элементы управления имеют общие характеристики, что отличает их от форм и других объектов в окружении VBA. Далее будет рассматриваться использование наборов VBA для объединения родственных объектов в группы.
Иерархия объектов
Иерархия объектов (object hierarchy) определяет, как объекты связаны друг с другом и как к ним можно обратиться. В большинстве случаев программисту нет необходимости заботиться об иерархии объектов VBA, однако:
При обращении к объектам других приложений следует знать иерархию объектов этого приложения.
Работая с объектами доступа к данным, следует знать иерархию Data Access Objects (Объектов доступа к данным)
Наборы объектов
Наборы объектов имеют собственные свойства и методы. Объекты в наборе называются членами набора (members of the collection). Все члены набора перенумерованы последовательно, начиная с 0. Номер члена в этой последовательности называется его индексом (index number). Например, набор Controls (Элементы управления) состоит из всех элементов управления на заданной форме, как показано на рис. 5.10. Наборы применяются для упрощения кода, если необходимо выполнить одну и ту же операцию над всеми объектами в наборе.
Например, следующий код последовательно просматривает набор controls и заносит имя члена в список:
Dim MyControl as Control For Each MyControl In Forml.Controls
‘ Имя каждого элемента управления заносится в список.
Listl.AddItem MyControl.Name Next MyControl
Применение свойств и методов к членам наборов
Существует два общих способа адресации члена набора:
» Задать имя члена. Следующие выражения эквивалентны:
Controls(«List1») Controls!List1
Использовать индекс члена:
Controls(3)
Коль скоро имеется возможность адресации ко всем членам сразу и к индивидуальным членам, применять свойства и методы можно следующим образом:
‘ Установить значение свойства Тор списка равным 200.
Controls! List1. Top = 200
или так:
Dim MyControl as Control
For Each MyControl In Form1.Controls ()
‘ Установить значение свойства Top каждого члена равным 200.
MyControl.Top = 200
Next MyControl
Объекты, содержащие другие объекты
В VBA некоторые объекты содержат другие объекты. Например, обычно форма содержит один или более элементов управления. Удобство использования объектов в качестве контейнеров (containers) для других объектов заключается в том, что можно ссылаться на контейнер в коде для уточнения, какой объект используется. Например, могут быть две разные формы. Обе формы могут иметь списки с именем istAcctNo. Для точного указания списка можно использовать ссылку на форму, содержащую этот список:
frmReceivable.IstAcctNo.AddItem 1201
или
frmPayable.IstAcctNo.AddItem 1201
Общие наборы в VBA
В VBA существуют некоторые общие случаи, когда один объект содержит другие объекты. В таблице кратко описаны наиболее часто используемые наборы VBA.
Формы.
Первым шагом при разработке приложения на VBA является создание интерфейса, видимой части приложения, с которым взаимодействует пользователь. Формы и элементы управления как раз и являются строительными блоками при создании интерфейса. Именно с этими объектами приходится работать при построении приложений.
Формы — это объекты, которые обладают свойствами, определяющими их внешний вид, методами, определяющими их поведение, и событиями, которые определяют их взаимодействие с пользователем. Установкой свойств формы и разработкой кода VBA для отклика формы на события создается объект, удовлетворяющий требованиям определенного приложения.
Элементы управления — это объекты, содержащиеся внутри объектов-форм. Каждый тип элемента управления имеет свой собственный набор свойств, методов и событий, что делает его пригодным для определенной цели. Некоторые элементы управления, используемые в приложениях, лучше всего подходят для ввода или отображения текста. Другие элементы управления обеспечивают доступ к другим приложениям и данным процессов таким образом, как будто бы удаленное приложение является частью самого приложения.
Данная глава знакомит читателя с основными понятиями, необходимыми для работы с формами и элементами управления и связанными с ними свойствами, методами и событиями. Обсуждается большое количество стандартных элементов управления, а также специфические для форм вопросы: меню и окна диалога.
Разработка формы
Формы являются основными строительными блоками приложения VBA, теми окнами, с которыми взаимодействует пользователь при работе с приложением. У форм есть свои свойства, события и методы, которые позволяют управлять их внешним видом и поведением.
Первым шагом в разработке формы является установка значений ее свойств. Свойства формы можно установить во время разработки в окне Properties (Свойства) или во время выполнения (run time) приложения, написав соответствующий код.
Установка свойств формы
Многие из свойств формы воздействуют на ее внешний вид, т.е. то, как ее видит пользователь. Свойство Caption (Название) определяет текст заголовка окна (title bar) формы. Изменяя установку свойства BorderStyle, можно управлять размерами формы.
Свойства Height (Высота) и Width (Ширина) определяют начальные размеры формы; свойства Left (Левый) и Top (Верхний) определяют местоположение формы по отношению к левому верхнему углу экрана монитора.
Свойство Name (Имя) устанавливает имя, по которому можно обращаться к форме из кода. По умолчанию, когда форма впервые добавляется к проекту, ее имя может быть одним из последовательности имен Form1, Form2 и т. д. Однако для программиста удобнее, если свойство Name будет иметь более выразительное значение, например, frmГлавная для первой формы приложения.
Наилучший путь познакомиться с многочисленными свойствами форм — это поэкспериментировать с ними. Изменить значения некоторых свойств формы в окне Properties, затем запустить приложение и проанализировать воздействие новых значений. Узнать больше о каждом свойстве можно также, выбрав его и нажав F1
События и методы формы
Как объекты, так и формы могут выполнять методы и реагировать (откликаться) на события.
При каждом изменении размера формы в результате действий пользователя или программным способом инициируется событие Resize (Изменить размер) формы. Это позволяет изменять размеры элементов управления на форме или перемещать их, когда изменены размеры самой формы.
Событие Activate (Активизировать) происходит всегда, когда форма становится активной, а событие Deactivate (Деактивировать) — когда активной становится другая форма приложения. Эти события удобны для организации поведения формы при ее инициировании и завершении работы с ней. Например, можно написать код, который в случае события Activate выделит текст в каком-нибудь тeкcтoвoм окне, а в случае события Deactivate внесенные изменения будут сохранены в файле или базе данных.
Чтобы сделать форму видимой, следует вызвать метод show (Показать):
Form2.Show
Вызов метода show имеет тот же эффект, что и установка значения свойства visible (Видимый) формы в True (Истина).
Многие из методов формы работают с текстом или графикой. Методы Print (Печатать), Line (Линия), Сircle (Окружность) и Refresh (Обновить) полезны для печати или рисования непосредственно на поверхности формы.
Свойство Container
Свойство container (Набор) используется для изменения набора объектов внутри формы. Следующие элементы управления могут содержать другие элементы управления:
Рамка
Графическое окно
Следующий пример демонстрирует перемещение кнопки управления из одного набора на форме в другой. Откроем новый проект и создадим на форме рамку, графическое окно и кнопку управления.
Следующий код в процедуре обработки события click (Щелчок) формы увеличивает переменную цикла и использует конструкцию select case для поочередного перемещения кнопки управления из контейнера в контейнер:
Private Sub Form_Click() Static intX as Integer Select Case intX Case 0 Set Command1.Container = Picture1 Command1.Top= 0 Command1.Left= 0 Case 1 Set Coinmand1. Container = Frame1 Command1.Top= 0 Command1.Left= 0 Case 2 Set Command1.Container = Form1 Conmiand1. Top= 0 Commandl.Left= 0 End Select intX = intX + 1 End Sub
Связь между объектами
Кроме использования и создания объектов в VBA можно организовать коммуникационную связь с другими приложениями и управлять их объектами из разрабатываемого приложения. Возможность совместного использования данных приложениями — одна из ключевых в операционной системе Windows. VBA предоставляет большую гибкость при организации взаимодействия с другими приложениями.
Создание объектов
Самый простой способ создать объект — щелкнуть два раза на элементе управления в Панели управления. Однако для реализации всех возможностей объектов, доступных в VBA и из других приложений, следует использовать программные возможности VBA для создания объектов во время выполнения:
Можно создавать ссылки на объект с помощью переменных
Можно создавать собственные объекты с самого начала с помощью модулей классов
Можно создавать собственные наборы с помощью объекта collection (Набор.)
Использование переменных для объектов
Переменная может ссылаться на объекты. Присваивание объектов переменным выгодно по тем же причинам, что и присваивание переменным значений:
Имена переменных, как правило, короче и их легче запомнить, чем значения, которые они содержат (или, как в данном случае, объекты, на которые они ссылаются)
Во время выполнения кода переменные можно изменять, организуя ссылки на другие объекты
Ссылка на переменную, содержащую объект, более эффективна, чем постоянная ссылка на сам объект
Использование переменной для объекта аналогично использованию обычной переменной, но с одним дополнительным шагом — присваиванием объекта переменной:
Сначала ее объявляют:
Dim variable As class
Затем ей присваивают объект:
Set variable = object
Объявление переменных для объектов
Переменные для объектов объявляют так же, как и другие переменные, с помощью операторов Dim, ReDim, Static, Private или public. Единственное отличие заключается в наличии необязательного ключевого слова New (Новый) и параметра class (класс), они обсуждаются ниже в этой главе. Синтаксис задания переменной для объекта следующий:
(Dim | ReDim | Static | Private | Public} variable As [New] class
Например, можно объявить переменную для объекта, которая ссылается на форму с именем frmMain в приложении:
Dim FormVar As New frmMain ‘ Объявление объектной переменной типа frmMain.
Можно также объявить переменную, которая может ссылаться на любую форму в приложении:
Dim anyForm As Form ‘ Переменная родовой формы.
Подобным же образом можно объявить переменную для ссылки на любое текстовое поле в приложении:
Dim anyText As TextBox ‘ Может ссылаться на любое текстовое поле
Можно объявлять переменные для объекта, которые ссылаются на элемент управления любого вида:
Dim anyControl As Control ‘ Переменная родового элемента управления.
Заметим, что можно объявлять переменную формы, которая будет ссылаться на конкретные формы в приложении, но нельзя объявить переменную элемента управления, которая будет ссылаться на конкретный элемент управления. Можно объявлять переменные, которые ссылаются на определенный тип элемента управления, например TextBox или ListBox, но не на конкретный элемент данного типа, например txtEntry или Listl. Но можно присвоить определенный элемент управления переменной соответствующего типа. Например, для формы со списком, имеющим имя istSample, можно написать код:
Dim objDemo As ListBox Set objDemo = IstSample
Назначение объектов переменным
Назначить или присвоить объект переменной можно оператором Set:
Set variable = object
Этот оператор следует применять, если необходимо, чтобы переменная ссылалась на какой-то объект.
Иногда можно использовать переменные для объектов, иногда переменные для определенного типа элементов управления, просто для того, чтобы сократить размер набираемого кода. Например:
If frmAccountDisplay.txtAccountBalance.Text < 0 Then FrmAccountDisplay.txtAccountBalance.BackColor = 0 _ FrmAccountDisplay.txtAccountBalance.ForeColor = 255 End If
Этот код можно значительно сократить, если применить переменную для элемента управления:
Dim Bal As TextBox Set Bal = frmAccountDisplay.txtAccountBalance If Bal.Text < 0 Then Bal.BackColor = 0 Bal.ForeColor = 255 End If
Типы конкретных и родовых объектов
Переменные для конкретных объектов (specific object variables) должны ссылаться на один конкретный тип объекта или класса. Переменная для конкретной формы может ссылаться только на одну форму в приложении (хотя она может ссылаться на одну форму из множества экземпляров этой формы). Точно так же переменная для конкретного элемента управления может ссылаться только на один конкретный тип элемента управления в приложении, например, TextBox или ListBox. Чтобы посмотреть, как это делается, откроем новый проект и поместим на форму поле ввода. Добавим следующий код к форме:
Private Sub Form_Click() Dim anyText As TextBox Set anyText = Textl anyText.Text = "Hello" End Sub
Запустим приложение и щелкнем кнопкой мыши на форме. Свойство Text (Текст) поля ввода изменится на «Hello».
Переменные для родовых объектов (generic object variables) могут ссылаться на один из многих конкретных типов объектов. Переменная для родовой формы, например, может ссылаться на любую форму в приложении; переменная для родового элемента управления может ссылаться на любой элемент управления на любой форме в приложении. Чтобы посмотреть, как это делается, откроем новый проект и поместим несколько элементов управления рамкой, меткой и кнопок управления на форму в произвольном порядке. Добавим следующий код к форме:
Private Sub Form_Click() Dim anyControl As Control Set anyControl = Formi.Controls(3) anyControl.Caption = "Hello" End Sub
Запустим приложение и щелкнем кнопкой мыши на форме. Надпись на элементе управления, помещенном на форму третьим, изменится на «Hello».
В VBA существуют три типа родовых объектов:
Form. Ссылается на любую форму в приложении
control. Ссылается на любой элемент управления в приложении
object. Ссылается на любой объект
Переменные для родовых элементов управления полезны, если не известен конкретный тип объекта, на который будет ссылаться переменная во время выполнения. Например, в коде, который будет оперировать с любой формой в приложении, необходимо использовать переменную для родовой формы.
Формы как объекты
Наиболее часто формы используются для создания интерфейса приложения, но они также являются объектами, которые можно вызывать из других модулей приложения. Формы тесно связаны с модулями классов. Главное различие между ними заключается в том, что формы могут быть видимыми объектами, тогда как модули не имеют видимого интерфейса.
Добавление разработанных пользователем методов и свойств
Можно добавлять разработанные методы и свойства к формам и обращаться к ним из других модулей в приложении. Чтобы создать новый метод для формы, следует объявить процедуру с ключевым словом public:
' Пользовательский метод на Form1 Public Sub LateJobsCountO . ' <операторы> End Sub
Процедуру LateJobsCount можно вызвать из другого модуля оператором:
Form1.LateJobsCount
Создать новое свойство так же просто, как объявить открытую переменную в модуле формы:
Public IDNumber As Integer
Можно устанавливать и возвращать значение свойства IDNumber формы Form1 из других модулей двумя операторами:
Form1.IDNumber = 3 Textl.Text = Form1.IDNumber
Можно также использовать процедуры property (Свойство) для добавления разработанных свойств к форме.
Примечание
Можно обратиться к переменной, разработанному методу или установить значение разработанного свойства формы без ее загрузки. Это позволяет выполнить код на форме без загрузки ее в память. Точно так же ссылка на элемент управления без ссылки на какое-то из его свойств или методов не загружает форму.
Ключевое слово New
Ключевое слово New применяется для создания нового объекта в соответствии с его определением в своем классе. Его можно применять для создания экземпляров форм, классов, определенных в модулях классов, и наборов.
Использование ключевого слова New с формами
Каждая создаваемая во время разработки форма является классом. С помощью ключевого слова New можно создавать новые экземпляры этого класса. Чтобы увидеть, как это делается, создадим кнопку управления и несколько других элементов управления на форме. В окне Properties присвоим свойству Name формы значение sample. Добавим следующий код в процедуру обработки события click кнопки управления:
Dim x As sample Set x = New sample х. Show
Запустим приложение и щелкнем несколько раз кнопкой мыши на кнопке управления. Передвинем первую форму в сторону. Так как форма является классом с видимым интерфейсом, мы увидим дополнительные копии. Каждая форма имеет те же самые элементы управления, что и форма во время разработки.
Примечание
Чтобы сделать форму переменной и сохранять экземпляр загруженной формы, следует использовать переменные Static (Статический) или Public (Открытый) вместо локальных переменных.
Использование ключевого слова New другими объектами
Ключевое слово New используется для создания наборов и объектов классов, определенных в модулях классов. Рассмотрим пример, демонстрирующий создание экземпляров класса с помощью ключевого слова New. Откроем новый проект и создадим кнопку управления на форме Form1. Выполним команду Add Class Module (Добавить модуль класса) меню Project для добавления модуля класса в проект. Установим значение свойства Name модуля класса в showMe.
Следующий код в модуле Form1 создает новый образец класса ShowMe и вызывает процедуру, содержащуюся в модуле класса:
Public cisNew As ShowMe Private Sub Commandl Click() Set cisNew = New ShowMe cisNew.ShowFrm End Sub
Процедура ShowFrm в модуле класса создает новый образец класса sample и показывает ее:
Sub ShowFrm() Dim frmNew As sample Set frmNew = New sample frmNew.Show End Sub
Запустим приложение и щелкнем кнопкой мыши несколько раз на кнопке управления. Получаем эффект, как в предыдущем примере, но ключевое слово New использовалось для создания класса.
Ограничения на использование ключевого слова New
С ключевым словом New нельзя:
Объявлять переменные основного типа данных, например: Dim x As New Integer
Объявлять переменные любого родового объекта, например: Dim x As New Control
Объявлять переменные типа для любого конкретного элемента управления, например: Dim X As New ListBox
Объявлять переменные для любого конкретного элемента управления, например: Dim X As New IstNames.
Освобождение ссылок на объекты
Каждый объект использует память и системные ресурсы. Хорошим стилем программирования является освобождение этих ресурсов, когда объект больше не нужен. Этого можно добиться с помощью:
Оператора unload (Выгрузить) для выгрузки формы или элемента управления из памяти
Значения Nothing (Ничего) для освобождения ресурсов, используемых переменной для объекта. Следует присвоить значение Nothing переменной для объекта оператором Set.
Передача объектов в процедуры
В VBA можно передавать объекты в процедуры. В следующем примере предполагается, что на форме существует кнопка управления:
Private Sub Commandl_Click() ' Вызов процедуры Demo sub и передача ей формы. Demo Form1 End Sub Private Sub Demo(x As Formi) ' Прижать вправо. x.Left = 0 End Sub
Также можно передать объект через параметр по ссылке и затем внутри процедуры установить таким образом, чтобы он ссылался на новый объект. Откроем проект и введем в него вторую форму. Поместим на нее графическое окно. Для свойства Name объекта Form2 необходимо установить значение picture2, а для свойства Picture — имя файла иконки *.ico
Процедура Form1_click обработки события вызывает процедуру GetPicture в форме Form2 и передает ей пустую картинку:
Private Sub Form_Click() Form2.GetPicture Picture1 End Sub
Процедура GetPicture в форме Form2 присваивает значение свойства Picture (Картинка) графического окна на форме Form2 пустой картинке на форме Form1:
Private objX As PictureBox Public Sub GetPicture(x As PictureBox) ' Присваивает переданное графическое окно объектной переменной. Set objX = x ' Присваивает значение свойства Picture графическому окну на Formi objX.Picture = picture2.Picture End Sub
Запустим это приложение и щелкнем кнопкой мыши на форме Form1. Увидим значок формы Form2 в графическом окне на форме Form1.
Объектная модель FileSystemObject
Объектная модель FileSystemObject представляет собой не иерархическую структуру объектов (классов), позволяющих получать информацию о файловой системе компьютера и выполнять различные операции с файлами и каталогами этой системы.
Порядок использования объектной модели FileSystemObject, т.е. ее объектов с их свойствами и методами при программировании приложения следующий:
Подключить к проекту библиотеку типов SCRRUN.DLL. Эта библиотека входит в комплект поставки последних разновидностей Windows95, а все более новые Windows, как 9x, так и NT содержат ее обязательно. Получить эту бибилотеку можно бесплатно на сайте Microsoft http://msdn.microsoft.com/scripting.
Создать новый объект типа FileSystemObject стандартными методами (посредством New или CreateObject)
Использовать его методы и свойства для получения необходимой информации, в том числе ссылок на другие (подчиненные) объекты модели. Соответственно, использовать методы и свойства подчиненных объектов модели.
После завершения работы закрыть все использованные объекты, начиная с нижних в иерархии. Там где это необходимо использовать для закрытия объектов их методы, в прочих случаях использовать
Set objvar=Nothing
Объектная модель включает следующие классы
Класс (тип объекта) | Назначение |
FileSystemObject | Обеспечивает доступ к файловой системе компьютера. |
Drives | Cодержит объекты Drive, каждый из которых ассоциируется ровно с одним диском в файловой системе компьютера, с учетом сети. |
Drive | Обеспечивает доступ к информации о заданном диске компьютера002E |
Folders | Семейство Folders содержит объекты Folder, каждый из которых ассоциируется ровно с одним подкаталогом заданного каталога. |
Folder | Обеспечивает доступ к информации о заданной папке, содержащимся в ней папках и каталогах, а также методы перемещения папки и создания текстового файла. |
Files | Семейство Files содержит все объекты File, каждый из которых ассоциируется ровно с одним файлом в заданной папке. |
File | Обеспечивает доступ к информации о заданном файле, методы перемещения файла и открытия текстового файла в режиме последовательного доступа. |
TextStream | Обеспечивает проведение операций чтения/записи для текстового файла открытого в режиме последовательного доступа. |
объект FileSystemObject обеспечивает доступ к файловой системе компьютера. Будучи объектом верхнего уровня объектной модели FileSystemObject является «точкой входа» в файловую систему компьютера. Только после его создания возможен доступ к другим объектам модели, их методам и свойствам.
Dim objFSO As FileSystemObject
Set objFSO = CreateObject(«Scripting.FileSystemObject»)
или
Set objFSO = New FileSystemObject
Элемент | Тип данных | Тип данных |
objFSO | FileSystemObject | Идентификатор (имя) объекта FileSystemObject |
Свойства объекта FileSystemObject
Свойство | Тип данных | Чтение/запись | Описание |
Drives | Drives | Только чтение | Содержит ссылку на семейство Drives, содержащую объекты для каждого устройства дисковой памяти компьютера |
Методы объекта FileSystemObject
Метод | Назначение |
BuildPath | Создание строки путем слияния аргументов и добавления между ними, если его нет, разделителя «» (обратной косой черты). |
CopyFile | Копирование одного или нескольких файлов из одной папки в другую. |
CopyFolder | Копирование содержимого папки со всеми содержащимися в ней папками (подкаталогами) в заданное место. |
CreateFolder | Создание новой папки с заданным именем. |
CreateTextFile | Создание файла и открытие его в режиме текстового файла последовательного доступа для записи как объекта TextStream |
DeleteFile | Удаление одного или нескольких заданных файлов. |
DeleteFolder | Удаление одной или нескольких заданных папок вместе со всем их содержимым. |
DriveExists | Проверка существования диска с заданным именем на локальной машине или в сети. |
FileExists | Проверка существования файла с заданным именем на локальной машине или в сети. |
FolderExists | Проверка существования папки с заданным именем на локальной машине или в сети |
GetAbsolutePathName | Получение полного имени файла или папки по относительному имени. |
GetBaseName | Получение поcледнего компонента — имени папки или файла (без расширения) по его полному или относительному имени. |
GetDrive | Получение ссылки на объект Drive, связанный с заданным диском. |
GetDriveName | Получение имени диска из имени папки или файла. |
GetExtensionName | Получение расширения из заданного имени файла. |
GetFile | Получение ссылки на объект File, связанный с заданным файлом. |
GetFileName | Получение имени (с расширением) файла из полного имени (пути) файла. |
GetFolder | Получение ссылки на объект Folder, связанный с заданной папкой. |
GetParentFolderName | Получение имени папки, являющейся предпоследним компонентом полного имени (пути) файла или папки. |
GetSpecialFolder | Получение ссылки на объект Folder, связанный с одной из трех специальных папок — папки Windows, системной папки и папки временных файлов. |
GetTempName | Получение имени для временного файла. |
MoveFile | Перемещение одного или нескольких файлов из одной папки в другую. |
MoveFolder | Перемещение содержимого папки со всеми содержащимися в ней папками (подкаталогами) в заданное место. |
OpenTextFile | Открытие файла как объекта TextStream для проведения операций чтения/записи в режиме последовательного доступа. |
У каждого из прочих вышеперечисленных семейств и объектов имеются свои свойства и методы. Для ознакомления с ними следует обратиться к справочной литературе.
Термин Объекты Excel (понимаемый в широком смысле, как объектная модель Excel) включает в себя элементы, из которых состоит любая рабочая книга Excel. Это, например, рабочие листы (Worksheets), строки (Rows), столбцы (Columns), диапазоны ячеек (Ranges) и сама рабочая книга Excel (Workbook) в том числе. Каждый объект Excel имеет набор свойств, которые являются его неотъемлемой частью.
Например, объект Worksheet (рабочий лист) имеет свойства Name (имя), Protection (защита), Visible (видимость), Scroll Area (область прокрутки) и так далее. Таким образом, если в процессе выполнения макроса требуется скрыть рабочий лист, то достаточно изменить свойство Visible этого листа.
В Excel VBA существует особый тип объектов – коллекция. Как можно догадаться из названия, коллекция ссылается на группу (или коллекцию) объектов Excel. Например, коллекция Rows – это объект, содержащий все строки рабочего листа.
Доступ ко всем основным объектам Excel может быть осуществлён (прямо или косвенно) через объект Workbooks, который является коллекцией всех открытых в данный момент рабочих книг. Каждая рабочая книга содержит объект Sheets – коллекция, которая включает в себя все рабочие листы и листы с диаграммами рабочей книги. Каждый объект Worksheet состоит из коллекции Rows – в неё входят все строки рабочего листа, и коллекции Columns – все столбцы рабочего листа, и так далее.
В следующей таблице перечислены некоторые наиболее часто используемые объекты Excel. Полный перечень объектов Excel VBA можно найти на сайте Microsoft Office Developer (на английском).
Объект | Описание |
---|---|
Application | Приложение Excel. |
Workbooks | Коллекция всех открытых в данный момент рабочих книг в текущем приложении Excel. Доступ к какой-то конкретной рабочей книге может быть осуществлён через объект Workbooks при помощи числового индекса рабочей книги или её имени, например, Workbooks(1) или Workbooks(«Книга1»). |
Workbook | Объект Workbook – это рабочая книга. Доступ к ней может быть выполнен через коллекцию Workbooks при помощи числового индекса или имени рабочей книги (см. выше). Для доступа к активной в данный момент рабочей книге можно использовать ActiveWorkbook.
Из объекта Workbook можно получить доступ к объекту Sheets, который является коллекцией всех листов рабочей книги (рабочие листы и диаграммы), а также к объекту Worksheets, который представляет из себя коллекцию всех рабочих листов книги Excel. |
Sheets | Объект Sheets– это коллекция всех листов рабочей книги. Это могут быть как рабочие листы, так и диаграммы на отдельном листе. Доступ к отдельному листу из коллекции Sheets можно получить при помощи числового индекса листа или его имени, например, Sheets(1) или Sheets(«Лист1»). |
Worksheets | Объект Worksheets – это коллекция всех рабочих листов в рабочей книге (то есть, все листы, кроме диаграмм на отдельном листе). Доступ к отдельному рабочему листу из коллекции Worksheets можно получить при помощи числового индекса рабочего листа или его имени, например, Worksheets(1) или Worksheets(«Лист1»). |
Worksheet | Объект Worksheet – это отдельный рабочий лист книги Excel. Доступ к нему можно получить при помощи числового индекса рабочего листа или его имени (см. выше).
Кроме этого Вы можете использовать ActiveSheet для доступа к активному в данный момент рабочему листу. Из объекта Worksheet можно получить доступ к объектам Rows и Columns, которые являются коллекцией объектов Range, ссылающихся на строки и столбцы рабочего листа. А также можно получить доступ к отдельной ячейке или к любому диапазону смежных ячеек на рабочем листе. |
Rows | Объект Rows – это коллекция всех строк рабочего листа. Объект Range, состоящий из отдельной строки рабочего листа, может быть доступен по номеру этой строки, например, Rows(1). |
Columns | Объект Columns – это коллекция всех столбцов рабочего листа. Объект Range, состоящий из отдельного столбца рабочего листа, может быть доступен по номеру этого столбца, например, Columns(1). |
Range | Объект Range – это любое количество смежных ячеек на рабочем листе. Это может быть одна ячейка или все ячейки листа.
Доступ к диапазону, состоящему из единственной ячейки, может быть осуществлён через объект Worksheet при помощи свойства Cells, например, Worksheet.Cells(1,1). По-другому ссылку на диапазон можно записать, указав адреса начальной и конечной ячеек. Их можно записать через двоеточие или через запятую. Например, Worksheet.Range(«A1:B10») или Worksheet.Range(«A1», «B10») или Worksheet.Range(Cells(1,1), Cells(10,2)). Обратите внимание, если в адресе Range вторая ячейка не указана (например, Worksheet.Range(«A1») или Worksheet.Range(Cells(1,1)), то будет выбран диапазон, состоящий из единственной ячейки. |
Приведённая выше таблица показывает, как выполняется доступ к объектам Excel через родительские объекты. Например, ссылку на диапазон ячеек можно записать вот так:
Workbooks("Книга1").Worksheets("Лист1").Range("A1:B10")
Содержание
- Присваивание объекта переменной
- Активный объект
- Смена активного объекта
- Свойства объектов
- Методы объектов
- Рассмотрим несколько примеров
- Пример 1
- Пример 2
- Пример 3
Присваивание объекта переменной
В Excel VBA объект может быть присвоен переменной при помощи ключевого слова Set:
Dim DataWb As Workbook Set DataWb = Workbooks("Книга1.xlsx")
Активный объект
В любой момент времени в Excel есть активный объект Workbook – это рабочая книга, открытая в этот момент. Точно так же существует активный объект Worksheet, активный объект Range и так далее.
Сослаться на активный объект Workbook или Sheet в коде VBA можно как на ActiveWorkbook или ActiveSheet, а на активный объект Range – как на Selection.
Если в коде VBA записана ссылка на рабочий лист, без указания к какой именно рабочей книге он относится, то Excel по умолчанию обращается к активной рабочей книге. Точно так же, если сослаться на диапазон, не указывая определённую рабочую книгу или лист, то Excel по умолчанию обратится к активному рабочему листу в активной рабочей книге.
Таким образом, чтобы сослаться на диапазон A1:B10 на активном рабочем листе активной книги, можно записать просто:
Смена активного объекта
Если в процессе выполнения программы требуется сделать активной другую рабочую книгу, другой рабочий лист, диапазон и так далее, то для этого нужно использовать методы Activate или Select вот таким образом:
Sub ActivateAndSelect() Workbooks("Книга2").Activate Worksheets("Лист2").Select Worksheets("Лист2").Range("A1:B10").Select Worksheets("Лист2").Range("A5").Activate End Sub
Методы объектов, в том числе использованные только что методы Activate или Select, далее будут рассмотрены более подробно.
Свойства объектов
Каждый объект VBA имеет заданные для него свойства. Например, объект Workbook имеет свойства Name (имя), RevisionNumber (количество сохранений), Sheets (листы) и множество других. Чтобы получить доступ к свойствам объекта, нужно записать имя объекта, затем точку и далее имя свойства. Например, имя активной рабочей книги может быть доступно вот так: ActiveWorkbook.Name. Таким образом, чтобы присвоить переменной wbName имя активной рабочей книги, можно использовать вот такой код:
Dim wbName As String wbName = ActiveWorkbook.Name
Ранее мы показали, как объект Workbook может быть использован для доступа к объекту Worksheet при помощи такой команды:
Workbooks("Книга1").Worksheets("Лист1")
Это возможно потому, что коллекция Worksheets является свойством объекта Workbook.
Некоторые свойства объекта доступны только для чтения, то есть их значения пользователь изменять не может. В то же время существуют свойства, которым можно присваивать различные значения. Например, чтобы изменить название активного листа на «Мой рабочий лист«, достаточно присвоить это имя свойству Name активного листа, вот так:
ActiveSheet.Name = "Мой рабочий лист"
Методы объектов
Объекты VBA имеют методы для выполнения определённых действий. Методы объекта – это процедуры, привязанные к объектам определённого типа. Например, объект Workbook имеет методы Activate, Close, Save и ещё множество других.
Для того, чтобы вызвать метод объекта, нужно записать имя объекта, точку и имя метода. Например, чтобы сохранить активную рабочую книгу, можно использовать вот такую строку кода:
Как и другие процедуры, методы могут иметь аргументы, которые передаются методу при его вызове. Например, метод Close объекта Workbook имеет три необязательных аргумента, которые определяют, должна ли быть сохранена рабочая книга перед закрытием и тому подобное.
Чтобы передать методу аргументы, необходимо записать после вызова метода значения этих аргументов через запятую. Например, если нужно сохранить активную рабочую книгу как файл .csv с именем «Книга2», то нужно вызвать метод SaveAs объекта Workbook и передать аргументу Filename значение Книга2, а аргументу FileFormat – значение xlCSV:
ActiveWorkbook.SaveAs "Книга2", xlCSV
Чтобы сделать код более читаемым, при вызове метода можно использовать именованные аргументы. В этом случае сначала записывают имя аргумента, затем оператор присваивания «:=» и после него указывают значение. Таким образом, приведённый выше пример вызова метода SaveAs объекта Workbook можно записать по-другому:
ActiveWorkbook.SaveAs Filename:="Книга2", [FileFormat]:=xlCSV
В окне Object Browser редактора Visual Basic показан список всех доступных объектов, их свойств и методов. Чтобы открыть этот список, запустите редактор Visual Basic и нажмите F2.
Рассмотрим несколько примеров
Пример 1
Этот отрывок кода VBA может служить иллюстрацией использования цикла For Each. В данном случае мы обратимся к нему, чтобы продемонстрировать ссылки на объект Worksheets (который по умолчанию берётся из активной рабочей книги) и ссылки на каждый объект Worksheet отдельно. Обратите внимание, что для вывода на экран имени каждого рабочего листа использовано свойство Name объекта Worksheet.
'Пролистываем поочерёдно все рабочие листы активной рабочей книги 'и выводим окно сообщения с именем каждого рабочего листа Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден рабочий лист: " & wSheet.Name Next wSheet
Пример 2
В этом примере кода VBA показано, как можно получать доступ к рабочим листам и диапазонам ячеек из других рабочих книг. Кроме этого, Вы убедитесь, что если не указана ссылка на какой-то определённый объект, то по умолчанию используются активные объекты Excel. Данный пример демонстрирует использование ключевого слова Set для присваивания объекта переменной.
В коде, приведённом ниже, для объекта Range вызывается метод PasteSpecial. Этот метод передаёт аргументу Paste значение xlPasteValues.
'Копируем диапазон ячеек из листа "Лист1" другой рабочей книги (с именем Data.xlsx) 'и вставляем только значения на лист "Результаты" текущей рабочей книги (с именем CurrWb.xlsm) Dim dataWb As Workbook Set dataWb = Workbooks.Open("C:Data") 'Обратите внимание, что DataWb – это активная рабочая книга. 'Следовательно, следующее действие выполняется с объектом Sheets в DataWb. Sheets("Лист1").Range("A1:B10").Copy 'Вставляем значения, скопированные из диапазона ячеек, на рабочий лист "Результаты" 'текущей рабочей книги. Обратите внимание, что рабочая книга CurrWb.xlsm не является 'активной, поэтому должна быть указана в ссылке. Workbooks("CurrWb").Sheets("Результаты").Range("A1").PasteSpecial Paste:=xlPasteValues
Пример 3
Следующий отрывок кода VBA показывает пример объекта (коллекции) Columns и демонстрирует, как доступ к нему осуществляется из объекта Worksheet. Кроме этого, Вы увидите, что, ссылаясь на ячейку или диапазон ячеек на активном рабочем листе, можно не указывать этот лист в ссылке. Вновь встречаем ключевое слово Set, при помощи которого объект Range присваивается переменной Col.
Данный код VBA показывает также пример доступа к свойству Value объекта Range и изменение его значения.
'С помощью цикла просматриваем значения в столбце A на листе "Лист2", 'выполняем с каждым из них арифметические операции и записываем результат 'в столбец A активного рабочего листа (Лист1) Dim i As Integer Dim Col As Range Dim dVal As Double 'Присваиваем переменной Col столбец A рабочего листа "Лист2" Set Col = Sheets("Лист2").Columns("A") i = 1 'Просматриваем последовательно все ячейки столбца Col до тех пор 'пока не встретится пустая ячейка Do Until IsEmpty(Col.Cells(i)) 'Выполняем арифметические операции со значением текущей ячейки dVal = Col.Cells(i).Value * 3 - 1 'Следующая команда записывает результат в столбец A 'активного листа. Нет необходимости указывать в ссылке имя листа, 'так как это активный лист рабочей книги. Cells(i, 1).Value = dVal i = i + 1 Loop
Оцените качество статьи. Нам важно ваше мнение:
In any programming language it is quite natural for you to use several variables and objects to develop code. Throughout this process, you might get confused referencing them for the first time or reusing them for the second time. For example, you might create a variable to store an integer and somewhere in the middle of the code, you might accidentally store a string in that variable.
When variables are not used appropriately, there’s a good chance you could run into one of these issues:
- Your code is not organized properly
- Maintenance of the code becomes takes too much overhead
- If maintenance needs to be done by another developer, it takes a very long time for the user to understand the code and maintain it
Solution
In order to overcome the problems above and keep your code neat and organized, it is wise to use standard naming conventions. These will help us define the variables and objects with names that contain a hint, usually 3 to 4 letters, stating their purpose or usage. As we develop our code, these naming formats will prevent the misuse of these variables in a way that deviates from their purpose.
For example:
If we define a variable to store the month , we can name the variable “mnth
“. In the middle of the code there are chances that you could use this variable to store the month as a string in one place and an integer equivalent of a month in another place. This might later lead to confusion and maintenance overhead.
In this case, the variable can be defined with the the names below to avoid confusion:
- “strmnth” or “str_mnth” to store a string i.e. August for instance
- “intmnth” or “int_mnth” to store the month as a number i.e. 8 (for August)
VBA Naming Conventions
In VBA we have several datatypes which don’t need to be defined before use. For example, there is a common datatype named “variant” which can be used to store data of any type.
As I’ve been saying, there are predefined standard naming conventions that can be used for each such datatype.
The standard format to define a variable is :
[<Scope of the variable>] + <type of the variable> + < name of the variable>
Explanation
Scope of the Variable:
This defines the accessibility/visibility of a variable within/outside the framework/project/code modules. In general, scope is classified as either “Private” or “Public”. “Public” variables are also called “Global” variables.
The value should be denoted by a single letter as below.
- “m” for Private variables and
- “g” for Public/Global variables
However, the square brackets indicate that this is optional.
Types of variables:
This refers to the data type of the variable. The suggested list of short codes that can be used for each of the datatypes available in VBA are listed below.
S.no | Data type | Suggested short code | Data type info |
1 | integer | I (or) int | 16-bit (4 bytes) signed integer |
2 | long | l (or) lng | 32-bit (8 bytes) signed integer |
3 | string | s (or) str | a VB string that can hold around 2 billion UNICODE characters |
4 | numeric | n (or) num | integer or long data type (4 to 8 bytes) |
5 | currency | c (or) cur | 64-bit (16 bytes) integer divided by 10000 |
6 | variant | v (or) var | a VB variant – can hold data of any type |
7 | boolean | b (or) bln | a true or false value |
8 | double | dbl | a double-precision (8 bytes) floating point number |
9 | single | Sng | a single-precision (4 bytes) floating point number |
10 | float | Flt | a floating point number of any precision (any no. of bytes) |
11 | object | obj (or) o | a generic object variable (late binding) |
12 | control | ctl (or) ctrl | a generic control variable |
13 | decimal | Dcl | 16 bytes / 16-bit decimal value |
14 | Dictionary | Dic or dict | A dictionary object like an array to store key and value pairs |
15 | Array | arr | A single / multi dimensional list that can store values. It is a very common object used in all programming languages. |
16 | Workbook | wrkbk | An excel object that represents an excel workbook |
17 | Worksheet | wrksht | An excel object that represents an excel worksheet |
18 | Range | rng | A sequence of cells in an excel sheet |
19 | shapes | shp | A shape object of Ms. Office |
Name of the variable:
The name of the variable is a user-defined name that explains the purpose of the variable.
For example:
- Fname indicates the firstname
- Lname indicates the lastname
- Dob indicates some date of birth
- Age indicates the age of a person
- Fath_age can indicate the father’s age
Examples for naming variables or objects in VBA
S.no | Datatype and purpose of the variables / objects | Suggested variable or object names |
1 | Global string variable for Firstname | gstrFname (or) g_str_Fname |
2 | Private integer variable for Age | mintage (or) m_int_age |
3 | Boolean variable to represent “finding some value” | blnflag (or) bln_flag |
4 | String to represent a car model | strcarmod (or) str_carmod |
5 | Global string variable to store username | gstrusername (or) g_str_usr |
6 | Private string variable to store Password | mstrpwd (or) m_str_pwd |
7 | Long variable to store rate of interest (ROI) | lngROI (or) lng_roi |
8 | Date variable to store data of birth | dtdob (or) dt_dob |
9 | Array to store the list of weekdays | arrweekdays (or) arr_weekdays |
10 | Dictionary object to store username and passwords | diccred (or) dic_cred |
11 | Worksheet to list the student details | wrkshtstud (or) wrksht_stud |
12 | Workbook to hold all loan details | wrkbk_loan (or) wrkbkloan |
13 | Shape to represent a note | shpnote (or) shp_note |
14 | Range of cells to define and use for formatting header of a table | rngheader (or) rng_header |
15 | A global variant to hold the salary | gvarsal (or) g_var_sal |
16 | Private numeric variable to represent the year of birth | mnumyob (or) m_num_yob |
17 | Currency variable to store the bank balance | cur_bbal (or) curbbal |
The code to declare these in the same order as above is available in the below code snippet.
Sub sample_coding() Dim gstrFname, g_str_Fname As String Dim mintage, m_int_age As Integer Dim blnflag, bln_flag As Boolean Dim strcarmod, str_carmod As String Dim gstrusername, g_str_usr As String Dim mstrpwd, m_str_pwd As String Dim lngROI, lng_roi As Long Dim dtdob, dt_dob As Date Dim arrweekdays, arr_weekdays ' as array - late binding Dim diccred, dic_cred As Dictionary Dim wrkshtstud, wrksht_stud As Excel.Worksheet Dim wrkbk_loan, wrkbkloan As Excel.Workbook Dim shpnote, shp_note As Shape Dim rngheader, rng_header As Range Dim gvarsal, g_var_sal As Variant Dim mnumyob, m_num_yob As numeric Dim cur_bbal, curbbal As Currency End Sub
Naming form controls
A user form in any VBA project can have numerous controls that are automatically named sequentially.
For example, if we add 5 textboxes in a user form, they automatically have the names textbox1, textbox2, textbox3, textbox4 and textbox5. In this case, it’s difficult to keep in mind the purpose of each textbox.
Also, a user form generally has a label and an input control for every field of data stored in its backend database.
For instance, on a login user form , we can find a pair of controls (a label and a textbox) for Username. Here using naming conventions, we cannot name both controls str_username
. It would be too confusing. Hence, we have to name the label lblusername
and the textbox txtusername
.
From this explanation, it probably is clear that VBA form controls also have naming conventions which need to be put to practice. Below is a list of form controls in VBA available with a short explanation. The naming conventions suggested for them are provided along with some examples .
S/N | Control | Description | Suggested naming convention | Example |
1 | Command button | A button to do some action | cmd | cmdSubmit |
2 | Button | A button to do some action | btn | btnCancel |
3 | Combo Box | A dropdownlist from which the user can select values. It can be modified to be a’ textbox cum listbox’. | cbo | cboSubjects |
4 | CheckBox | Used for selecting options. Any number of check boxes can can be selected at a time. This is found in a group. | cb | cbHobbies |
5 | CheckBox | Used for selecting options. Any number of check boxes can can be selected at a time. This is found in the form of a list. | cbl | cblSubscriptions |
6 | List Box | Similar to a combobox with the difference that multiple options can be selected. Depending on the length of the list and the display size, the control might ave scrollbars within. | lst | lstMonths |
7 | Text Box | An input control with several flexible properties. | txt | txtName |
8 | Scroll Bar | A scrollbar control that helps in navigation. | scr | scrStudentInfo |
9 | Spin Button | Used to increase or decrease numeric value by clicking on up or down arrows that are displayed in the spin button | spn | spnDay |
10 | Option Button | Used for true or false values. Only one option button in a group can have a true value at a time. On selecting one option, the other options automatically become deselected or false. | opt | optGender |
11 | Label | Used to display some text to the user, which cannot be changed during runtime (static text). Eg: Labels and instructions | lbl | lblStuName |
12 | Image | A control that can display images | img | imgPhoto |
13 | Toggle Button | Button that has on and off positions | tgl | tglMode |
14 | UserForm | A user form that contains all other controls | frm | frmLogin |
15 | Frame | Can help in grouping the other controls | fra | frmAddress |
16 | Tabstrip | Helps create tabs depending on your requirements | tbs | tbsTeachers |
17 | Multipage | Multipage control groups other controls into multiple categories and helps to display several controls in a small area | mup | mupEmployee |
Introduction to the Reddick VBA Naming Conventions
Reddick VBA, or RVBA, naming conventions are guidelines invented by several authors to help VBA developers be on the same page by using standard naming conventions.
These are named after and edited by Greg Reddick. The conventions are specially designed for the VBA language.
The suggested syntax for an object name is
[<prefixes>]<tag>[<BaseName>[<Suffixes>]]
In general, square brackets are used to indicate that the part of the syntax is optional. On observing these square brackets in the syntax closely, one can understand that a suffix is optional within the BaseName.
Syntax Explanation:
Prefixes:
These are in lowercase. They define or indicate the scope of the variable. RVBA guidelines prescribe several prefixes as mentioned below.
- ‘a’ – array object name
- ‘i’ – index
- ‘m’ – Private variables
- ‘s’ – local or Static variables
- ‘g’ – Global or Public variables
- ‘c’ – count of a specific object type
- ‘h’- a handle to any windows object
- ‘r’ – a parameter or argument that is passed by a reference
For Example:
- astrBookTitles
- hWndLogin
- iastrHobbies
Tag:
This represents the datatype of the variable. It should be completely in lowercase. There are a wide range of standard naming tags that can be used. Below are the categories into which the tags are classified along with examples for each.
S.no | Categories of Tags | Examples |
1 | Variables | Dim intSum As Integer, lngHeight As Long, curSalary As Currency |
2 | Properties | Dim frmsStudentdata As Collection |
3 | Collections | Dim intsMarks As Collection |
4 | Constants | Dim lngcPi As Long ‘ a constant value Pi= 3.14 |
5 | Menu items | mnuView, mnuInsert |
6 | Data types: Enumerated types | Public Const estcErr104 As String = “Invalid data type” Public Const estcErr105 As String = “Subscript out of range” Dim estAddress as String |
7 | Data types:Classes and User-defined data types | Public Type salPayroll Dim salConveyance as salPayroll |
8 | Polymorphism | Name the base class as “vehCar” ‘Declare Dim vehBenz as vehCar'(derived class of vehCar) Dim vehHyundai as vehCar'(derived class of vehCar) |
9 | Procedure names | Built-in and User-defined: txtPwd_OnChange, cmdSave_Click, cmdCancel_DblClick PrintReport, ExtractData, DisplayStatus |
10 | Parameters | Public Sub FindAge(ByVal dateInput As Date , ByRef rintAge As Integer) |
11 | Labels | DateOfBirth, RateOfInterest |
BaseName:
These are word(s) that give information about what the variable represents. Uppercase needs to be used for the first letter of every word in the BaseName.
For Example:
- DataOfBirth
- DateOfJoining
- PenName
Suffixes:
Provide more information about the meaning or purpose of the BaseName. Uppercase needs to be used for the first letter of every word as in the BaseName. There is a wide range of standardized suffixes to use from. However, you are free to define your own suffix for any variable. RBVA provides some commonly used suffixes as below.
- Min – the absolute first element in any array or a similar object
- First – the first element in an array or a similar object
- Last – the last element in an array or a similar object
- Lim – the upper boundary of an array or similar object
- Max – the absolute last element of an array or a similar object
- Cnt – An item that is used as a counter for an object like an array.
For Example:
- iaintMarksMin
- iaintMarksMax
- iaintAverageCnt
While we follow the general naming conventions that are easy to remember and use, the RVBA naming guidelines can help in developing quality code. RVBA also provides a variety of naming conventions for objects used in Ms. Access, DAO,VB, ActiveX Data objects, ADO extension for DDL and Security (ADOX), JET & replication objects, common control and other custom control objects.
Personally, I would choose to follow the normal naming conventions (can also be user-defined) for a short term or small project to save yourself time. Maintenance would be limited too.
However, if you’re well versed in RBVA guidelines, then these cab be followed without a second thought. But when it comes to a permanent project that is going to be used in the long run, for example, a banking utility project, it would be a great option to follow the RVBA guidelines as there are allowances for the code to move from one developer to another for regular maintenance and enhancements.
Conclusion
Naming conventions make our life easier when it is time to maintain our code or perform enhancements. They help us to organize a bunch of code in proper categories and help us understand the purpose and type of the objects.