Sei sulla pagina 1di 29

VBA Objects – The Ultimate Guide

JUNE 29, 2016 BY PAU L KELLY·1 9 COMMENTS

“High aims form high characters, and great objects bring out great minds” – Tryon Edwards

Contents [hide] [hide]


 1 A Quick Guide to VBA Objects
 2 Introduction
 3 What is a VBA Object?
o 3.1 Why VBA Uses Objects
o 3.2 A Real World Analogy
 4 Object Components
o 4.1 Object Properties
o 4.2 Object Methods
o 4.3 Object Events
 5 Creating a VBA Object
o 5.1 Using Dim with New
o 5.2 Using Set with New
o 5.3 Subtle Differences of Dim Versus Set
o 5.4 When New Is Not Required
o 5.5 Using CreateObject
 6 Assigning VBA Objects
 7 VBA Objects in Memory
o 7.1 How Set Works
o 7.2 Objects and Procedures
o 7.3 Using ByRef and ByVal
o 7.4 Why VBA Uses Pointers
o 7.5 Running a Simple Memory Experiment
o 7.6 Cleaning Up Memory
 7.6.1 Clean Up Example
 7.6.2 Setting Objects to Nothing
 7.6.3 Memory Summary
 8 Why Set Is Useful
o 8.1 Set Example 1
o 8.2 Set Example 2
 9 What’s Next?
 10 Get the Free eBook

A Quick Guide to VBA Objects


Task Examples
Declare and Create Dim coll As New Collection
Dim o As New Class1
Declare Only Dim coll As Collection
Dim o As Class1
Create at run time Set coll = New Collection
Set o = New Class1
Assign to Excel Object Dim wk As Workbook
Set wk = Workbooks("book1.xlsx")

Assign using CreateObject Dim dict As Object


Set dict = CreateObject("Scripting.Dictionary")
Assign to existing object Dim coll1 As New Collection
Dim coll2 As Collection
Set coll2 = coll1
Return from Function Function GetCollection() As Collection

Dim coll As New Collection


Set GetCollection = coll

End Function
Receive from Function Dim coll As Collection
Set coll = GetCollection

Introduction
If you are serious about learning VBA then it is important to understand VBA Objects. Using objects is not that difficult.
In fact, they make your life much easier.
In this post, you will see how VBA makes brilliant use of objects. How objects such as Collections, Workbooks and
Worksheets save you much complexity, time and effort.
In my next post, I will cover creating objects using Class Modules. However, before you create your own it is vital that
you understand exactly what they are and why you need them.
So grab your favourite beverage and take a journey into the fascinating world of VBA objects.
What is a VBA Object?
To understand what an object is, we must first look at simple variables. In VBA we have basic data types such as string,
integers, double and date.

We use these data types when we are creating a variable e.g.

Dim Score As Long, Price As Double

Dim Firstname As String, Startdate As Date

Score = 45

Price = 24.55

Firsname = "John"

Startdate = #12/12/2016#

Basic VBA variables have only one purpose. To store a value while our application is running. We either put a value in the
variable or read a value from the variable.

Dim Marks As Long

' Store value in Marks

Marks = 90

Marks = 34 + 44

Marks = Range("A1")

' Read value from Marks

Range("B2") = Marks

Debug.Print Marks

In VBA we have a Collection which we use to store groups of items. The following code shows an example of using a
Collection in VBA

Sub UseCollection()

Dim collFruit As New Collection


' Add item to the collection

collFruit.Add "Apple"

collFruit.Add "Pear"

' Get the number of items in the collection

Dim lTotal As Long

lTotal = collFruit.Count

End Sub

The Collection is an example of an object. It is more than a variable. That is, it does more than storing a piece of data. We
can add items, remove items and get the number of items.
Definition of a VBA Object: An object is a grouping of data and procedures(i.e. Functions and Subs). The procedures are
used to perform some task related to the data.
In the Collection the data is the group of the items it stores. The procedures such as Add, Remove, Count then act on this
data.
In the Worksheet object, the main data item is the worksheet and all the procedures perform actions related to the
worksheet.

Why VBA Uses Objects


An object is used to represent real world or computer based items.
The major benefit of an object is that it hides the implementation details. Take the VBA Collection we looked at above. It
is doing some complicated stuff. When an item is added it must allocate memory, add the item, update the item count and
so on.
We don’t know how it is doing this and we don’t need to know. All that we need to know is when we use Add it will add
the item, Remove will remove the item and Count will give the number of items.
Using objects allows us to build our applications are blocks. Building it this way means you can work on one part without
affecting other parts of your application. It also makes it easier to add items to an application. For example, a Collection
can be added to any VBA application. It is not affected in any way by the existing code and in turn it will not affect the
existing code.

A Real World Analogy


Looking at a real-world example can often be a good way to understand concepts.
Take a car with a combustion engine. When you are driving your car, a lot of complex stuff is happening. For example,
fuel gets injected, compressed and ignited leading to combustion. This then causes the wheels of your car to turn.

A nice looking combustion engine | © BigStockPhoto.com

The details of how this happens are hidden from you. All you expect is that turning the key will start the car, pressing the
accelerator will speed it up and pressing the brake will slow it down and so on.
Think of how great your code would be if it was full of these type of objects. Self-contained and dedicated to performing
one set of tasks really well. It would make building your applications so much easier.

Object Components
There are three main items that an object can have. These are
1. Properties – These are used to set or retrieve a value.
2. Methods – These are function or subs that perform some task on the objects data.
3. Events – These are function or subs that are triggered when a given event occurs

If you look in the Object Browser(F2) or use Intellisense you will notice different icons beside the members of an object.
For example, the screenshot below shows the first three members of the Worksheet object

What these icons mean is as follows

Let’s take a look at the first three members of the worksheet.


It has an Activate method which we can use to make worksheet active.
It has an Activate event which is triggered when the worksheet is activated.
The Application property allows us to reference the application(i.e. Excel).

' Prints "Microsoft Excel"

Debug.Print Sheet1.Application.Name

' Prints the worksheet name

Debug.Print Sheet1.Name

In the next sections we will look at each of these components in more detail.

Object Properties
An object property allows us to read a value from the object or write a value to the object. We read and write to a property
the same way we read and write to a variable.

' Set the name

sheet1.Name = "Accounts"
' Get the name

sName = sheet1.Name

A property can be read-only which means we can read the value but we cannot update the value.
In the VBA Range, Address is a read-only property

' The address property of range

Debug.Print Sheet1.Range("A1").Address

The workbook property Fullname is also a read-only property

' The Fullname property of the Workbook object

sFile = ThisWorkbook.Fullname

Properties can also Set and Get objects. For example, the Worksheet has a UsedRange property that return a Range object

Set rg = Sheet1.UsedRange

You will notice we used the Set keyword here. We will be looking at this in detail later in the post.

Object Methods
A method is a Sub or a Function. For example, Add is a method of the Collection

' Collection Add method

Coll.Add "Apple"

Methods are used to perform some action to do with the object data. With a Collection, the main data is the group of items
we are storing. You can see that the Add, Remove and Count methods all perform some action relating to this data.
Another example of a method is the Workbook SaveAs method

Dim wk As Workbook

Set wk = Workbooks.Open "C:\Docs\Accounts.xlsx"


wk.SaveAs "C:\Docs\Accounts_Archived.xlsx"

and the Worksheets Protect and Copy methods

sheet1.Protect "MyPassword"

Sheet1.Copy Before:=Sheet2

Object Events
Visual Basic is an event-driven language. What this means is that the code runs when an event occurs. Common events are
button clicks, workbook Open, worksheet Activate etc.
In the code below we display a message each time Sheet1 is activated by the user. This code must be placed in the
worksheet module of Sheet1.

Private Sub Worksheet_Activate()

MsgBox "Sheet1 has been activated."

End Sub

Now that we know the parts of the VBA object let’s look at how we use an object in our code.

Creating a VBA Object


In VBA, our code must “Create” an object before we can use it. We create an object using the New keyword.
If we try to use an object before it is created we will get an error. For example, take a look at the code below

Dim coll As Collection

coll.Add "Apple"

When we reach the Add line no Collection has been created.


If we try to run this line we get the following error

There are three steps to creating a VBA object

1. Declare the variable.


2. Create a new object.
3. Assign the variable to the object.

We can perform these steps in one line using Dim and New together. Alternatively, we can declare the variable in one line
and then create and assign the object in another line using Set.
Let’s take a look at both of these techniques.

Using Dim with New


When we use Dim and New together they declare, create and assign all in one line.

' Declare, Create and Assign

Dim coll As New Collection

Using code like does not provide much flexibility. It will always create exactly one Collection when we run our code.
In the next section we will look at Set. This allows us to create objects based on conditions and without having to declare a
variable for each new object.

Using Set with New


We can declare an object variable in one line and then we can use Set to create and assign the object on another line. This
provides us with a lot of flexibility.
In the code below we declare the object variable using Dim. We then create and assign it using the Set keyword.

' Declare

Dim coll As Collection

' Create and Assign

Set coll = New Collection

We use Set in this way when the number of objects can vary. Using Set allows us to create multiple objects. In other
words, we can create objects as we need them. We can’t do this using Dim and New.
We can also use conditions to determine if we need to create an object e.g.

Dim coll As Collection

' Only create collection if cell has data

If Range("A1") <> "" Then

Set coll = New Collection

End If

Later in this post we will see some examples of using Set to create objects.

Subtle Differences of Dim Versus Set


There are some subtle differences between using New with Set and using New with Dim.
When we use New with Dim, VBA does not create the object until the first time we use it.
In the following code, the collection will not be created until we reach the line that adds “Pear”.

Dim coll As New Collection

' Collection is created on this line

coll.Add "Pear"

If you put a breakpoint on the Add line and check the variable value you will see the following message
Object variable or With block variable not set
When the Add line runs, the Collection will be created and the variable will now show a Collection with one item.
The reason for this is as follows. A Dim statement is different to other VBA lines of code. When VBA reaches a
Sub/Function it looks at the Dim statements first. It allocates memory based on the items in the Dim statements. It is not in
a position to run any code at this point.
Creating an object requires more than just allocating memory. It can involve code being executed. So VBA must wait until
the code in the Sub is running before it can create the object.
Using Set with New is different in this regard to using Dim with New. The Set line is used by VBA when the code is
running so VBA creates the object as soon as we use Set and New e.g.

Dim coll As Collection

' Collection is created on this line

Set coll = New Collection

coll.Add "Pear"

There is another subtlety to keep in mind using New. If we set the object variable to Nothing and then use it again, VBA
will automatically create a new object e.g.

Sub EmptyColl2()

' Create collection and add items

Dim coll As New Collection

' add items here

coll.Add "Apple"

' Empty collection

Set coll = Nothing

' VBA automatically creates a new object

coll.Add "Pear"

End Sub

If we used Set in the above code to create the new Collection then the “Add Pear” line would cause an error.
When New Is Not Required
You may have noticed some objects don’t use the New keyword.

Dim sh As Worksheet

Set sh = ThisWorkbook.Worksheets("Sheet1")

Dim wk As Workbook

Set wk = Workbooks.Open("C:\Docs\Accounts.xlsx")

When a workbook is opened or created VBA automatically creates the VBA object for it. It also creates the worksheet
object for each worksheet in the workbook.
Conversely, when we close the workbook VBA will automatically delete the VBA objects associated with it.
This is great news. VBA is doing all the work for us. So when we use Workbooks.Open, VBA opens the file and creates
the workbook object for the workbook.
An important point to remember is that there is only one object for each workbook. If you use different variables to
reference the workbook they are all referring to the same object e.g.

Dim wk1 As Workbook

Set wk1 = Workbooks.Open("C:\Docs\Accounts.xlsx")

Dim wk2 As Workbook

Set wk2 = Workbooks("Accounts.xlsx")

Dim wk3 As Workbook

Set wk3 = wk2

We will look at this in more detail in the VBA Objects in Memory section below.

Using CreateObject
There are some very useful libaries that are not part of Excel VBA. These include the Dictionary, Database objects,
Outlook VBA objects, Word VBA objects and so on.
These are written using COM interfaces. The beauty of COM is that was can easily use these libraries in our projects.
If we add a reference to the library we create the object in the normal way.

' Select Tools->References and place a check

' beside "Microsoft Scripting Runtime"

Dim dict As New Scripting.Dictionary

If we don’t use a reference we can create the object at run time using CreateObject.

Dim dict As Object

Set dict = CreateObject("Scripting.Dictionary")

The first method is referred to as Early Binding and the second is referred to as Late Binding(see Early versus Late
Binding) for more details.

Assigning VBA Objects


We can assign basic variables using the Let keyword.

Dim sText As String, lValue As Long

Let sText = "Hello World"

Let lValue = 7

The Let keyword is optional so nobody actually uses it. However, it is important to understand what it is used for.

sText = "Hello World"

lValue = 7

When we assign a value to a property we are using the Let Property

' Both lines do the same thing

sheet1.Name = "Data"
Let sheet1.Name = "Data"

When we assign an object variable we use the Set keyword instead of the Let keyword. When I use “object variable” I
mean any variable that isn’t a basic variable such as a string, long or double etc..

' wk is the object variable

Dim wk As Worksheet

Set wk = ThisWorkbook.Worksheets(1)

' coll1 is the object variable

Dim coll1 As New Collection

coll1.Add "Apple"

' coll2 is the object variable

Dim coll2 As Collection

Set coll2 = coll1

Using the Set keyword is mandatory. If we forget to use Set we will get the error below

coll2 = coll1

It may look like Let and Set are doing the same thing. But they are actually doing different things:

 Let stores a value


 Set stores an address
To understand more about this we need to take a peek(pun intended:-)) into memory.

VBA Objects in Memory


“Fools ignore complexity. Pragmatists suffer it. Some can avoid it. Geniuses remove it” – Alan Perlis

To understand what New and Set are doing we need to understand how variables are represented in memory.
When we declare variables, VBA creates a slot for them in memory. You can think of the slot as an Excel cell in memory.

Dim X As long, Y As Long

When we assign values to these variables, VBA places the new values in the appropriate slots.

X = 25

Y = 12
We saw the following line of code earlier in this post

Dim coll As New Collection

This line creates the object in memory. However, it doesn’t store this object in the variable. It stores the address of the
object in the variable. In programming, this is known as a Pointer.

Because VBA handles this seamlessly it can seem as if the object variable and the object are the same thing. Once we
understand they are different it is much easier to understand what Set is actually doing.

How Set Works


Take a look at the following code

Dim coll1 As New Collection

Dim coll2 As Collection

Set coll2 = coll1

Only one Collection has been created here. So coll1 and coll2 refer to the same Collection.
In this code, coll1 contains the address of the newly created Collection.
When we use Set we are copying the address from coll1 to coll2. So now they are both “pointing” to the same Collection
in memory.

Earlier in the post we looked at Workbook variables. Let’s have a look at this code again

Dim wk1 As Workbook

Set wk1 = Workbooks.Open("C:\Docs\Accounts.xlsx")

Dim wk2 As Workbook

Set wk2 = Workbooks("Accounts.xlsx")

Dim wk3 As Workbook

Set wk3 = Workbooks(2)


When we open the workbook Accounts.xlsx, VBA creates an object for this workbook. When we assign the workbook
variables in the code above, VBA places the address of the workbook object in the variable.
In this code example, the three variables are all referring to the same workbook object.

If we use code like the following

wk1.SaveAs "C:\Temp\NewName.xlsx"

VBA uses the address in wk1 to determine the workbook object to use. It does this seamlessly so when we use a workbook
variable it looks like we are referring directly to the object.
To sum up what we have learned in this section:

 Let writes a value to a basic variable


 Set writes an address to an object variable

Objects and Procedures


In VBA we can refer to Functions and Subs as procedures. When we pass an object to a procedure only the address
passed.
When we pass an object from a Function(Subs cannot return anything) only the address of the object is passed back.
In the code below we have one collection. It is the address that gets passed to and from the function.

Sub TestProc()

' Create collection

Dim coll1 As New Collection

coll1.Add "Apple"

coll1.Add "Orange"

Dim coll2 As Collection

' UseCollection passes address back to coll2

Set coll2 = UseCollection(coll1)

End Sub

' Address of collection passed to function

Function UseCollection(coll As Collection) _

As Collection

Set UseCollection = coll

End Function

Using ByRef and ByVal


When we pass a simple variable to a procedure we can pass using ByRef or ByVal.
ByRef means we are passing the address of the variable. If the variable changes in the procedure the original will also be
changed.
ByVal means we are creating a copy of the variable. If the variable changes in the procedure the original will not be
changed.
' Pass by value

Sub PassByVal(ByVal val As Long)

' Pass by reference

Sub PassByRef(ByRef val As Long)

Sub PassByRef(val As Long)

Most of the time it is a good idea to use ByVal because it prevents the variable being accidentally changed in a procedure.
When we pass a Collection to a procedure, we are always passing the address of the Collection.
ByRef and ByVal only affect the object variable. They do not affect the object!
What this means is that if we change the object in the procedure it will be changed outside it – this is regardless of whether
you use ByVal or ByRef.
For example, in the code below we have two procedures that change the Collection. One uses ByRef and one uses ByVal.
In both cases the Collection has changed when we return to the TestProcs Sub

Sub TestProcs()

Dim c As New Collection

c.Add "Apple"

PassByVal c

' Prints Pear

Debug.Print c(1)

PassByRef c

' Prints Plum

Debug.Print c(1)

End Sub

' Pass by value

Sub PassByVal(ByVal coll As Collection)

' Remove current fruit and add Pear

coll.Remove (1)

coll.Add "Pear"

End Sub
' Pass by reference

Sub PassByRef(ByRef coll As Collection)

' Remove current fruit and add Plum

coll.Remove (1)

coll.Add "Plum"

End Sub

Let’s look at a second example. Here we are setting the object variable to “point” to a new Collection. In this example we
get different results from ByVal and ByRef.
In the PassByVal Sub a copy of the original object variable is created. So it this copy that points to the new Collection. So
our original object variable is not affected.
In the PassByRef Sub we are using the same object variable so when we point to the New Collection, our original object
variable is now pointing to the new collection.

Sub TestProcs()

Dim c As New Collection

c.Add "Apple"

PassByVal c

' Prints Apple as c pointing to same collection

Debug.Print c(1)

PassByRef c

' Prints Plum as c pointing to new Collecton

Debug.Print c(1)

End Sub

' Pass by value

Sub PassByVal(ByVal coll As Collection)

Set coll = New Collection

coll.Add "Orange"

End Sub
' Pass by reference

Sub PassByRef(ByRef coll As Collection)

Set coll = New Collection

coll.Add "Plum"

End Sub

Why VBA Uses Pointers


You may be wondering why VBA uses pointers. The reason is that it is much more efficient.
Imagine you had a Collection with 50000 entries. Think how inefficient it would be to create multiple copies of this
Collection when your application was running.
Think of it like a library which is a real world collection of books. We can put the Library address in directories,
newspapers etc. A person simply uses the address to go to the Library and add and remove books.
There is one Libary and the address is passed around to anyone who needs to use it.If we wanted a second library we
would create a new library. It would have a different address which we could also pass around.

© BigStockPhoto.com
Running a Simple Memory Experiment
To demonstrate what we have been discussing, let’s look at a code example. The code below uses

 VarPtr to give the memory address of the variable


 ObjPtr to give the memory address of the object

The memory address is simply a long integer and it’s value is not important. But what is interesting is when we compare
the addresses.

Sub Memory()

Dim coll1 As New Collection

Dim coll2 As Collection

Set coll2 = coll1

' Get address of the variables Coll1 and Coll2

Dim addrColl1 As Long, addrColl2 As Long

addrColl1 = VarPtr(coll1)

addrColl2 = VarPtr(coll2)

Debug.Print "Address of the variable coll1 is " & addrColl1

Debug.Print "Address of the variable coll2 is " & addrColl2

' Get address of the Collection they point to

Dim addrCollection1 As Long, addrCollection2 As Long

addrCollection1 = ObjPtr(coll1)

addrCollection2 = ObjPtr(coll2)

Debug.Print "Address coll1 collection is " & addrCollection1

Debug.Print "Address coll1 collection is " & addrCollection2

End Sub

When you run the code you will get a result like this:
Address of the variable coll1 is 29356848
Address of the variable coll2 is 29356844
Address coll1 collection is 663634280
Address coll2 collection is 663634280

you will notice

 The memory addresses will be different each time you run.


 The address of the coll1 Collection and the coll2 Collection will always be the same.
 The address of the coll1 variable and the coll2 variable will always be different.

This shows that we have two different variables which contain the address of the same Collection.

Cleaning Up Memory
So what happens if we set a variable to a New object multiple times? In the code below we use Set and New twice for the
variable coll

Dim coll As Collection

Set coll = New Collection

coll.Add "Apple"

' Create a new collection and point coll to it

Set coll = New Collection

In this example, we created two new Collections in memory. When we created the second collection we set coll to refer to
it. This means it no longer refers to the first collection. In fact, nothing is referring to the first Collection and we have no
way of accessing it.
In some languages(looking at you C++) this would be a memory leak. In VBA however, this memory will be cleaned up
automatically. This is known as Garbage Collection.
Let me clarify this point. If an object has no variable referring to it, VBA will automatically delete the object in memory.
In the above code, our Collection with “Apple” will be deleted when coll1 “points” to a new Collection.

Clean Up Example
If you want to see this for yourself then try the following.
Create a class module, call it clsCustomer and add the following code.

Public Firstname As String

Private Sub Class_Terminate()

MsgBox "Customer " & Firstname & " is being deleted."

End Sub

Class_Terminate is called when an object is being deleted. By placing a message box in this event we can see exactly
when it occurs.
Step through the following code using F8. When you pass the Set oCust = New clsCustomer line you will get a message
saying the Jack was deleted.When you exit the function you will get the message saying Jill was deleted.

Sub TestCleanUp()

Dim oCust As New clsCustomer

oCust.Firstname = "Jack"

' Jack will be deleted after this line

Set oCust = New clsCustomer

oCust.Firstname = "Jill"

End Sub

VBA automatically deletes objects when they go out of scope. This means if you declare them in a Sub/Function they will
go out of scope when the Function ends.

Setting Objects to Nothing


In code examples you may see code like

Set coll = Nothing

A question that is often asked is “Do we need to Set variables to Nothing when we are finished with them?”. The answer is
most of the time you don’t need to.
As we have seen VBA will automatically delete the object as soon as we go out of scope. So in most cases setting the
object to Nothing is not doing anything.
The only time you would set a variable to Nothing is if you needed to empty memory straight away and couldn’t wait for
the variable to go out of scope. An example would be emptying a Collection.
Imagine the following project. You open a workbook and for each worksheet you read all the customer data to a collection
and process it in some way. In this scenario, you would set the Collection to Nothing every time you finish with a
worksheet’s data.

Sub SetToNothing()

' Create collection

Dim coll As New Collection

Dim sh As Worksheet

' Go through all the worksheets

For Each sh In ThisWorkbook.Worksheets

' Add items to collection

' Do something with the collection data

' Empty collection

Set coll = Nothing

Next sh

End Sub

Memory Summary
To sum up what we have learned in this section:

1. A new object is created in memory when we use the New keyword.


2. The object variable contains only the memory address of the object.
3. Using Set changes the address in the object variable.
4. If an object is no longer referenced then VBA will automatically delete it.
5. Setting an object to Nothing is not necessary in most cases.
Why Set Is Useful
Let’s look at two examples that show how useful Set can be.
First, we create a very simple class module called clsCustomer and add the following code

Public Firstname As String

Public Surname As String

Set Example 1
In our first scenario, we are reading from a list of customers from a worksheet. The number of customers can vary between
10 and 1000.
Obviously, declaring 1000 objects isn’t an option. Not only is it a lot of wasteful code, it also means we can only deal with
maximum 1000 customers.

' Don't do this!!!

Dim oCustomer1 As New clsCustomer

Dim oCustomer2 As New clsCustomer

' .

' .

' .

Dim oCustomer1000 As New clsCustomer

What we do first is to get the count of rows with data. Then we create a customer object for each row and fill it with data.
We then add this customer object to the collection.

Sub ReadCustomerData()

' We will always have one collection

Dim coll As New Collection

' The number of customers can vary each time we read a sheet

Dim lLastRow As Long

lLastRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row

Dim oCustomer As clsCustomer


Dim i As Long

' Read through the list of customers

For i = 1 To lLastRow

' Create a new clsCustomer for each row

Set oCustomer = New clsCustomer

' Add data

oCustomer.Firstname = Sheet1.Range("A" & i)

oCustomer.Surname = Sheet1.Range("B" & i)

' Add the clsCustomer object to the collection

coll.Add oCustomer

Next i

End Sub

Each time we use Set we are assigning oCustomer to “point” to the newest object. We then add the customer to the
Collection. What happens here is that VBA creates a copy of the object variable and places it in the collection.

Set Example 2
Let’s look at a second example where using Set is useful. Imagine we have a fixed number of customers but only want to
read the ones whose name starts with the letter B. We only create a customer object when we find a valid one.

Sub ReadCustomerB()

' We will always have one collection

Dim coll As New Collection

Dim oCustomer As clsCustomer, sFirstname As String

Dim i As Long

' Read through the list of customers

For i = 1 To 100
sFirstname = Sheet1.Range("A" & i)

' Only create customer if name begins with B

If Left(sFirstname, 1) = "B" Then

' Create a new clsCustomer

Set oCustomer = New clsCustomer

' Add data

oCustomer.Firstname = sFirstname

oCustomer.Surname = Sheet1.Range("B" & i)

' Add to collection

coll.Add oCustomer

End If

Next i

End Sub

It doesn’t matter how many customer names start with B this code will create exactly one object for each one.

Potrebbero piacerti anche