Learn Microsoft Access Advanced Programming Techniques, Tips and Tricks.

Ms-Access and Collection Object Basics

Introduction.

In VBA, Arrays are more commonly used than Collection objects for storing multiple sets of related values (in rows and columns). We have already used Arrays to store User-Defined Types and Class Module objects. Now, it’s time to explore something new—the use of Collection and Dictionary objects. The Collection object is particularly convenient for grouping related items together. As for the Dictionary object, we will discuss its usage at the appropriate time.

When using Arrays, we must dimension a variable, User-Defined Type, or Class Module object with the required number of elements in advance—or re-dimension it later to increase or decrease its size—before storing values in it. This extra step is not necessary with a Collection object. Once a Collection object is instantiated, we can dynamically add any number of items to it. Its members can be of any data type, including built-in objects, Class Module objects, or even other Collection objects with their own item members.

Collection Demo Program.

Let us write a simple program to demonstrate the usage of a Collection Object.

Public Sub CollTest1()
Dim C As Collection
Dim j As Integer

‘instantiate the Object
Set C = New Collection
                            
C.Add 5
C.Add 15
C.Add "iPhone"
C.Add "Disk 2TB"
C.Add 35.75

'Print the items in debug window
GoSub Listing

C.Remove 3 'Remove 3rd item

GoSub Listing

Set C = Nothing

Exit Sub

Listing:
Debug.Print
For j = 1 To C.Count
    Debug.Print C.Item(j)
Next
Return

End Sub

Code Review Line By Line.

The first two lines declare the Variable C as a Collection Object. The next line declares the Variable j as an Integer type, as a control variable for the For... Next Loop.  The third line instantiates the Collection Object C in memory.

The Collection Object has four built-in methods: Add, Count, Item, and Remove, for managing the Collection items in memory.

An image of the Collection Object instance below, displaying its methods list.

  • The Add method inserts a value or object as a member of the Collection object, while the Remove method deletes an item from it.

  • To access a specific item, we can use the Item method with its index number. The Count property returns the total number of items in the Collection.

  • In the current example, we are not working with object-type items but with a few simple mixed data types—Integer, String, and Double—as members of the Collection. Using the Add method of the Collection object named C, we have inserted five items: the first two are integers, the next two are strings, and the last one is a double-precision number.

  • The syntax combines the Collection instance name (C) and the Add method using a dot (.) separator, followed by a space, and then the actual value to be added.

  • The Add method accepts four optional parameters, as shown in the image below.

  • The parameters: Item, [Key], [Before], [After].  The first parameter, Item, is mandatory; the Value to be added to the Collection.

  • The next three parameters are optional. 

  • When using any of the optional parameters of the Add method, you must insert comma placeholders to skip over unused parameters—except when you are specifying parameters from the rightmost side in order.

    Alternatively, you can explicitly use parameter names along with their values, which allows you to provide the parameters in any order.

    We will explore this technique in another VBA example.

    Note: Do not get confused with the Item Parameter of the Add Method with the Item() Method of the Collection Object.

  • We have added five items as members of the Collection Object with the Add method.  Two Integer Type values, two String data Type Values, and one double-precision number. 

    It demonstrates that you can add any data type, except User-Defined Type (UDTs), into the Collection.  When you want to add UDTs into a Collection, convert your UDTs into a Class Module Object.

    Next, the program calls a printing subroutine that outputs the Collection members to the Debug window. This subroutine uses a For...Next loop that runs from 1 to the total number of items (C.Count) in the Collection. The loop control variable j is used as the index parameter of the Collection’s Item() method to retrieve each value and print it to the Debug window.

    The next Line removes the third item (iPhone) from the item members by calling the Remove method.

    The printing subroutine is called one more time to print the changed list of items, after the removal of the third item from the earlier list.

    The Exit Sub statement prevents the program control from dropping into the internal subroutine lines and stops the program.  The listing will appear in the Debug Window as shown below.

    The Output in the Debug Window.

    5 
    15 
    iPhone
    Disk 2TB
    35.75
    
    5 
    15 
    Disk 2TB
    35.75
    

    We can insert a value before a particular item member by specifying the item number with the Before key Name.

    C.Add 2, Before:=1 ‘add value 2 Before existing first item 
    

    OR

    C.Add 2,,1

    The above statement will add value 2 as the first item in the above program, pushing all existing items down.

    C.Add 20, After:=3 ‘Add value 20 After existing item number 3
    

    OR

    C.Add 20,,,3

    This statement inserts the value 20 after the third item, after value 15,  in the list.

    The Code below demonstrates the Before:= and After:= Parameter Names.

    Public Sub CollTest2()
    Dim C As Collection
    Dim j As Integer
    
    Set C = New Collection
    
    C.Add 5
    C.Add 15
    C.Add "iPhone"
    C.Add "Disk 2TB"
    C.Add 35.75
    
    GoSub Listing
    
    C.Add 2, Before:=1 'Insert the item before the first item
    C.Add 20, After:=3 'Insert the item after first 3 items
    
    GoSub Listing
    
    Set C = Nothing
    Exit Sub
    
    Listing:
    'Print the items
    Debug.Print
    For j = 1 To C.Count
       Debug.Print C(j)
    
    Next
    Return
    
    End Sub
    

    Note: The advantage of using parameter names is that you can pass the values in any order you want when you need to use more than one parameter in a statement.

    C.Add After:=3,Item:=20

    The second example demonstrates the use of parameter values without explicitly specifying their parameter names, placing each value in its correct positional order.

    Public Sub CollTest2_2()
    Dim C As Collection
    Dim k As Integer
    

    Set C = New Collection C.Add 5 C.Add 15 C.Add "iPhone" C.Add "Disk 2TB" C.Add 35.75 GoSub Listing C.Add 2, , 1 'Insert the item before the first item C.Add 20, , , 3 'Insert the item after first 3 items GoSub Listing Set C = Nothing Exit Sub Listing: 'Print the items Debug.Print      For k = 1 To C.Count          Debug.Print C(k)      Next: Debug.Print Return End Sub

    Sample printout on the Debug Window is shown below:

    5 
     15 
    iPhone
    Disk 2TB
     35.75 
    
     2 
     5 
     15 
     20 
    iPhone
    Disk 2TB
     35.75 
    

    In all our printing examples, we have used the Item’s index number to retrieve values for display in the Debug Window. However, when a collection contains many items, it becomes difficult to remember the index number of a specific item we want to access. To overcome this, we can associate each item with an easily memorable Key along with its Value—for example, using a contact’s first name as the key in an address book collection—so we can retrieve the item’s value directly by its key instead of relying on its index number.

    Usage of Item Keys

    Let’s write a new program to demonstrate how to use Keys with Values in a Collection.

    Public Sub CollTest3()
    Dim C As Collection
    Dim strKey As String
    Dim strGet As String
    
    Set C = New Collection
    
    C.Add 5, Key:="FIVE" 
    C.Add 15, Key:="FIFTEEN"
    C.Add "iPhone", "7+"     'you can omit the KEY param name
    C.Add "Disk 2TB", "DISK" ' Add method's 2nd Parameter is KEY
    C.Add 35.75, "999"
    
    'add value 2 with Key "TWO" before the first item.
    'this item will be the first item in the collection
    'parameter names not in proper order – valid
    
    C.Add Item:=2, Before:=1, Key:="TWO"
    
    'add value 7 with Key "SEVEN" as third item in the collection
    'parameter names not in proper order – valid
    
    C.Add Key:="SEVEN", Item:=7, After:=2
    
    'Retrieve value using it's KEY from collection
    
    strKey = ""
    Do While strKey = ""
        strKey = InputBox("Value Key: " & vbCr & vbCr & "Q - Quit", "Enter Key", "")
        
        Select Case strKey
            Case "Q"
               Exit Do
            Case "TWO", "FIVE", "SEVEN", "FIFTEEN", "7+", "DISK", "999"
               strGet = C(strKey)
            Case Else
               strGet = " Not Found!"
       End Select
       
    MsgBox "Key:<<" & strKey & ">> Value: " & strGet
    strKey = ""
    Loop
    
    Set C = Nothing
    
    End Sub
    

    The KEY value must be of String Type.  The KEY value must be a unique identifier.

    Refer to the second image, on top of this page, as a reference for the proper order of the Parameters of the Add Method of Collection Object, displayed by VBA Intellisense.

    The sample programs shown earlier, with mixed data types, were intended solely for demonstration purposes. In practical use, a Collection object typically stores items of a single data type, most commonly used to hold objects—such as Forms, Reports, Class Module objects, or Database objects—along with their associated properties and methods.

    CLASS MODULES.

    1. MS-Access Class Module and VBA
    2. MS-Access VBA Class Object Arrays
    3. MS-Access Base Class and Derived Objects
    4. VBA Base Class and Derived Objects-2
    5. Base Class and Derived Object Variants
    6. Ms-Access Recordset and Class Module
    7. Access Class Module and Wrapper Classes
    8. Wrapper Class Functionality Transformation

    COLLECTION OBJECT.

    1. Ms-Access and Collection Object Basics
    2. Ms-Access Class Module and Collection Object
    3. Table Records in Collection Object and Form

    DICTIONARY OBJECT.

    1. Dictionary Object Basics
    2. Dictionary Object Basics-2
    3. Sorting Dictionary Object Keys and Items
    4. Display Records from Dictionary to Form
    5. Add Class Objects as Dictionary Items
    6. Update Class Object Dictionary Item on Form
Share:

3 comments:

  1. "When any of the optional parameter is used with the .Add method other parameter places must be skipped with comma separator, except for the right side items." Do you mean the right-side items don't have commas after them?

    What's the purpose of the Key parameter? Is it like a tag?

    ReplyDelete
  2. .Add Item,[Key],[Before],[After]
    These are the parameters of .Add Method. Assume that we need to Add an item Before the second item in the Collection we will be using two parameters: Item & Before values in the statement as shown below:

    Coll.Add "Grovelli",,2
    OR
    Coll.Add "Grovelli",Before:=2

    In the first example above we have inserted two commas after the Item Parameter value (Grovelli) indicating that the KEY parameter is not used and it's place is between those two commas. The value 2 says insert the Item BEFORE the second item in the existing Collection. You should not insert a comma after the value 2 for the last parameter AFTER.

    In the second example, the usage of parameter name with value (BEFORE:=2) doesn't need that extra comma we have used in the first statement. Not only that with the usage of Parameter names you can pass the values in any order you want.
    Example:
    Coll.Add Before:2, Item:="Grovelli"

    KEY Parameter is a Unique String Value, like Primary Key of Table, Employee Code of Employees etc. You can retrieve an Item directly from the Collection, rather than reading each item from Collection and comparing for a match.

    Assume that your Identity Number is "G123" and added into the Collection as:

    Coll.Add "Grovelli","G123"
    OR
    Coll.Add Item:="Grovelli", Key:="G123"
    OR
    Coll.Add Key:="G123", Item:="Grovelli"

    then you can directly retrieve it from Collection as below:

    Var = Coll.Item("G123")
    OR
    var = Coll("G123")
    OR
    Debug.Print Coll("G123")

    The Key value must be of String Data Type.

    The last example Program in this Page shows a demo of this method.

    ReplyDelete
  3. Correction: Coll.Add Before:2, Item:="Grovelli"

    Coll.Add Before:=2, Item:="Grovelli"

    ReplyDelete

Comments subject to moderation before publishing.

PRESENTATION: ACCESS USER GROUPS (EUROPE)

Translate

PageRank

Post Feed


Search

Popular Posts

Blog Archive

Powered by Blogger.

Labels

Forms Functions How Tos MS-Access Security Reports msaccess forms Animations msaccess animation Utilities msaccess controls Access and Internet MS-Access Scurity MS-Access and Internet Class Module External Links Queries Array msaccess reports Accesstips WithEvents msaccess tips Downloads Objects Menus and Toolbars Collection Object MsaccessLinks Process Controls Art Work Property msaccess How Tos Combo Boxes Dictionary Object ListView Control Query VBA msaccessQuery Calculation Event Graph Charts ImageList Control List Boxes TreeView Control Command Buttons Controls Data Emails and Alerts Form Custom Functions Custom Wizards DOS Commands Data Type Key Object Reference ms-access functions msaccess functions msaccess graphs msaccess reporttricks Command Button Report msaccess menus msaccessprocess security advanced Access Security Add Auto-Number Field Type Form Instances ImageList Item Macros Menus Nodes RaiseEvent Recordset Top Values Variables Wrapper Classes msaccess email progressmeter Access2007 Copy Excel Export Expression Fields Join Methods Microsoft Numbering System Records Security Split SubForm Table Tables Time Difference Utility WScript Workgroup database function msaccess wizards tutorial Access Emails and Alerts Access Fields Access How Tos Access Mail Merge Access2003 Accounting Year Action Animation Attachment Binary Numbers Bookmarks Budgeting ChDir Color Palette Common Controls Conditional Formatting Data Filtering Database Records Defining Pages Desktop Shortcuts Diagram Disk Dynamic Lookup Error Handler External Filter Formatting Groups Hexadecimal Numbers Import Labels List Logo Macro Mail Merge Main Form Memo Message Box Monitoring Octal Numbers Operating System Paste Primary-Key Product Rank Reading Remove Rich Text Sequence SetFocus Summary Tab-Page Union Query User Users Water-Mark Word automatically commands hyperlinks iSeries Date iif ms-access msaccess msaccess alerts pdf files reference restore switch text toolbar updating upload vba code