Learn Microsoft Access Advanced Programming Techniques, Tips and Tricks.

GetRows Function and Exporting Data


We are going to create a useful data export utility with the GetRows() method of the Recordset Object. The GetRows method is used for loading the entire set of data from table into memory in a doubly dimensioned Variant Array with a single statement. Let us try it with an example to see how this is done? An image of a sample table is given below and we will see how this will look like in memory when loaded with the help of GetRows() method of the Recordset Object:

Table: Employees
ID Name BirthDate Height Weight
1 Nancy 12/10/1980 164 58
2 Peter 05/07/1975 180 80
3 Linda 17/11/1982 170 60

The VBA Code.

The following sample VBA Routine loads the above data into memory and a listing is dumped in the Debug Window:

Public Function Test(ByVal tblName As String)
Dim db As Database, rst As Recordset, varData As Variant
Dim intFields As Integer, intRecords As Integer, j As Integer, k As Integer
Dim rec As String, fld_type As Integer

Set db = CurrentDb
Set rst = db.OpenRecordset(tblName, dbOpenTable)
j = rst.RecordCount - 1
k = rst.Fields.Count - 1

varData = rst.GetRows(j + 1)

For intRecords = 0 To j
    rec = ""
    For intFields = 0 To k
    fld_type = rst.Fields(intFields).Type

    If fld_type = 11 Or fld_type = 12 Then
      GoTo nextField
    End If
      rec = rec & varData(intFields, intRecords) & ","
    rec = Left(rec, Len(rec) - 1)
    Debug.Print rec
Set rst = Nothing
Set db = Nothing
End Function

The arrangement of records in memory in a two dimensional array looks like the following:

1 2 3
Nancy Peter Linda
12/10/1980 05/07/1975 17/11/1982
164 180 170
58 80 60

The Memory Image of Data.

The records are not arranged in row order as they appear in datasheet view, instead they are loaded in columns.  So, after loading the data in memory we must know how to address the two dimensional array to access each record in correct order to output the data.  Each field value is separated with a comma in the listing provided in the Debug window.

Normally, in a two dimensional Array the first index value of the array is the row number and the second one is column number.  But, in this case the first index value is the Field order Number and the second value is the Record Number.  You can check the sample data arrangement in memory shown above.

Export Data in Text Format

We will write a small utility program to export any MS-Access Table into comma delimited Text/CSV File, so that the data can be easily transported through internet or to import into other Applications.

The VBA Code of the program is given below:

Public Function CreateDelimited(ByVal xtableName As String, ByVal txtFilePath As String)
'Utility: CreateDelimited()
'Author : a.p.r.pillai
'Date   : Dec. 2010
'Purpose: Create Comma Delimited Text File from Table 
'Rights : All Rights Reserved by www.msaccesstips.com
Dim db As Database, rst As Recordset
Dim varTable() As Variant, j As Long, k As Long
Dim rec As String, fld_type As Integer
Dim intRecords As Integer, intFields As Integer

Set db = CurrentDb
Set rst = db.OpenRecordset(xtableName, dbOpenTable)
varTable = rst.GetRows(rst.RecordCount)
k = rst.Fields.Count - 1
j = rst.RecordCount - 1

Open txtFilePath For Output As #1
rec = ""
For intFields = 0 To k
   fld_type = rst.Fields(intFields).Type
        If fld_type = 11 Or fld_type = 12 Then GoTo nextField
   rec = rec & Chr$(34) & rst.Fields(intFields).Name & Chr$(34) & ","
rec = Left(rec, Len(rec) - 1)
Print #1, rec
For intRecords = 0 To j
    rec = ""
    For intFields = 0 To k
        fld_type = rst.Fields(intFields).Type
        If fld_type = 11 Or fld_type = 12 Then GoTo Next_Field
        rec = rec & IIf(fld_type = 10, Chr$(34) & varTable(intFields, intRecords) & Chr$(34), varTable(intFields, intRecords)) & ","
        Next: rec = Left(rec, Len(rec) - 1)
        Print #1, rec
Close #1

Set rst = Nothing
Set db = Nothing

End Function

The Utility can be called from a Command Button Click Eventprocedure after setting the Table name and the target file pathname in text boxes.  You can test the utility by calling it from the Debug Window (Immediate Window) directly as given below:

CreateDelimited "Products", "C:\Temp\Products.txt"

NB: If MEMO or Photo Fields are present in the Table they are excluded from the output file.

The target file extension can be either .TXT or .CSV.


Create Menus with Macros-2

Continued from Create Menus with Macros.

Continued from last week's Article: Create Menus with Macros, please go through it before continuing.

Last week we have learned how to created a simple Shortcut Menu for Forms with Macros.  This week we will create a Toolbar Button and a Menu Bar item through Macro based Menus.

New Macro: macProcess.

But, before all that let us make little modification to our earlier shortcut menu to add a menu group item added with few options.

  1. Open a new macro in design view.
  2. Select MsgBox from the drop down list in the Action Column.
  3. Type Proceed with Report Data Processing? in the Message control under the Action Arguments list.
  4. Select Critical from the drop down list in the Type control.
  5. Type Report Processing in the Title control.

    Note: This macro is supposed to contain a series of actions; like running of action queries (Make-Table, Append, Update, Delete or running of other macros or VBA Routines) to prepare data ready for Reports.  Here, we are simply adding a message box to display a message instead.  You must create Menus with actions as per requirements of your Application.

  6. Save the Macro with the name: macProcess and close it.

    macSubMenu Macro

  7. Click on New. . . to open another new macro in Design View.
  8. If the Macro Name Column is not visible then select Macro Name from View Menu.
  9. Type &Form in the Macro Name Column on the first row and select OpenForm from the drop down list under Action Column.
  10. Select an existing Form in the From Name control using the drop down control.
  11. Type Process &Data in the Macro Name column in the second row and select RunMacro in the Action Column.
  12. Type macProcess (or select it from the drop down list) to insert the process macro that we have created in step-6.
  13. Type &Report in the Macro Name column in third row and select OpenReport in the Action column.
  14. Select an existing Report from your application in the Report Name control.
  15. Select Print Preview in the View control.
  16. Save the macro with the name macSubMenu and close it.

    Modify Macro: mcrShortCut

  17. Open the macro mcrShortCut that we have created last week.
  18. Type MenuGroup in the next row (as shown in the image given below) and select AddMenu option from the drop down list under Action column.
  19. Type Form/Report in the Menu Name control below the Action Arguments.
  20. Type macSubMenu (or select from the drop down list) in the Menu Macro Name control.
  21. Save and close the macro mcrShortCut.
  22. If you remember on which Form you have attached the earlier macro Shortcut Menu last week, then you can open that Form in normal view and right-click on the Form to display the Form/Report Sub-Menu we have added to the earlier menu. If You don't remember then open one of your existing Form in Design View.
  23. Display the Property Sheet (View - -> Properties or press ALT+Enter).
  24. Click on the Other Tab.
  25. Set the Shortcut Menu Property value to Yes.
  26. Set the Shortcut Menu Bar Property value to macMenu (you can select the macro from the drop down list also).
  27. Save and close the Form.

    Trial Run of Shortcut Menu.

  28. Open the Form in normal View.
  29. Right-Click on a field to display the Shortcut Menu. The new Group Menu that we have added will appear at the end of the Menu with description Form/Report.
  30. Place the mouse over Form/Report menu group to display its Sub-Menu items.

The menu definition now remains in Macros and we are directly using it on Forms.  But, we can convert the Menu Macro into a regular:

  • Menu Bar (like File, Edit etc.) OR
  • Tool Bar  OR
  • Shortcut Menu.

If you would like to convert this macro menu into a Menu Bar then we must make a small change in the macMenu macro.

Converting Macro into Menu Bar.

  1. Open macMenu in design view.
  2. Type myMenu in the Menu Name control under Action Arguments.
  3. Save and close the macro.
  4. Click on macMenu macro to select it.
  5. Highlight the option Macro in Tools Menu.
  6. Click on Create Menu from Macro Option.

    A Menu Bar will appear on top with the label myMenu.

  7. Click on myMenu to display the menu options which we have created in macros.

Note: You should not attempt to covert the same macMenu to a Toolbar Menu; a name conflict will take place.

Quick Toolbar Button.

Tip: To create a quick Toolbar Button with the same set of macros, do the following:

  1. Make a copy of the macros: macMenu, mcrShortCut and macSubMenu and name them as mac_Menu, mcr_ShortCut and mac_SubMenu.
  2. Open mcr_ShortCut macro in design view.
  3. Click on the last line and change the Menu Macro Name control value to mac_SubMenu, save and close the Macro.
  4. Open the mac_Menu macro in design view.
  5. Change the Menu Name control value to myToolbar.
  6. Change the Menu Macro Name control value to mcr_ShortCut, save and close mac_Menu Macro.
  7. Click on the mac_Menu Macro to select it.
  8. Highlight Macro in Tools Menu to display its Options.
  9. Click on Create Toolbar from Macro option to convert the macro into a Toolbar; myToolbar button will appear near to the existing Toolbar with the label myToolbar.
  10. You may click on it to display the Menu.

Create Menus with Macros


We have learned how to create Menus and Toolbars through Toolbars - ->Customize options, in earlier Posts.  If you would like to have a second look at them then the links are given below:

There are other methods to create simple custom menus for Forms/Reports and use them with your Applications.  We are going to learn how to create a Shortcut Menu with Macros and attach it to a Form.

Sample Demo Run.

  1. Select the Macro Tab on the Objects pane.
  2. Click New to open a new Macro in Design View.
  3. If the Macro Name Column is not visible then click on the Macro-Name Toolbar Button (with xyz label) to display the Macro Name Column.
  4. Type Clo&se under the Macro Name column in the first row.
  5. Select Close from the drop down list of Action.
  6. Type &Preview in the second row under Macro Name.
  7. Under Action select OpenReport from the drop-down list.
  8. In the Property Sheet under Action Arguments select a Report from your list of Reports (I have selected Employees in the sample image given above) in the Report Name Property.
  9. Select Print Preview in the View Property.
  10. Type &Form in the third row under the Macro Name column.
  11. Select  Open Form in the Action Column.
  12. Select an existing Form's name from the Form Name Property drop-down list.
  13. Select Form in the View property.
  14. Type a dash (-) character in the next row under Macro Name column.
  15. Type &GotoNext in the fifth row under Macro Name column.
  16. Select GotoRecord in the Action Column.
  17. Type &Minimize in the sixth row under Macro Name.
  18. Select Minimize from the drop-down list in Action Column.
  19. Save the Macro with the name mcrShortCut and close it.

You can add as many commands or actions like opening Queries or running Programs etc. can be added to your menu for the convenience of your Application Users.

Defining Macro as Menu.

Our work on the Macro Menu is complete, but a little more work is left to define the Macro as a Menu. 

  1. Open a new macro in design view.
  2. Select AddMenu from the drop-down list in Action Column.
  3. Leave the Menu Name Property Blank. This is used for Group Menu Names when you have group Menus with different set of actions.  In this case this Macro will have more than one AddMenu Action lines with different set of Menu Macros.
  4. Select mcrShortCut in the Menu Macro Name Property.
  5. Save the macro with the name mcrShortCutMenu.
  6. Open one of your Forms in Design View (don't open the Form that you have used in the OpenForm action in the first macro).
  7. Display the Form's Property Sheet (View - ->Properties).
  8. Set the following Property Values of the Form as given below:
    • Shortcut Menu = Yes
    • Shortcut Menu Bar = mcrShortCutMenu
  9. Save the Form.
  10. Open the Form in normal view.
  11. Right-Click on the Form to display the Shortcut Menu.  See the sample image given below:

Try out options displayed in the Shortcut Menu.

We can not only create Shortcut Menus but also Toolbars and Menu Bars too.  This we will learn Next.


Join Split Array Functions-2

This is the continuation of last week's Article: Join Split Array Functions

If you have not gone through the fundamentals of the above functions then please do that, by following the above link, before continuing.

Since, Join() and Split() Functions are related, It is time to try out a real world example with them.  It may not be the easiest solution to the problem we are trying to solve, but it will help to understand these functions' usage better.

  1. Import Employees Table from the Northwind sample database: C:\Program Files\Microsoft Office\Office11\samples\Northwind.mdb 
  2. Open a new Query in SQL View (don't select any Table from the displayed list).
  3. Copy and paste the following SQL string into the SQL editing window and save the Query with the name EmployeeSelectQ.
    SELECT Employees.*
    FROM Employees;
  4. Design a new Form like the sample image giving below (you may use the Form Wizard to quickly create the Form) using EmployeeSelectQ Query as Record Source. 
  5. Add a Text Box and a Command Button at the bottom of the design.
  6. Select the Text Box and display the Property Sheet (View - ->Properties or Design - ->Property Sheet in 2007).
  7. Change the Name Property Value to txtCodes.
  8. Select the Command Button, change the Name Property value to cmdFilter and the Caption Property value to Apply Filter.
  9. Select the Child label of the Text Box and change its Caption value to Employee Codes:.
  10. Display the VBA Code Module of the Form (View - ->Code or click View Code toolbar button from Design Menu  of 2007).
  11. Copy and paste the following VBA Code into the Form Module and save the Form with the name EmployeeSelect:
    Private Sub cmdFilter_Click()
    Dim txt_Codes As String, varList As Variant
    Dim varCodes As Variant, j As Integer, x
    Dim maxCodes As Variant, invalid_Codes As String
    txt_Codes = Nz(Me.txtCodes, "")
    maxCodes = DMax("EmployeeID", "Employees")
    If Len(txt_Codes) = 0 Then
      varList = Null
       'Split the items into the array.
      '(Here Array() Function will not work
      'becuase the values in txtCodes variable is a String
      'and will be treated as a single item).
      varCodes = Split(txt_Codes, ",")
      'Validation check
      invalid_Codes = ""
      For j = 0 To UBound(varCodes)
         x = Val(varCodes(j))
         If x < 1 Or x > maxCodes Then
            invalid_Codes = invalid_Codes & Format(x, "0 ")
         End If
      If Len(invalid_Codes) > 0 Then
         MsgBox "Invalid Employee Codes: " & invalid_Codes & vbCr & vbCr & "Correct and retry."
         Exit Sub
      End If
      'here "varList = txt_Codes" is also works
      'because txt_Codes values are separated with commas already
      varList = Join(varCodes, ",")
    End If
      'Call the EmployeeFilter() function
      EmployeeFilter varList
      Me.RecordSource = "EmployeeSelectQ"
    End Sub
  12. Press Alt+F11 to open the VBA Editing window, if you have already closed it, select Module from Insert Menu to add a new Standard Module.
  13. Copy and paste the following VBA Code of EmployeeFilter() Function into the Standard Module and save it:
    Public Function EmployeeFilter(ByVal Criteria As Variant)
    Dim strsql0 As String, sql As String
    Dim db As Database, qryDef As QueryDef
    strsql0 = "SELECT Employees.* FROM Employees WHERE (((Employees.EmployeeID) In ("
    Set db = CurrentDb
    Set qryDef = db.QueryDefs("EmployeeSelectQ")
    If IsNull(Criteria) Or Len(Criteria) = 0 Then
        sql = "SELECT Employees.* FROM Employees;"
        Criteria = Criteria & ")));"
        sql = strsql0 & Criteria
    End If
        qryDef.SQL = sql
    End Function
  14. Open the EmployeeSelect Form in normal view. The sample image of the Form is given below:
  15. Enter the EmployeeIDs 2,3,7 and click on the Apply Filter Command Button.

    Now, the EmployeeSelect Form have only three records, with employee codes 2,3 & 7.

  16. Delete all the Text Box contents and click on the Apply Filter Command Button.

The filter action is now reversed and all the records of the Employee Table are now available on the Form.  In other words it works like a Reset command when the Text Box is empty.

You may try with different EmployeeIDs list.

The values entered into the Text Box must be within the range from 1 to Maximum Value of Employee Code. Out of Range numbers will display an Error message and abort the program.


Join Split Array Functions


The Joint/Split MS-Access functions are not so popular or used frequently in programs, but their usage is very interesting and powerful too. Let us take one by one and learn how powerful they are?  We will write a program later to demonstrate their usage in real world programs.

Let us take the Array() Function first.  Before we try the Array() Function let us find out how to define an array variable and assign values into each element of the array?

Demo of Array() Function

'Dimension the array for six elements
Dim varNumber(0 To 5) As Variant, j As Integer
For j = 0 To 5
    varNumber(j) = j + 1

  1. The first statement in the above program defines a variable varNumber as a Variant Type array for 6 elements.
  2. Another variable j is defined as an integer that will be used as an index variable in the For. . .Next loop.
  3. The next three statements in the above program assigns values 1 to 6 into the array elements as:
  • varNumber(0) = 1
  • varNumber(1) = 2
  • varNumber(2) = 3
  • varNumber(3) = 4
  • varNumber(4) = 5
  • varNumber(5) = 6

If we attempt to assign a value into element varNumber(6) then it will run into error because we have not dimensioned the array beyond the varNumber(5) element.

We can do this task with only one statement if we use the Array() Function as below:

varNumber = Array(1,2,3,4,5,6)

We don't have to define the variable for a fixed number of elements as we did in the first statement, it does this task automatically depending on the number of items in the argument list.  We have used constant values 1 to 6 to assign into the array elements.  Another thing to keep in mind is that the target variable varNumber must be always defined as a Variant Type Variable.  That gives us more flexibility in assigning mixed Data Type values into different elements of the target variable like the example given below:

    varNumber = Array("Nancy",25,"Andrew",30,172.5)

We have assigned a mix of String, Integer and Double Data Type values into different elements of the same array.  Again we have used constant values to assign into the array.

This Function is very useful to pass several parameters to a Program as a single block without defining several parameter declarations in the main program.

You can use Constants, Variables or data Field Values to assign values into the array.


a = "Nancy"
 b = 25
 c = 172.5
 varNumber = Arrary(a,b,c)


varNumber = Array(Me![FirstName],Me![BirthDate],Me![Address])

Next we will examine the usage of Join() Function. Let us make another array of values for this function so that its usage is understood easily.

varNumber = Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat")

We have the names of week days in the array variable varNumber.

varNumber(0) = "Sun"
 varNumber(6) = "Sat"

If you want to combine all values from seven elements of this array variable and create a single string; each item separated with commas (like: Sun,Mon,Tue,Wed,Thu,Fri,Sat) then in normal case you must write the following statements to achieve this result:

Dim strWeeks as string, j as integer
For j = 0 to 6
   if j=6 then
     strWeeks = strWeeks & varNumber(j)
     strWeeks = strWeeks & varNumber(j) & ","
   end if

Join() Function:

The above task takes only one statement with the Join() Function:

strWeeks = Join(varNumber,",")

The first parameter to the Join() Function is the array of values to be joined together to form a string.  Second parameter is the item separator character; comma, if omitted a space character will be used as separator character by default, otherwise whatever character you specify will be used as separator. 

Result: strWeeks = "Sun,Mon,Tue,Wed,Thu,Fri,Sat"

Split() Function:

Split() is the complementary Function of Join().  It splits the individual item separated by the delimiter character and stores the values into an array variable of Variant Type.

We need the following lines of code to do the same task of Split() Function:

Dim strWeeks(0 To 6) As Variant, strtxt As String
Dim j As Integer, k As Integer

strtxt = "Sun,Mon,Tue,Wed,Thu,Fri,Sat"
k = 0
For j = 1 To Len(strtxt) Step 4
   strWeeks(k) = Mid(strtxt, j, 3)
   k = k + 1

With the use of Split() Function it takes only one statement to do the job that we did with the above program:

 strWeeks = Split(strTxt,",")

Next Week we will use these functions in a Program to redefine a Query linked to a Form to filter and view data.


Memo field and data filtering


We design tables carefully to organize information properly so that we can retrieve them easily through search, filter etc.  If you look at the Employees table in the Northwind.mdb sample database you can see that even an employee's name is split into three parts (Title, First Name & Last Name) and stored into three different fields so that we can work with each piece of information separately.  The name fields are defined to a specific length taking into consideration of the size of the source information.

When it comes to recording of employees' qualifications or work experience we cannot define the field size to a specific length because the length of information may vary from case to case.  This is where we think of the Memo field type.  Memo field is a free form text field where you can record descriptive information of various lengths.

When we want to extract information for reports or views we never think of using the Memo field contents because it has information in an unpredictable form and considered difficult to work with besides displaying/printing it's contents.

Even though Memo Field has only limited flexibility in data filter operations, we can filter records based on specific text spread all over different locations in the memo field.

We can try few examples with Memo Field data from the Employees Table of Northwind.mdb sample database.

Prepare for a Trial Run.

  1. Import the Employees Table from the sample database C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb.
  2. Open the Employees Table in datasheet view.
  3. Move the horizontal scrollbar at the bottom to the right so that the Notes Memo Field contents are visible to you.
  4. Point the mouse at the left border of the table at the inter-section of the two rows so that the mouse pointer turns into a cross.
  5. Click and drag down to increase the row size bigger so that the Notes field contents can be viewed properly.

    Now, if you look at the qualification information of each employee record you can see that most of them have a BA degree but the text "BA" is not positioned at a specific location in the Memo Field. If you want to filter all employees records with BA degree, how do we do it?

    Let us do it directly on the datasheet view first, before we consider writing a Query to filter data based on text in the Memo Field.

  6. Highlight the letters BA in any one of the records and Right-click on the highlighted text.

    A shortcut menu is displayed and the suggested options are for filtering data from the Memo Field are Contains "BA" or Does Not Contain "BA".

  7. Click on the Contains "BA" option to filter the records with the text "BA" appearing anywhere within the memo field.

If you want to filter records this way for printing a Report then we must create Queries to filter data based on text in Memo Field.  You can use the Like Operator combined with AND, OR logical operators.

Copy and the paste the following SQL Strings into the SQL Editing Window of new Queries and save them with the suggested names:

Query Name:  Employee_BAQ

SELECT Employees.LastName, Employees.FirstName, Employees.Notes
FROM Employees
WHERE (((Employees.Notes) Like "*BA*"));

The output of this Query will include a record of an employee with MBA Degree too, because the text 'BA' in MBA. If you want exclude this record then modify the criteria with a space immediately after the first asterisk like '* BA*'.

Query Name:   Employee_BA_BSCQ

SELECT Employees.LastName, Employees.FirstName, Employees.Notes
FROM Employees
WHERE (((Employees.Notes) Like "* BA*")) OR (((Employees.Notes) Like "*BSC*"));

The above query gives the example of the usage of the logical operator OR to filter data of employees with graduation in BA or BSC.

Query Name:   Employee_BA_BSCQ

SELECT Employees.LastName, Employees.FirstName, Employees.Notes
FROM Employees
WHERE (((Employees.Notes) Like "* BA*" And (Employees.Notes) Like "*psychology*"));

The above example shows the usage of the logical operator AND and filters the records of the employees with graduation in BA in Psychology.


Lively Controls on Form


We always concentrate on timely completion of a Project and to deliver it to the Users as quickly as possible.  When I am pressurized to complete a particular project I will try to complete it as quickly as possible and deliver it to the User.  But all the time I would like to have a second look at the overall design and appearance of the Forms and Reports in a relaxed atmosphere and bring in some improvements with whatever new tricks that I can think of at that point of time.

In my past experience on these kind of improvements I have been always rewarded with appreciation from the Users. Their responses on these little things that I have incorporated into the design always encouraged me to look for something different next time.  Forms are the main component of any Application that catches the eye of the Customers besides nicely formatted Reports and impressive Graph Charts.

Forms have a special place in the minds of the User. It should be pleasing to look at and user friendly to work with.  Once the initial pressure of designing the main components of an application is over and if you have enough time to have a second look at the main forms' design you can make use of your creative ideas and pull little tricks on the Form that will do wonders. All the controls we draw on the Microsoft Access Forms remains stationery for ever.  If we can put some action of movement on some of the controls, without overdoing it, it will definitely have some positive impact on the Customers.

We have learned several animation tricks on controls in the past and If you would like to take a second look at then their links are given below:

  1. Command Button Animation
  2. Reminder Ticker Form
  3. Startup Screen Design
  4. Animated Floating Calendar
  5. Wave Shaped Reminder Ticker
  6. Command Button Animation-2
  7. Animating Label on Search Success
  8. Run Slide Show when Form is Idle
  9. Label Animation Style-1
  10. Label Animation Style-2
  11. Label Animation Variant
  12. Label Animation Zoom in Style
  13. Label Animation in Colors
  14. Label Animation Zoom-out Fade
  15. Digital Clock on Main Switchboard

Option Group Control Style Change on Mouse Move.

Here, we will do a simple trick on an Option Group Control to respond, when the mouse moves over it for selection of options.  The trick is simple, when the Option Group control is created we will give it a Raised Style design.  When the mouse moves over the Option Group control the Style will change to Sunken.  When the mouse moves away from the Option Group control it will go back to its earlier Raised state.  Repetition of this action gives a lively look to the Option Group control.

Create a Form for Demo.

  1. Open a new Form in Design View.
  2. Click on the Wizard Button (with the magic wand icon) on the Toolbox to select it, if it is not already in selected state.
  3. Select the Option Group control and draw it on the detail section of the form.
  4. Enter the options as shown on the design below by pressing Tab key after each option to advance to the next row. You may enter any Text as options as you like.
  5. Complete the design by selecting the Finish Command Button.
  6. Move the attached label above and make it as wide as the Option Group Control and change its Caption to Main Menu.
  7. Move the attached child label above and make its width same as the Option Group control and align it to left edge. 
  8. Change the Caption of the label to Main Menu.
  9. Click on the Option Group to select it and display its Property Sheet (View - -> Properties or press ALT+Enter).
  10. Change the following Property Values as given below:
    • Name = Frame0
    • Back Style = Normal
    • Special Effect = Raised

    The Form's Class Module Code.

  11. Display the VBA Code Module of the Form (View - ->Code or click on the Module Toolbar Button or press ALT+F11).
  12. Copy and Paste the following VBA Code into the VBA Module of the Form:
    Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
       If Me.Frame0.SpecialEffect <> 1 Then
           Me.Frame0.SpecialEffect = 1
       End If
    End Sub
    Private Sub Frame0_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
       If Me.Frame0.SpecialEffect <> 2 Then
           Me.Frame0.SpecialEffect = 2
       End If
    End Sub
  13. Save and close the Form.

    The Demo Run.

  14. Open the Form in normal view.  You will find the Option Group control is in Raised style.
  15. Move the mouse over the control and it will enter into Sunken state.
  16. Move the Mouse pointer away from the control and it will restore back to Raised state.
  17. Repeat this action in quick succession and you can see how the Option Group control responds to this simple action, otherwise the control remains rigid for ever.
Technorati Tags: ,

Create your own color palette


We have learned Binary, Octal & Hexadecimal Numbering Systems and learned few simple rules by which we can devise new numbering systems with any Base value, provided the user knows about it and can decipher the new number. 

Last week we have worked with a Form to enter Decimal Numbers and get it converted into Binary as well as to display the RGB Color for that number.

If you would like to learn and understand Binary, Octal and Hexadecimal Numbering Systems then check the following Posts:

  1. Learn Binary Numbering System
  2. Learn Binary Numbering System-2
  3. Octal Numbering System
  4. Hexadecimal Numbering System
  5. Colors 24 bits and binary conversion

This week, we will work with a Form based Utility that is more useful to you at design time of a new Project.  You can create your own 24 bit custom colors visually and save up to 15 colors in a Color Palette on the Form. You can pick any of this colors and apply it on Form background or on other Control's Foreground, Background or Border Color Properties at design time.

An image of the Employees Form in Design View with the Form's Header Section Property Sheet along with the Color Palette Form is given below for reference:

The Color Pallette Usage

A new custom color is created on the color palette Form (see the big rectangle) and applied it on the Employees Form Header Section Background, by setting the color value in the Back Color Property.

Click on the image to enlarge it.  The Employees Form is in Design View, its Header Section is in selected state and its Property Sheet with the Back Color Property is visible.  When you click on one of the grid of 15 Color Boxes (these you can create yourself and save it in each box of the color palette, over-writing the existing ones) will display its corresponding color number in the Text Box above the Color Palette with RGB Color label.  You can Copy (Ctrl+C) and Paste (Ctrl+V) into the Property Sheet for Value: Back Color, Fore Color or Border Color, as the case may be, to set the Color of Form Background or Control Colors.

If you are using MS-Access2007 the Color Values in the above Properties will be shown in Hexadecimal Form with the hash symbol like #4E61BC.  But you can paste the Decimal Color Value there and it will automatically convert into Hexadecimal form.  Since, we have learned Hexadecimal Numbering System I want to draw your attention to a small problem in Microsoft Access2007.

A Test Run.

Let us take a sample Color Number in Decimal: 12345678 for the Form Header or Detail Section Background and paste it (or type it) into the Property Sheet and press Enter key. It will be converted into Hexadecimal Number like #4E61BC and the Form Background will be filled with a Dark Blue Color.  Take note of the first two digits and last two digits of Hexadecimal Number shown in blue and red colors.

  1. Now, open the VBA Editing Window (Alt+F11) and display the Debug window (Ctrl+G)
  2. Type ? HEX(12345678) and press Enter key to convert the Decimal Number 12345678 into Hexadecimal Number. The Question mark is the Print Command.
  3. The result will be BC614E and if you paste this value into the Property Sheet as #BC614E it will be accepted as it is and the color displayed will be Dark Red Color instead of Dark Blue.  Compare this number with the earlier number shown in blue and red colors.  MS-Access2007 converts the Color Decimal Number into Hexadecimal form and switches the right-most two Hexadecimal digits with the left-most two digits because it handles the color values (Red and Blue positions) differently.
  4. Suppose you have a Color Value in Hexadecimal form like 614E (24910 decimal) while pasting the value into the Property sheet you must change it to #4E6100 to get the Color equal to the decimal value 24910.  The color number is always expressed in 6 digit hexadecimal number.
  5. The safest method is to Paste the decimal value into the Color Property and let MS-Access2007 take care of the conversion part.

Creating New Colors and Saving it in Color Pallette.

Now, we will look at the simple trick of designing new Colors (logically you have over 16 Million 24 Bit Colors to work with) and saving it on the Color palette for later use. 

You can download a database with the above Form with the Programs from a link at the bottom of this Article, so that you can Import this Form into your new Projects, design your own colors and use them on your Forms or Controls.

You can click on the above image to enlarge it to view the controls properly.  Let us examine the controls on the Form.

  1. There are three Scrollbar controls to input the integer values from 0 - 255 for Red, Green and Blue colors (primary colors) by moving the Scrollbar's slider controls to the right to increase the value, or left to decrease the value, of each color. If you click on the arrow marks on the right/left edges of the scrollbars then the values will increase by 1 on each click or if you click and hold the control then the value will increase/decrease rapidly and the color graph also will change with it.  You can watch the large rectangle at the bottom right how the new color is formed by changing the colors with the Red, Green and Blue Scrollbars.
  2. The Bar Graph at the right of the scrollbars gives a visual indication of the variation of color values, which mixes together to form the new color, and the decimal values appear in the Text Boxes at the left, with the labels Red, Green and Blue.
  3. The big rectangle label control, at the bottom right of the Form, displays the new color created by setting the values in the scrollbar control.
  4. The Text Box with the Label RGB Color displays the RGB Color Number.
  5. You can highlight the number in the RGB Color Text Box and Copy (Ctrl+C) the Number and Paste (Ctrl+V) it in the Form's/Control's Back Color, Fore Color or Border Color Property to set the Color there.
  6. If you would like to preserve this newly created color then you can Click on the big rectangle, to pick the Color from there, then click on one of the 15 color boxes shown at the left to store that color there for later use.
  7. If you want to pick a color from one of the saved colors then click on it.  The selected color number will appear in the RGB Color Text Box above.  You can Copy and Paste it in the Color Property of the Form or Control.


  1. You have the RGB Color Number, but you want to modify it to your liking then Copy and Paste that color decimal number into the RGB Color Text Box (or type it in) and press the Enter Key.  The color will appear in the big rectangle and the Red, Green and Blue Text Boxes will display their corresponding color values. The Bar Chart will give you a visual clue of each color at a glance.  You may then move the slider of the Scrollbar Controls to modify the color.
  2. If you are using MS-Access2007 then you must convert the Hexadecimal Number into Decimal Number by typing ? &hXXxxXX in the Debug Window, where xX stands for Hexadecimal digits. Don't forget to interchange the rightmost two digits with the leftmost two digits of the six digit hexadecimal number.  You will get the result in Decimal Number form and then you can copy it into the RGB Color Text Box to modify.
  3. You can directly enter integer values (Ranging from 0 to 255) in Red, Green and Blue Text Boxes given at the left of the Scrollbar Controls to create a new color.
Technorati Tags: ,,

Download Demo Database.

Download Demo RGBColor.zip


Colors 24 Bits and Binary Conversion


If you were following the last four Articles on Numbering Systems (Decimal, Binary, Octal and Hexadecimal) then here is something for you to play with.  Before that following is the list of Links of those Articles. It is better if you take a look at them before continuing. You will be in a better position to understand it, appreciate the usefulness and can enjoy working with its methods.

  1. Learn Binary Numbering system
  2. Learn Binary Numbering system-2
  3. Octal Numbering System
  4. Hexadecimal Numbering System

Color Number Range 0 to 16 Million.

The above is an image of a MS-Access Form where you can enter a Decimal Number, ranging between 0 and 16777215 (equal to a maximum of 24 Bit Binary Value) and get it converted into Binary Number.  At the same time the number entered into the Text Box will be used for generating the RGB Color that will be displayed at the top color band, where the binary bit positional sequence numbers are shown. Logically you can display a total of over sixteen million colors on the top color band on the form.

If you look closely on the image above, you can see that the value 65535 is entered into the text box and the Binary digits 1111111111111111 are appearing in the grey band above the Text Box.  The decimal value equal to each bit position is in red font color in the labels arranged vertically above the binary digits. If you add up all those red colored values together you will get the result equal to the value in the text box.

The Red, Green, Blue (RGB) Colors.

Binary bit number 0 to 7 (8 bits) values give the Red Color and bit number 8 to 15 (8 bits) values form the Green Color.  When Red and Green Colors are mixed you will get Yellow Color shown above the Red,Green & Blue Color bands.

Let us make little modification to the above sample color by subtracting some bit values and see how the color changes on the top color band.  Click on the labels with the value 4096 and 64 one by one.  These values are moved into the Text Box and will be subtracted from 65535 (the sample number already appearing in there). The color of the labels changed back to its default color black.  Click on the Command Button with the label Convert. The result value (RGB Number) is appearing in blue color below the text box and the RGB Color of that number is now showing on the top color band. See the image given below:

If you want to add some more color (Red, Green or Blue) to the existing color number you can click on the labels with numbers in black color, to mix the color above those labels, and click Convert Command Button to show the result on the top band.  The intensity of the color added depends on the magnitude of the number selected from within the respective color band. The color of the label clicked will change to red indicating that the value is added to the color number.

If you click on the labels with red colored font again it will change to black indicating that those values will be subtracted from the color values.  You must click on the Convert Command Button to evaluate the final color value and display the color on the top color band. Every time the Binary digits of those values will also appear in the grey band above the Text Box as well.

To reset everything back to default setting click on the Reset Command Button.

How to make a Color Choice?

You can use one of the three methods given below or a mix of all the three to enter the number into the Text Box:

  1. Enter a Decimal Number into the Text Box and Click on the Convert Command Button.
  2. Enter a valid expression into the Text Box like 2^10+2^5+5*25+1638 and click Convert Command Button.
  3. Click on the labels showing the binary digit values underneath Red, Green & Blue color bands to pick those color numbers and to mix them together to create a new color. Each value clicked will be added into the Text Box in the form of an expression. Each Label clicked will change its font color to Red indicating it is added to the color number and if any of those labels are clicked again that color value will be subtracted and the label font color will change back to default black.  When done, click Convert Command Button.
  4. You can use a mix of all the three methods given above to input a valid expression to arrive at a valid value between 1 and 16777215 (16777215 = 256 Blue * 256 Green * 256 Red -1)

Get the result in three ways:

  1. The RGB Color equal to the number selected is displayed on the top color band.
  2. The Binary Number.
  3. The RGB Color Number of the top color band.

How to Use the Newly Created Color.

You can use this Color Number while designing your Forms or Controls to set the Background Color, Foreground Color or Border Color on the Property Sheet of the Form or Control.  If you are a Web Designer you can convert the Color Number into Hexadecimal format and use it on Style Sheets.  You can call the Function HEX$(Decimal Number) in Debug Window to convert it into Hexadecimal value.  Use the color value in 24 bit format like #0000FF for decimal color value 255.

Enter the number 16777215 in the Text Box and click Convert Command Button to change the top color band to white.

You can download a database with the above Form and Programs by clicking on the Download link below:

Technorati Tags: ,

Download Demo Database

Download Demo Binary.zip


Hexadecimal Numbering System

Continuation of earlier Articles:

  1. Learn Binary Numbering System
  2. Learn Binary Numbering System-2
  3. Octal Numbering System

Hexadecimal Numbers are yet another method to write Binary Values into shorter form than Octal Numbers.  This Numbering System has Number 16 as its Base.  As per the basic rules, which we are following to devise new Numbering Systems, the Base-16 Numbering System have its digit values from 0 to 15 (i.e. one less than the base value 16).  Like decimal numbering system, hexadecimal numbering System also have digit values from 0 to 9. Since, there are no single digit values for 10 to 15 the alphabets A to F are used.

Hexadecimal Decimal
 0            0
 1            1
 2            2
 3            3
 4            4
 5            5
 6            6
 7            7
 8            8
 9            9
 A           10
 B           11
 C           12
 D           13
 E           14
 F           15

Now, let us see how we can convert binary numbers into hexadecimal form. We will use the same method we have used for converting Binary to Octal form.  We have made groups of 3 binary digits of binary value 011,111,111 (equal to 255 decimal) to find the Octal Number &O377.  For Hexadecimal Number we must take groups 4 binary digits (Binary 1111 = (1+2+4+8) = 15, the maximum value of a hexadecimal digit) and add the values of binary digits to find the hexadecimal digit.

Let us find the Hexadecimal value of Decimal Number 255.

Decimal 255 = Binary 1111,1111 = Hexadecimal digits FF

It takes 3 digits to write the quantity 255 in decimal as well as in Octal 377 (this may not be true when bigger decimal numbers are converted into Octal) but in Hexadecimal it takes only two digits: FF or ff (not case sensitive).

Let us try another example:

Decimal Number 500 = Binary Number 111110100

     111,110,100 =  Octal Number 764

0001,1111,0100 = Hexadecimal Number 1F4

To identify Octal Numbers we have used prefix characters &O or &0 with the Number.  Similarly, Hexadecimal numbers have &H (not case sensitive) as prefix to identify when entered into computers like &H1F4, &hFF etc.

You can type ? &H1F4 in Debug Window of VBA Editing screen to covert and print its Decimal Value.

MS-Access Functions

There are only two conversion Functions: Hex() and Oct() in Microsoft Access, both uses Decimal Numbers as parameter.

Try the following Examples, by typing them in the Debug Window to convert few Decimal Numbers to Octal and Hexadecimal:

? OCT(255)
Result: 377

? &O377
Result: 255

? HEX(255)
Result: FF

? &hFF
Result: 255

? HEX(512)
Result: 200

? &H200
Result: 512

MS-Excel Functions

In Microsoft Excel there are Functions for converting values to any of these form.  The list of functions are given below:

  1. DEC2BIN()
  2. DEC2OCT()
  3. DEC2HEX()
  4. BIN2DEC()
  5. BIN2OCT()
  6. BIN2HEX()
  7. OCT2DEC()
  8. OCT2BIN()
  9. OCT2HEX()
  10. HEX2DEC()
  11. HEX2OCT()
  12. HEX2BIN()

You can convert Decimal Value a maximum of 99,999,999 to Octal Number with the Function DEC2OCT() and its equal value of Octal to Decimal OCT2DEC() Function.

499,999,999,999 is the maximum decimal value for DEC2HEX() and its equal value in Hexadecimal form for HEX2DEC() Function.

With the Binary functions you can work with the Decimal value range from 512 to 511 up to a maximum of 10 binary digits (1111111111 the left most bit is the sign bit, i.e. if it is 1 then the value is negative and when 0 positive).

Technorati Tags:

Octal Numbering System

Continued from Last Week's Post.

This is the continuation of earlier Articles:

1.  Learn Binary Numbering System.

2.  Learn Binary Numbering System-2.

Please go through the earlier Articles before continuing. . .

We will bring forward the result of the Decimal 255 to Binary conversion for a closer look at these two numbers: 11111111.

Decimal Number 255 needs only 3 digits to write this quantity but when we convert it into binary it needs 8 binary digits or bits.  Earlier computer programs were written using binary instructions.  Look at the example Code given below:

Later programming language like Assembly Language was developed using Mnemonics (8 bit based binary instructions) like ADD, MOV, POP etc.  Present day Compilers for high-level languages are developed using Assembly Language. A new numbering system was devised to write binary numbers in short form.

Octal Numbering System.

This numbering system has number 8 as its base and is known as Octal Numbering System.  Based on the general rule that we have learned, Octal Numbering System have digits 0 to 7 (one less than the base value 8) to write numerical quantities. There is no 8 or 9 digits in this numbering system. Octal Numbering System has been devised to write Binary instructions into short form and to write program codes easily.

For example an 8 bit Binary instruction looks like the following:

00010111  (instruction in Octal form 027), ADD B,A (Assembly Language)

The first two bits (00) represent the operation code ADD, next three bits (010) represents CPU Register B and next three bits (111) represents CPU Register A, the 8 bit binary instruction says add the contents of register A to register B.  If the instruction must be changed to (ADD A,B) add register B to A then the last six bits must be altered as 00,111,010. This can be easily understood if it is written in Octal 027 to 072 rather than Binary 00111010.

So, Octal (Base-8) Numbering System was devised to write binary based instructions in short form. Coming back to the Octal Numbering System, let us see how we can work with these numbers.  First, we will create a table similar to the decimal/binary numbering Systems.

85 84 83 82 81 80
32768 4096 512 64 8 1

We will use the same methods we have used for Binary to convert Decimal to Octal Numbers.

Example: Converting 255 into Octal Number?

For Binary conversion we could take the highest integer value from the table above and subtract it from 255.  But here we cannot do that.  By looking at the table above we can see that 512 is more than 255, so we must see next number 64 goes how many times into 255?


255/64= Quotient=3, Remainder=63 (Here, we have to take the Quotient as the Octal Digit).

In this method we must take Quotient 3 ( 64 x 3 = 192) for our result value and the balance is 63 (i.e. 255 - 192)

85 84 83 82 81 80
32768 4096 512 64 8 1

63/8 = Quotient = 7, Remainder=7

85 84 83 82 81 80
32768 4096 512 64 8 1
      3 7  

7 is not divisible by 8, hence 7 goes into the Units position

85 84 83 82 81 80
32768 4096 512 64 8 1
      3 7 7


255/8 = Quotient = 31, Remainder=7

85 84 83 82 81 80
32768 4096 512 64 8 1

31/8 = Quotient = 3, Remainder=7

85 84 83 82 81 80
32768 4096 512 64 8 1
        7 7

3 is not divisible by 8, hence it is taken to the third digit position.

85 84 83 82 81 80
32768 4096 512 64 8 1
      3 7 7

Writing Binary to Octal Short Form

As I mentioned earlier that Octal Numbering System has been devised to write Binary Numbers into short form.  Let us see how we can do this and convert binary number easily into Octal Number.

The Decimal Number 255 when converted into Binary we get 11111111. To convert it into Octal Numbers set the binary digits into groups of three bits (011,111,111) from right to left and add up binary values of each group and write the Octal value.

011 = 1+2 = 3

111 = 1+2+4 = 7

111 = 1+2+4 = 7

Result: = 377 Octal.

You may try converting few more numbers of your own to understand this Numbering System better.  First, convert some Decimal Numbers to Binary and group the Binary Digits in sets of 3 bits and add up the values of the group as if they are the first three bits of binary number.

Since, Octal Numbers are written with digits 0 to 7, it looks like decimal numbers to both man and machine. There must be a way to distinguish Octal Numbers from decimal numbers. Therefore it is written with the prefix characters &O. When Octal numbers are written alone or used in expressions it is written with the prefix characters &O (the letter O, not case sensitive) or &0 (digit zero), like &O0377 or &O377 or &0377.

You can try this by typing the above number in the Debug Window in the VBA Editing Screen of Microsoft Access or Excel.


? &O0377

result: 255

? &0377

result: 255

? &0377 * 2

result: 510

Next we will learn Base-16 (Hexadecimal) Numbering System.

Technorati Tags:

Learn Binary Numbering System-2

Continued from Last Week's Post

This is the continuation of last week's Article Learn Binary Numbering System 

Last week we have gone through the fundamentals of Binary Numbering System and learned how to convert decimal number 10 to binary and seen different methods also.

I hope you have tried converting the sample number 255, that I have given at the end of last week's Article, using both methods shown there.

If you could not do it then let us do it here.


  1. Find the highest Integer Value from the Binary Table that goes into the Decimal Number and subtract that value from it. Here, 128 is the highest value that can be taken.



  3. Write Binary digit 1 at the 128 number position underneath the Binary Table.
  4. 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
    32,768 16,384 8,192 4,096 2,048 1,024 512 256 128 64 32 16 8 4 2 1
  5. The next highest integer number from the Binary Table that goes into 127 is 64.
  6. 127
    215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
    32,768 16,384 8,192 4,096 2,048 1,024 512 256 128 64 32 16 8 4 2 1
                    1 1            
  7. Repeat this method till you get the value for unit position.
215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
32,768 16,384 8,192 4,096 2,048 1,024 512 256 128 64 32 16 8 4 2 1
                1 1 1 1 1 1 1 1

You can cross-check the result by adding up all values taken from the 1s bit (the name for the binary digit) position to arrive at the value you were trying to convert into Binary.


  1. Divide the Decimal Number by 2 and take the reminder value and write at the unit position in the Binary Table.

    255/2 = Quotient = 127, Remainder = 1

  2. Next step, take the Quotient Value (127) of previous calculation, divide it by 2 and find the remainder. Write the remainder value to the left of the earlier written binary digit (bit).  Repeat this process till nothing left to divide and write the final remainder value to the binary table.

127/2 = Quotient = 63,  Remainder = 1

63/2   =  Quotient = 31,  Remainder = 1

31/2   =  Quotient = 15,  Remainder = 1

15/2   =  Quotient =   7,  Remainder = 1

7/2   =  Quotient =     3,  Remainder = 1

3/2   =  Quotient =     1,  Remainder = 1

1/2   =  Quotient =     0,  Remainder = 1

You will get the Binary Number 11111111 of Decimal Number 255.

You can experiment this with bigger Decimal Values or write some unknown Binary Values with random 1s and 0s and try converting it into Decimal Numbers.

Next, let us try some additions and subtractions with Binary Numbers.  If you know how to do additions and subtractions with Decimal Numbers then you will have no problems with Binary Numbers. 

Example : Addition

11101110 238
+1110111 119
101100101 357

Start adding from the rightmost digits:

  1.   0+1 = 1
  2.   next 1+1 = 2, put 0 and carry 2 to the next position (like 5+5=10 we put 0 at the unit's position and carry 1 to the next position to add)
  3.   next 1+1+1 carry = 3(binary 11) , put 1 and carry 2 to the next position
  4.   next 1+1 carry = 2(binary 10), put 0 and carry 2 to the next position
  5.   Next 1+1 carry = 2(binary 10), put 0 and carry 2 to the next position
  6.   Next 1+1+1 carry = 3(binary 11), put 1 and carry 2 to the next position
  7.   Next 1+1+1 carry = 3(binary 11), put 1 and carry 2 to the next position
  8.   Next 1+1 carry = 2(binary 10), put 0 and put 1 to the next position.

Example : Subtraction

11001110 206
-1111111 127
1001111 79
  1.   0-1 cannot be done, so take 2 from the next position, now 2-1 = 1, but the next position on the first line become 0.
  2.   0-1 cannot be done, so take 2 from the next position, now 2-1 = 1, next position on the first line become 0.
  3.   0-1 cannot be done, so take 2 from the next position, now 2-1 = 1, now next 3 positions become 0.
  4.   Take Value from the 8 value position and move forward to the 4 position and to the 2 value position, 2-1 = 1
  5.   1-1 = 0
  6.   1-1 = 0
  7.    After moving the value forward from the 7th digit position on the top line, it is now 0.  So move 2 from the next position. 2-1 = 1

You can try it out yourself, starting with smaller binary values and progressively with bigger ones.

For your information, there is no Multiplication or Division in computers.  These calculations are achieved by successive addition or successive subtraction of values.




Subscribe in a reader
Your email address:

Delivered by FeedBurner


Popular Posts

Blog Archive

Powered by Blogger.

Follow by Email


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