На чтение 5 мин. Просмотров 7.3k.
Иерархия объектов — соединение точек
Объекты VBA организованы в иерархию, что облегчает их использование. В верхней части этой иерархии находится приложение Excel. Все объекты в Excel являются членами или подчиненными элементами объекта Application.
Вот
полная строка кода, которая начинается на уровне Application.
Application.Workbooks(«Book1.xlsx»).Worksheets(«Sheet1»).Range(«A1»).Value = 100
Точки между словами позволяют нам ссылаться на членов иерархии сверху вниз. Таким образом, Application является верхним уровнем иерархии, а Workbooks является членом Application. Свойство Workbooks () возвращает коллекцию всех открытых книг на компьютере.
Мы ссылаемся на имя книги в свойстве Workbooks, чтобы
вернуть объект книги. Это может показаться странным, но в основном это
позволяет нам сообщать VBA, на какой объект мы ссылаемся.
Ниже мы ссылаемся на свойство Worksheets, которое возвращает
коллекцию всех листов в книге. Рабочие листы являются частью объекта Workbook.
Application.Workbooks(«Book1.xlsx»).Worksheets(«Sheet1»)
Опять же, мы указываем имя листа «Sheet1» в свойстве Worksheets для возврата объекта листа.
Вы можете увидеть, как мы проходим путь к объекту Range и значению ячейки A1.
Application.Workbooks(«Book1.xlsx»).Worksheets(«Sheet1»).Range(«A1»).Value = 100
Важно отметить, что у каждого объекта есть много разных членов, которые мы можем использовать для ссылки на различные объекты. Например, членами объекта «Рабочий лист» могут быть: «Диапазоны», «Сводные таблицы», «Фигуры», «Диаграммы», «Список» и т.д.
Как пример, подумайте обо всех объектах на вашей кухне.
Вероятно, существуют десятки, если не сотни объектов, которые имеют свойства и
могут выполнять действия. Эти объекты могут быть членами больших коллекций.
Нож шеф-повара входит в коллекцию всех принадлежащих вам кухонных принадлежностей. Каждый из этих инструментов имеет разные свойства и может выполнять разные действия.
Наша иерархия объектов для ножа на кухне может выглядеть следующим образом.
House.Rooms(«Kitchen»).Areas(«Knife Block»).Tools(«Chef Knife»).Clean = True
Видите, как мы начинаем с дома и приближаемся, чтобы найти нож, а затем устанавливаем его свойства.
Квалификационные объекты в VBA
Если вы состоите в браке или живете с близким другом, то вы уже много знаете о соответствующих объектах.
На днях мы с женой были на кухне и она сказала: «Можешь включить свет, пожалуйста?»
Я сказал: «Конечно!» И включил кухонный свет.
Я сделал некоторые предположения о том, о каком свете она
говорила, потому что мы оба были на кухне, а на нашей кухне только один свет.
Ей не нужно было говорить: «Не могли бы вы включить свет на кухне, которая находится над раковиной и управляется настенным выключателем?» Окружающая среда, в которой мы оба находились, соответствовала контексту, и она смогла сократить свой вопрос.
VBA также позволяет нам делать эти предположения при ссылках
на объекты. Если вы не указываете рабочую книгу или рабочий лист в строке кода,
то VBA предполагает, что вы ссылаетесь на активную рабочую книгу и активный
рабочий лист.
Это позволяет нам сократить наш код, облегчая чтение и
запись.
- Полная запись — Application.Workbooks(«Book1.xlsx»).Worksheets(«Sheet1»).Range(«A1»).Value = 100
- Сокращенная (предполагает ActiveSheet и ActiveWorkbook) — Range(«A1»).Value = 100
Первая строка кода считается «полной», поскольку она ссылается на все родительские элементы оцениваемого объекта.
Вторая строка кода будет работать так же, как и первая, если активной книгой была Книга1, а активным листом — Лист1.
Хотя сокращение нашего кода может облегчить нашу жизнь, оно
также может привести к проблемам!
Предположения могут привести к неприятностям и вызвать ошибки!
Несколько дней назад я был в спальне, и моя жена кричала из кухни: «Эй, я могу выбросить это ???» Теперь, хотя я только что вышел из кухни, я не знал, о чем она говорила. Это когда-нибудь случалось с тобой?
Что еще более важно, это когда-либо приводило к спору или грубому ответу? Я знаю, что я виновен! Ну, я не поняла ее вопрос, потому что у меня не было контекста. Иногда у нас такие близкие отношения, что мы думаем, что наш близкий друг может читать наши мысли и видеть нашими глазами, и мы делаем предположения, которые могут превратиться в недоразумение. Благослови мою жену за веру, что я умнее, чем на самом деле… 🙂
У VBA точно такие же проблемы с недоразумениями. Они
вызывают ошибки и могут быть опасны! Вы должны быть осторожны с тем, как вы
сокращаете свои вопросы и команды.
Например, следующая строка кода очистит значения и формулы
всех ячеек на активном рабочем листе.
Cells.ClearContents
Если вы не скажете VBA, какой лист, из какой книги вы хотите
очистить, это может означать катастрофу! Вы не можете отменить это действие.
Таким образом, вы хотели бы уточнить эту строку кода, чтобы
сообщить VBA, на какую рабочую книгу и рабочий лист вы ссылаетесь.
Workbooks(«Book1.xlsx»).Worksheets(«Sheet1»).Cells.ClearContents
Эта строка кода предотвращает любые недоразумения и
возможные бедствия.
Что дальше?
В следующей статье мы рассмотрим несколько советов по
чтению, написанию и запуску вашего кода. Мы также рассмотрим некоторые способы
повышения эффективности вашего кода.
Предыдущая статья:
Введение в VBA: Макросы. Объяснение на кухне (Часть 1 из 3)
Следующая статья:
Введение в VBA: Чтение, написание и запуск макроса (часть 3 из 3)
Для начала
рассмотрим внимательно те объекты,
которые уже есть в составе Microsoft
Excel.
Разрабатывать свои собственные новые
объекты нам придется, опираясь на
существующие. Как вы понимаете, стандартных
объектов в составе такой сложной системы,
как Microsoft
Excel,
довольно много. Однако, для начального
знакомства с программированием в среде
Excel
нам будет достаточно познакомиться
только с некоторыми из них. В первой
части настоящего пособия мы познакомимся
с программными средствами для управления
ячейками рабочего листа – сравнительно
простыми и легкими в освоении. Поэтому
перечисление объектов Microsoft
Excel
мы пока ограничим только теми объектами,
которые потребуются нам в дальнейшем.
Кратко иерархия,
то есть состав и вложенность объектов
Microsoft
Excel
может быть представлена следующим
образом:
Application |
|||||||||||
WorkBooks |
|||||||||||
WorkSheets |
|||||||||||
Cells |
|||||||||||
Рис 1. Иерархия |
На самом
верхнем уровне иерархии находится
объект Application
(по-русски
– «Приложение»). В качестве этого
объекта, а он всегда один – выступает
сама программа Microsoft
Excel,
которая выполняется в данный момент на
компьютере и с которой работает
пользователь.
Каждая
программа Microsoft
Excel
может открыть и работать одновременно
с несколькими файлами, в которых находятся
данные пользователя, построенные на
основании этих данных таблицы, диаграммы
и так далее. В терминах Microsoft
Excel
каждый такой файл называется «Рабочая
книга», или WorkBook
по-английски.
А все одновременно открытые рабочие
книги образуют множество объектов –
WorkBooks.
Естественно, что данный конкретный
момент времени пользователь может
работать только с одной конкретной
рабочей книгой, то есть в терминах Excel
– только с одним объектом из множества
WorkBooks.
А это означает, что мы должны иметь
возможность обращаться (выделять из
множества) только к одному объекту
WorkBook.
Для этого используется имя файла,
содержащего данную рабочую книгу.
Например, если пользователь открыл
одновременно две рабочие книги с именами
«Резонанс» и «Данные измерений», то
обратиться к объекту второй рабочей
книги можно так:
WorkBooks(“Резонанс”).
В свою
очередь, каждая рабочая книга может
состоять из одного или нескольких
рабочих листов. При создании новой книги
в ней автоматически создаются три
рабочих листа с именами «Лист1»,
«Лист2» и «Лист3» соответственно.
Вы можете видеть эти имена на закладках
в нижней части окна Excel:
При необходимости
имена листов могут быть изменены. Каждый
рабочий лист является объектом типа
WorkSheet,
или «Рабочая таблица» по-русски. Все
листы, входящие в рабочую книгу, или все
объекты WorkSheet
образуют множество объектов – WorkSheets.
Обратиться к конкретному листу конкретной
рабочей книги можно следующим образом:
WorkBooks(“Резонанс”).WorkSheets(“Данные”)
Интересно
разобраться, чем же является, например,
объект WorkSheets(“Данные”)для
объекта WorkBooks(“Резонанс”).
В объектно – ориентированном
программировании принято, что вложенные
объекты являются свойствами
более высоких по уровню иерархии
объектов. Запомним это.
Каждый из листов
рабочей книги состоит из множества
ячеек. Каждая ячейка с точки зрения
Microsoft
Excel
является объектом типа Cell
или «Ячейка» по-русски. Множество
объектов Cell
образуют объект Cells,
принадлежащий объекту WorkSheet,
то есть листу рабочей книги. Обращаться
к конкретной ячейке можно двумя способами.
Во – первых, можно указать адрес ячейки,
как номера сроки и столбца, на пересечении
которых эта ячейка находится. Во –
вторых, каждой ячейке можно присвоить
собственное имя. Это имя должно быть
уникальным на данном рабочем листе. В
этом случае обратиться к ячейке можно
просто указав это имя. Второй способ,
конечно, является предпочтительным,
особенно, если в качестве имен выбирать
осознанные и понятные всем обозначения.
Здесь следует
особо остановиться на уникальности
имен рабочих листов и ячеек. Все листы
в одной рабочей книге должны иметь
разные имена. Точно так же, каждая ячейка
на данном рабочем листе должна иметь
собственное уникальное имя. Однако, нам
ничто не мешает, например, иметь одинаковые
имена рабочих листов в разных рабочих
книгах и одинаковые имена ячеек на
разных листах рабочей книги. И это не
удивительно, ведь каждая открытая
рабочая книга создает собственный
уникальный объект в Excel,
связанных только с этой книгой. То же
относится и к рабочим листам внутри
одной книги. Естественно, что обращаться
к таким ячейкам и листам можно только
по так называемому составному
имени, образованному именами всех
объектов, расположенных выше в
рассмотренной иерархии. Отдельные имена
объектов в составном имени отделяются
друг от друга символом «.» (точка). Именно
эта система использовалась нами в
приведенных выше примерах.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
10.02.20167.35 Mб14Методичка архитекторы_инженерка рус.docx
- #
- #
- #
- #
- #
- #
- #
- #
Aigeus Пользователь Сообщений: 18 |
#1 24.07.2014 17:20:27 Здравствуйте.
По логике вроде все понятно. Обращаемся к самому «большому» объекту (к нашему активному листу) потом объекту «поменьше» (к диаграммам) и потом к методу count объекта Chartobjects. Т.е. тут вроде понятно, что понятие «лист» больше чем понятие «диаграммы». А вот как мне понять что один объект является частью другого, если эти объекты мне не знакомы вообще? Где найти такую информацию? Т.е. где посмотреть иерархию классов? |
||
Jack Пользователь Сообщений: 352 |
что-то типа Object Browser? Alt+F11, F2 |
Aigeus Пользователь Сообщений: 18 |
Jack
Там не указано. Там просто список объектов его свойств и методов, но нет инфы частью чего он является и что «ниже» него. |
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#4 24.07.2014 18:02:45
как так — нет??? http :/ /joxi.ru/7BHRU4wyTJCDYx2X9Wc F1 творит чудеса |
||
Aigeus Пользователь Сообщений: 18 |
#5 24.07.2014 18:32:06 Максим Зеленский
То же самое. Вы нашли свойство range которое является членом класса worksheets. А worksheets часть библиотеки классов Excel.
или
но никак не
или даже просто
Т.е. по иерархии объект(класс) Chartobjects стоит ниже чем объект(класс) Worksheets. Вот где эту иерархию найти? Вот еще один пример. Что бы обратится к ячейке другого листа и книги нужно прописать вот такую иерархию: |
||||||||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
А Вы не пробовали по F2 с объекта Application начать изучать иерархию? Там вот все видно — кто под кем. Можете себе даже схемы составить. Так же можно на MSDN обратиться — там структура сайта с левой стороны четко показывает кто кому подчиняется. А еще ООП не имеет отношения к иерархии. Это совершенно иное и не имеет отношения к VBA вообще, т.к. он не является объектно-ориентированным языком программирования. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
в старой справке были картинки с иерархиями, почему-то сейчас их убрали, а зря, наглядно было. |
|
nerv Пользователь Сообщений: 3071 |
#8 24.07.2014 21:17:16
обоснуй Изменено: nerv — 24.07.2014 21:17:36 Чебурашка стал символом олимпийских игр. А чего достиг ты? |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Саша, а мог бы перед тем как делать резкие наезды и восклики «обоснуй» погуглить В центре ООП находится понятие объекта. Объект — это сущность, которой можно посылать сообщения и которая может на них реагировать, используя свои данные. Объект — это экземпляр класса. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией. Если кто-то мне сейчас покажет реализацию полиморфизма в VBA — признаю полностью и безоговорочно его принадлежность к языкам ООП. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Иван Пользователь Сообщений: 33 |
Вставлю свои пять копеек в тему, точно не скажу, т.к. сужу по другим языкам, но в ВБА тоже видел это свойство — называется оно Parent http://msdn.microsoft.com/en-us/library/office/aa224980(v=office.11).aspx Автоматизация приложений, разработка ботов, парсинг сайтов, поиск информации и многое другое на языках : Delphi, C++, VBA. Информация в профиле. |
nerv Пользователь Сообщений: 3071 |
#11 28.07.2014 15:55:14
это не наезд. Это быстрый способ задать вопрос: «Почему ты считаешь, что VBA не является объектно ориентированным языком программирования?»
Иван, уже привел пример. Проблема в том, что это встроенные (объекты приложения) объекты. У них, как мне видится, и наследование есть и полиморфизм =)
А с чего ты решил, что будет «нормальное человеческое наследование» в языке, который больше не развивается? =) Чебурашка стал символом олимпийских игр. А чего достиг ты? |
||||||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#12 28.07.2014 21:34:44
Все понятно. О чем можно говорить дальше, если ссылку на родительский объект(реализованную как свойство объекта без возможности изменить реализацию метода или свойства как этого объекта, так и того, на который ссылка) начали приравнивать к полиморфизму.
А я и не решал ничего. Я лишь указал на то, что без нормального наследования язык не может быть объектно-ориентированным. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||
If you’ve read any of the other macro or VBA tutorials in Power Spreadsheets, you’ve probably noticed that some terms keep popping up over and over.
One of the concepts that keep coming up, and will continue to come up in future tutorials, is that of objects. The main reason for this is simple:
VBA is (loosely) based on Object Oriented Programming. At a basic level, this (roughly) means that the VBA paradigm mostly relies on working with (or manipulates) objects.
As a consequence of the above, if you want to really master Excel macros and Visual Basic for Applications, you must have a good understanding of the following 3 topics:
- Objects.
- How to manipulate VBA objects.
- Excel’s VBA object model.
My 2 main purposes when writing this VBA tutorial are to:
- Explain the main characteristics of Excel’s VBA object model.
- Illustrate how you construct VBA object references when working with Visual Basic for Applications. This allows you to identify the Excel VBA object you want to work with and manipulate.
More precisely, in this macro tutorial I explain the following topics:
I’ll say from the start that the topics of Excel’s VBA object model and building VBA object references are not particularly simple. However…
Your knowledge and understanding of Excel’s VBA object model and object references will improve as you continue to study, and work with, Visual Basic for Applications. Therefore, don’t worry if, after reading this VBA tutorial things are not absolutely clear. This guide should provide you with a solid base and, with some work I’m sure you’ll master this topic and know all you need about Excel VBA objects.
Let’s begin by answering the first question that you probably have regarding the introduction I’ve made above by understanding…
Why Excel’s VBA Object Model Is Important
Visual Basic for Applications is included in most products that are part of Microsoft Office. In addition to Excel, the list of applications that have VBA includes PowerPoint, Word and Access.
This underscores one of the great advantaged of learning VBA:
Once you know Visual Basic for Applications, you can immediately start writing macros for the other products that use VBA. In fact, you’ll be able to create macros that work across all of those different applications.
One of the main topics you need to master in order to reach those levels of expertise is objects. At a basic level, VBA manipulates objects.
Each individual Application that works with VBA (for example, Excel, Word, PowerPoint, Outlook) has its own unique object model. Having a good understanding of the principles behind objects and object models helps you work with VBA in these different Applications.
OK. So Excel’s VBA object model is clearly important. The next question you may have is…
What Is Excel’s VBA Object Model
At a basic level, the Excel VBA Object Model is a hierarchy of the objects you can use when working with Excel VBA.
Among other advantages, this hierarchy makes VBA objects easier to reference. Therefore, let’s take a closer look at…
Excel’s VBA Object Hierarchy
An object hierarchy looks as follows:
- Level #1: At the very top, you have one single object.
- Level #2: The object at the top of the hierarchy contains some objects.
- Level #3: In turn, the object in the second level of the hierarchy, may contain other objects.
- Level #4: The objects in level 3 may contain other objects.
- …
- You probably get the idea… Objects may contain other objects. The process repeats itself until you reach objects that don’t contain any other objects.
When you’re working with a particular software application, the first object to consider is the application itself (the Application object). Generally, the application is at the top of the hierarchy.
In the case of Excel, the Application object is Excel itself.
Since Visual Basic for Applications can communicate with other applications and programs beyond Excel, this isn’t strictly speaking the top level of the hierarchy. However, you’ll usually see most people referring to the Application object itself as being the top of Excel’s VBA object hierarchy. That’s the convention I use in this macro tutorial.
The Application object contains other VBA objects. Some of the VBA objects contained by the Excel Application object are the following:
- Add-Ins, which contains all Add-In objects.
- Windows, which (at this level) contains all Window objects in the application.
- Workbooks, which contains all Workbook objects.
Each of these VBA objects, in turn, is capable of containing other objects. For example, some of the VBA objects that can be contained within a Workbook object are the following:
- Charts, which contains Chart objects.
- Names, which contains Name objects.
- VBProjects, which represents open projects.
- Windows, which (at this level) contains Window objects in the specified Excel workbook.
- Worksheets, which contains Worksheet objects.
Again, these VBA objects can contain other objects. Continuing with the example above, a Worksheet object can contain the following VBA objects:
- ChartObjects, which contains ChartObject objects.
- Comment, which represents a cell comment.
- Hyperlink, which represents a hyperlink.
- Name, which represents a defined name for a particular cell range.
- PageSetup, which is used to store printing information.
- PivotTables, which contains PivotTable objects.
- Range, which represents cells, rows, columns, selections of cells with contiguous blocks of cells, or 3-D ranges.
- As I explain here, the Range object is one of the most important (and most frequently used) objects.
Graphically, the portion of Excel’s VBA object hierarchy described above looks roughly as follows:
The image above illustrates only a very small portion of Excel’s VBA object hierarchy. The Excel Object Model has a very large number of objects. A full diagram of Excel’s VBA object hierarchy exceeds the scope of this Excel VBA Object Model Tutorial.
What can you do about this?
You can definitely master Visual Basic for Applications despite the huge amount of Excel VBA objects. There are several reasons for this, including the following:
- In practice, you’ll usually deal with a limited amount of VBA objects. There are some objects that you’re unlikely to ever need (or will very rarely need).
- If you’re stuck when working on a particular problem, you can use certain strategies for purposes of finding out which Excel VBA objects to use. You can, for example, use the macro recorder to discover VBA objects.
Additionally, as you continue working with Visual Basic for Applications, you’ll start noticing the logic behind the structure of the Excel VBA object hierarchy.
Object Collections
Collections are defined by 2 main characteristics:
- They are themselves objects.
- Their main purpose is to group and manage VBA objects of the same class.
In other words, collections are VBA objects that are used to group and manage other objects (which are related).
The fact you can group and manage several VBA objects by using collections is extremely useful in some situations. Imagine, for example, that you want to do something with or to a particular group of objects. If all of these objects are part of the same collection, you can structure your VBA code to go through each of the members of the collection and carry out the desired actions. As you can imagine, this structure is simpler than, for example, having to list each of the collection members individually.
In other words, collections allow you to work with a complete group of VBA objects at the same time, instead of working with each single object.
The following are examples of common collections:
- Workbooks, which is a collection of all the Excel workbooks that are currently open.
- Worksheets, the collection of all the Excel worksheets within a particular Workbook.
- Charts, which groups all chart sheets that are inside a particular Workbook.
- Sheets, which is a collection of all the sheets within a particular Workbook. In this case, it doesn’t matter the type of sheet. Therefore, this collection includes both worksheets and charts sheets.
In fact, if you go back up to the explanation of Excel’s VBA object hierarchy, you’ll find several other examples of collections. Basically, any VBA object which is listed there as containing other objects is a collection.
By now you probably have a firm grasp of what an object and a collection are. So let’s get into the actual practice. Let’s look at how you can start referencing VBA objects with Visual Basic for Applications:
Introduction To VBA Object References
Knowing how to refer to objects when writing VBA code is essential. The reason for this is that, obviously, when you want to start working with a particular VBA object, you must identify it.
The question is, how do you do it? How do you refer to an object in Visual Basic for Applications?
Let’s take a look at some of the most common and basic situations. The purpose of this section is to serve as an introduction to VBA object references. There are many other more advanced cases. For example, I explain several ways to refer to VBA’s Range object in Excel VBA Object Model And Object References: The Essential Guide which you can find in the Archives.
Object References: Fully Qualified References And Connecting VBA Objects
Let’s start by taking a look at how to refer to an object by going through the whole hierarchy of Excel VBA objects. This is known as a fully qualified reference because you tell Excel exactly what VBA object you want to work with by referencing all of its parents.
As I explain in the following sections, you can usually simplify fully qualified references. However, you must learn how fully qualified references work. They are the basis of VBA object references and, in practice, you’ll use them most of the time. Additionally, they’re quite useful for purposes of understanding better the VBA code behind your macros.
You already know that the object at the top of the Excel VBA object hierarchy is Application. Referring to this object is very easy. In the Visual Basic Editor, you refer to Application by typing:
Application
From there on, you need to start moving along the hierarchy by using the dot (.) operator. In other words, you connect each VBA object to the previous one (the object parent) by using a dot (.). Those dots (.) are used to connect and reference members of Excel’s VBA object model from the top down.
To see this in practice, let’s go back to the example of the Excel VBA object hierarchy that I display above. Assume that you want to refer to a Range object. As shown in the graph displayed below, this object is at the bottom of the pyramid used in the example. There are 2 VBA objects and 3 steps between the Application and the Range object, as shown by the image below:
You already know that you simply need to connect the different objects with a dot (.) while you’re going down the Excel VBA object hierarchy. In other words, you know that, in very general terms, you can refer to a Range object using the following basic structure:
Application.Workbooks.Worksheets.Range
Graphically:
Easy, right?
This is, however, just a basic framework. You’ll notice that this very basic structure is not actually identifying an individual VBA object. You may be wondering:
- If there are several workbooks or worksheets how does Excel know to which one I’m referring to?
- How does Excel know what is the range I want to work with?
These questions can be summarized by the following:
How do you refer to a particular object within a collection?
Let’s answer this question so that you can complete the fully qualified reference above.
VBA Object References: An Object From A Collection
It is likely that, most of the time, you’ll be working with a particular VBA object from a collection. This is in contrast with the collection as a whole.
Note that you can also work with a collection as a whole. In fact, the ability to do this is one of the advantages of collections.
However, let’s focus for now on how you can reference an object from a collection. For these purposes, you can use either of the following 2 options:
Option #1: Using The VBA Object Name.
In this case, the syntax that you must use to refer to an object is “Collection_name(“Object_name”)”. In other words:
- #1: The name of the relevant collection (collection_name) goes first.
- #2: Collection_name is followed by parentheses ().
- #3: Within the parentheses, you have the name of the individual VBA object (Object_name).
- #4: The VBA object name is within quotations (“”).
- If you fail to include the quotation marks, Excel understands that the VBA object name is a variable name. Therefore, it won’t be able to identify the object you want.
- In other words, don’t forget the quotations when using this VBA object reference method.
For example, if you’re working with an Excel Workbook that has 3 worksheets and you want to work with Sheet1, you can use either of the following:
Worksheets("Sheet1")
or
Sheets("Sheet1")
Option #2: Using Index Number.
If you choose to use this option, you refer to a VBA object using “Collection_name(Index_number)”. This structure is substantially the same as that above with the following 2 differences:
- Instead of using the VBA object name, you refer to it by using its index number.
- You don’t use double quotes within the parentheses, just a number.
Going back to the example above, where you’re want to work with Sheet1, you can use either of the following 2 options:
Worksheets(1)
or
Sheets(1)
Now that you know how to refer to an individual VBA object within a collection, let’s go back to the fully qualified reference that I used as an example in the section above:
Application.Workbooks.Worksheets.Range
How can you complete this, assuming that the object you want to work with is cell A1 from Worksheet Sheet1 within Workbook Book1?
If you’re using the object name to refer to each of the individual VBA objects (option #1 above), the fully qualified reference for this cell is:
Application.Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1")
As you may guess, if you had to reference each and every single object using a fully qualified reference, your VBA code would get quite long very fast. From a typing perspective, this may get a little bit annoying. Additionally, and perhaps more importantly, these very long pieces of VBA code can be difficult to read.
There are some ways in which you can simplify object references, making the VBA code much shorter. Let’s take a look at some of the methods that you can apply for these purposes…
Simplifying Fully Qualified Object References
The ability to simplify a VBA object reference has several advantages. Mainly, this allows you to shorten your VBA code and make it easier to read.
The main reason why you can simplify fully qualified object references is because Excel’s VBA object model has some default objects. These default objects are assumed by Excel unless you enter something different. This leads me to a very important point, which is that…
Simplifying fully qualified object references is not without dangers. In particular, the second simplification method described below relies on you correctly identifying the current active Workbook and Worksheet. If you make a mistake by for example, thinking that the current active Worksheet is Sheet1 when in reality its Sheet2, you’ll face problems. The most likely issues you’ll encounter in these cases are:
- Excel returns an error.
- Excel returns an erroneous result.
- Excel executes an erroneous action that you can’t undo.
Another possible disadvantage of simplifying fully qualified object references is related to execution speed. This happens, for example, if you’re working with a particular macro that works with several Excel worksheets. In that case, you have to go through all of them to activate them. Needless to say, this isn’t very efficient.
Considering the above, ensure that you’re only using these simplification methods when appropriate. Perhaps more importantly, remember that you shouldn’t blindly simplify fully qualified references all the time.
In fact, you should probably (as a general rule):
- Fully qualify VBA object references; and
- Avoid relying on default objects, with a few exceptions.
- One of these main exceptions, as I explain below, is relying on the Application default object. This particular VBA object is seldom included in VBA code, although there are some cases in which you must reference the Application.
In other words, having a deep knowledge of Excel’s VBA object model and using fully qualified references has 2 main advantages:
- Reliability.
- Accuracy.
An alternative to the extremes of fully qualifying references or simplifying them is using With… End With statements. These statements simplify macro syntax by executing several statements which refer to the same VBA object. At the same time, due to their structure, they allow you to maintain fully qualified object references.
You can see a very simple example of a With…End With statement in this macro that deletes rows based on whether a cell in a given range is blank.
With the warning above in mind, let’s take a look at the methods you can use to simplify fully qualified object references:
Simplification #1: The Application Object.
The main default VBA object is the Application object. As a general rule:
- This object is always assumed; and
- It doesn’t matter where the VBA code is located.
When creating macros, it is assumed that you’ll be working with Excel. In other words, Excel assumes that you’re working with the Application object. Therefore, as you may expect, you can generally omit this Excel VBA object from your object references.
Explicitly referring to (entering) the Application object makes sense in only a few cases.
Applying this shortcut to the statement referring to cell A1 in Sheet1 within Book1 that has been used as an example simplifies the reference as follows:
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1")
Simplification #2: The Active Workbook and Worksheet.
The second group of default objects you can use to simplify fully qualified object references applies when you’re working inside a standard module. Within the Visual Basic Editor, you can usually find standard modules in the Project Window under the Modules node:
In these cases, in addition to assuming that you’re working with the Application object, Excel also assumes that you’re working with the active Workbook.
Therefore, if you know that the current active Excel workbook is the Workbook you want to work with, you can omit that part of the VBA object reference. Continuing with the example above, the statement can then be shortened to the following:
Worksheets("Sheet1").Range("A1")
Finally, if you’re sure that the Excel worksheet you want to work with is the current active Worksheet, you can also omit that part of the VBA object reference. The statement above can then be shortened even further:
Range("A1")
In addition to the dangers of using this simplification that I explain at the beginning of this section, there is a further aspect you must consider. The 2 assumptions that I’ve listed in Simplification #2 above only work as long as you’re in a standard module. Therefore, you must avoid relying on these assumptions when working in another type of module. For example:
Conclusion
Excel’s VBA object model is extremely important. You can’t ignore this topic if you really want to become a master in Excel macros and Visual Basic for Applications.
Excel’s VBA object model is not the simplest topic to understand but, if you practice and study, you’ll eventually master the topic. Then, you’ll be on your way to creating powerful macros that increase your productivity and efficiency when working with Excel.
If you’ve studied this particular VBA tutorial, you not only have a good understanding of what is Excel’s VBA object model, but also know how to start building object references in Visual Basic for Applications. This ability to create appropriate VBA object references is what allows you to tell Excel which object you want to work with and manipulate. This is an essential skill that you now have in your VBA knowledge-box.
Due to the complexity and extensiveness of Excel’s VBA object model, this is a topic that we’re all constantly studying and learning about.
Элемент управления пользовательской формы TreeView, предназначенный для создания древовидной (иерархической) структуры. Примеры кода VBA Excel с TreeView.
UserForm.TreeView – это элемент управления пользовательской формы, предназначенный для отображения информации в виде древовидной структуры, аналогичной древовидной иерархии папок в левой части проводника Windows. Каждый элемент древовидной структуры обычно называют узлом, ветвью или пунктом.
Каждый узел (пункт, ветвь) в древовидной структуре может содержать вложенные ветви, которые называются дочерними узлами. Узлы, содержащие дочерние пункты, называются родительскими. Их можно показывать как в развернутом, так и в свернутом виде.
Пункты элемента управления TreeView можно выбирать и привязывать к этому событию другие процедуры или строки кода VBA Excel. Рядом с ветвями иерархической структуры можно включить отображение флажков (CheckBox).
Добавление TreeView на Toolbox
Изначально на панели инструментов Toolbox нет ссылки на элемент управления TreeView, поэтому ее нужно добавить самостоятельно.
Чтобы добавить TreeView на панель инструментов Toolbox, кликните по ней правой кнопкой мыши и выберите из контекстного меню ссылку «Additional Controls…»:
В открывшемся окне «Additional Controls» из списка дополнительных элементов управления выберите строку «Microsoft TreeView Control»:
Нажмите кнопку «OK» и значок элемента управления TreeView появится на панели инструментов Toolbox:
Для работы кода VBA Excel с элементом управления TreeView необходимо добавить ссылку на библиотеку Microsoft Windows Common Controls 6.0 (SP6)
(цифры у вас могут быть другие). Подключается ссылка в окне «References VBAproject», перейти в которое можно через главное меню редактора: Tools–>References…
Свойства древовидной структуры
Свойство | Описание |
---|---|
Appearance | Внешний вид древовидной структуры (наличие 3D-рамки). По умолчанию cc3D (1) — рамка есть, ccFlat (0) — рамки нет. |
BorderStyle | Отображение границ элемента управления TreeView. По умолчанию ccNone (0) — границ нет, ccFixedSingle (1) — границы есть. |
CheckBoxes | Отображение флажков (CheckBox) рядом с узлами иерархической структуры. По умолчанию False — флажков нет, True — флажки есть. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на TreeView. |
Enabled | Возможность раскрытия узлов и их выбора. True — перечисленные опции включены, False — выключены. |
Font | Шрифт, начертание и размер текста узлов древовидной структуры. |
FullRowSelect | Определяет область выбора и подсвечивания выбранной строки. По умолчанию False — область выбора ограничена текстом, True — область выбора распространяется на всю строку. |
Height | Высота элемента управления TreeView. |
HotTracking | Выделение узла подчеркиванием при наведении на него курсора. По умолчанию False — нет подчеркивания, True — есть подчеркивание. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края иерархической структуры. |
LineStyle | Задает стиль веток. По умолчанию tvwTreeLines (0) — навигационные линии отображаются только у дочерних узлов, tvwRootLines (1) — навигационные линии отображаются у всех узлов. |
Nodes | Возвращает коллекцию узлов. |
SelectedItem | Возвращает выделенный пункт. |
Sorted | Задает или отменяет автоматическую сортировку узлов элемента управления TreeView. По умолчанию False — сортировка отключена, True — сортировка включена. |
Style | Задает стиль древовидной структуры. Она может состоять только из текста или из текста с дополнениями в разных комбинациях: навигационные линии, раскрывающие ветку плюсы, иконки — всего 8 задающих стиль констант. |
TabIndex | Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой свойством AutoTab или нажатием клавиш «Tab», «Enter». Отсчет начинается с 0. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления. |
Visible | Видимость элемента управления. True – TreeView отображается на пользовательской форме, False – TreeView скрыт. |
Width | Ширина элемента управления. |
Программное создание узлов
Создание узлов элемента управления TreeView программным способом в VBA Excel.
Синтаксис
TreeView.Nodes.Add Relative, Relationship, Key, Text, Image, SelectedImage |
Свойство Nodes объекта TreeView возвращает коллекцию узлов, а метод Nodes.Add добавляет в коллекцию новый узел. Обязательным параметром является только Text.
Параметры
Параметр | Описание |
---|---|
Relative | Уникальный ключ (Key) узла, относительно положения которого будет размещен новый пункт в соответствии с аргументом Relationship. |
Relationship | Задает положение добавляемого узла относительно ветки, указанной аргументом Relative. |
Key | Уникальный ключ (имя) создаваемого узла. |
Text | Отображаемый текст узла (ветки, пункта). Обязательный параметр. |
Image | Рисунок (иконка), который будет отображается перед узлом по умолчанию |
SelectedImage | Рисунок (иконка), который заменит Image при выборе узла. |
Константы, которые применяются в качестве аргументов параметра Relationship:
Константа | Значение | Описание |
---|---|---|
tvwFirst | 0 | Новый узел помещается перед всеми узлами того уровня, на котором находится узел, указанный аргументом Relative. |
tvwLast | 1 | Новый узел помещается после всех узлов того уровня, на котором находится узел, указанный аргументом Relative. |
tvwNext | 2 | Новый узел помещается после узла, указанного аргументом Relative (значение по умолчанию). |
tvwPrevious | 3 | Новый узел помещается перед узлом, указанным аргументом Relative. |
tvwChild | 4 | Новый узел создается как дочерний для узла, указанного аргументом Relative. |
Примеры кода VBA Excel с TreeView
Пример 1
Пример создание одного узла первого уровня. Для реализации примера необходима пользовательская форма с размещенным на ней элементом управления TreeView1.
Private Sub UserForm_Initialize() Me.Caption = «TreeView» TreeView1.Nodes.Add , , , «Текст узла первого уровня» End Sub |
Результат работы кода:
Пример 2
Генерация пяти узлов первого уровня с помощью кода VBA Excel. Для реализации примера необходима пользовательская форма с размещенным на ней элементом управления TreeView1.
Private Sub UserForm_Initialize() Me.Caption = «TreeView» Dim i As Byte With TreeView1.Nodes For i = 1 To 5 .Add , , , «Узел первого уровня №» & i Next End With End Sub |
Результат работы кода:
Пример 3
Создание узлов первого, второго и третьего уровней. Для реализации примера необходима пользовательская форма с размещенным на ней элементом управления TreeView1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Private Sub UserForm_Initialize() Me.Caption = «TreeView» With TreeView1.Nodes ‘Создание узла «Node1» и трех его дочерних узлов .Add , , «Node1», «Text Node1» .Add «Node1», tvwChild, «Node1-Child1», «Text Node1-Child1» .Add «Node1», tvwChild, «Node1-Child2», «Text Node1-Child2» .Add «Node1», tvwChild, «Node1-Child3», «Text Node1-Child3» ‘Создание двух дочерних узлов ветки «Node1-Child1» .Add «Node1-Child1», tvwChild, «Node1-Child11», «Text Node1-Child11» .Add «Node1-Child1», tvwChild, «Node1-Child12», «Text Node1-Child12» ‘Создание узла «Node2» и трех его дочерних узлов .Add , , «Node2», «Text Node2» .Add «Node2», tvwChild, «Node2-Child1», «Text Node2-Child1» .Add «Node2», tvwChild, «Node2-Child2», «Text Node2-Child2» .Add «Node2», tvwChild, «Node2-Child3», «Text Node2-Child3» ‘Раскрываем свернутые по умолчанию узлы .Item(«Node1»).Expanded = True .Item(«Node2»).Expanded = True .Item(«Node1-Child1»).Expanded = True End With With TreeView1 ‘Отображаем навигационные линии и знаки плюс/минус .Style = tvwTreelinesPlusMinusText .LineStyle = tvwRootLines End With End Sub |
Результат работы кода:
Пример 4
Заполнение текстового поля в зависимости от выбранного пункта древовидной структуры с помощью кода VBA Excel. Для реализации примера необходима пользовательская форма с размещенными на ней элементами управления TreeView1 и TextBox1.
Данные для иерархической структуры и текстового поля содержатся в следующей таблице, размещенной на активном рабочем листе:
Код VBA Excel для создания узлов элемента управления TreeView1 с текстом из ячеек первого столбца таблицы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Private Sub UserForm_Initialize() Me.Caption = «Каталог с описаниями» With TreeView1.Nodes ‘Добавляем ветки .Add , , «Node1», Cells(1, 1) .Add «Node1», tvwChild, «Node1-Child1», Cells(2, 1) .Add «Node1», tvwChild, «Node1-Child2», Cells(3, 1) .Add , , «Node2», Cells(4, 1) .Add «Node2», tvwChild, «Node2-Child1», Cells(5, 1) .Add «Node2», tvwChild, «Node2-Child2», Cells(6, 1) ‘Раскрываем свернутые по умолчанию узлы .Item(«Node1»).Expanded = True .Item(«Node2»).Expanded = True End With With TreeView1 ‘Отображаем навигационные линии и знаки плюс/минус .Style = tvwTreelinesPlusMinusText .LineStyle = tvwRootLines End With With TextBox1 .MultiLine = True .WordWrap = True .Text = «Выберите животное или растение» End With End Sub |
Код VBA Excel для заполнения текстового поля TextBox1 в зависимости от выбранного пункта древовидной структуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) With TreeView1 Select Case .SelectedItem Case Is = .Nodes(«Node1») TextBox1.Text = «Выберите животное или растение» Case Is = .Nodes(«Node1-Child1») TextBox1.Text = Cells(2, 2) Case Is = .Nodes(«Node1-Child2») TextBox1.Text = Cells(3, 2) Case Is = .Nodes(«Node2») TextBox1.Text = «Выберите животное или растение» Case Is = .Nodes(«Node2-Child1») TextBox1.Text = Cells(5, 2) Case Is = .Nodes(«Node2-Child2») TextBox1.Text = Cells(6, 2) End Select End With End Sub |
Результат работы кода: