MS Office – Executable File Versions

It can sometimes be necessary to determine the version of the program you are working with in VBA and I have been unable to find a comprehensive listing.  Microsoft themselves have scattered this information over numerous pages?!  Here is what I have compiled myself thus far (Office 2000 through Office 2010 SP1).


Application Name Executable File 2000 2000 SP1 2000 SP2 2000 SP3 2002 2002 SP1 2002 SP2 2002 SP3 2003 2003 SP1 2003 SP2 2003 SP3 2007 2007 SP1 2007 SP2 2007 SP3 2010 2010 SP1
Microsoft Office mso.dll         10.0.2627.01 10.0.3520.0 10.0.4330.0 10.0.6626.0 11.0.5614.0 11.0.6361.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6213.1000 12.0.6425.1000   14.0.4760.1000 14.0.6023.1000
Microsoft Access  msaccess.exe 9.0.2720 9.0.3821 9.0.4402 9.0.6926  10.0.2627.1 10.0.3409.0 10.0.4302.0 10.0.6501.0 11.0.5614.0 11.0.6361.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6423.1000 12.0.6606.1000 14.0.4750.1000 14.0.6024.1000
Microsoft Binder       9.0.2702 9.0.2702                            
Microsoft Excel excel.exe 9.0.2720 9.0.3821 9.0.4402  9.0.6926 10.0.2614.0 10.0.3506.0 10.0.4302.0 10.0.6501.0 11.0.5612.0 11.0.6355.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6214.1000 12.0.6425.1000 12.0.6611.1000 14.0.4756.1000 14.0.6024.1000
Microsoft FrontPage frontpg.exe 10.0.2623.0 10.0.3402.0 10.0.4128.0 10.0.6308.0 11.0.5516.0 11.0.6356.0 11.0.7969.0 11.0.8173.0            
Microsoft Groove groove.exe                         12.0.4518.1014 12.0.6211.1000 12.0.6421.1000 12.0.6600.1000 14.0.4761.1000 14.1.6009.1000
Microsoft InfoPath infopath.exe                 11.0.5531.0 11.0.6357.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6214.1000 12.0.6413.1000 12.0.6606.1000 14.0.4763.1000 14.0.6009.1000
Microsoft OneNote onenote.exe                 11.0.5614.0 11.0.6360.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6415.1000 12.0.6606.1000 14.0.4763.1000 14.0.6022.1000
Microsoft Outlook outlook.exe/outlib.dll 10.0.2627.1 10.0.3416.0 10.0.4024.0 10.0.6626.0 11.0.5510.0 11.0.6353.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6212.1000 12.0.6423.1000 12.0.6607.1000 14.0.4760.1000 14.0.6025.1000
Microsoft PowerPoint powerpnt.exe 9.0.2716 9.0.3821 9.0.6620 10.0.2623.0 10.0.3506.0 10.0.4205.0 10.0.6501.0 11.0.5529.0 11.0.6361.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6425.1000 12.0.6600.1000 14.0.4754.1000 14.0.6026.1000
Microsoft Project winproj.exe         10.0.2915.0 10.0.8326.0     11.0.5614.0 11.0.6707.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6423.1000   14.0.4751.1000 14.0.6023.1000
Microsoft Publisher mspub.exe         10.0.2621.0 10.0.3402.0 10.0.4016.0 10.0.6308.0 11.0.5525.0 11.0.6255.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6423.1000 12.0.6606.1000 14.0.4750.1000 14.0.6026.1000
Microsoft SharePoint Designer spdesign.exe                         12.0.4518.1014 12.0.6211.1000 12.0.6423.1000   14.0.4750.1000  
Microsoft Visio vision.exe/vislib.dll         10.0.525 10.1.2514 10.2.5110   11.0.3216.5614 11.0.4301.6360 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6423.1000   14.0.4756.1000 14.0.6022.1000
Microsoft Word winword.exe 9.0.2720 9.0.3821 9.0.4402  9.0.6926 10.0.2627.0 10.0.3416.0 10.0.4219.0 10.0.6612.0 11.0.5604.0 11.0.6359.0 11.0.7969.0 11.0.8173.0 12.0.4518.1014 12.0.6211.1000 12.0.6425.1000 12.0.6612.1000 14.0.4762.1000 14.0.6024.1000

You can also download a copy in csv format so you can import it into the program of your choice by clicking here.

Also, note that some of this information is impossible to find on any official website (but then again, why would I be writing such a post if it were!) so there could be mistakes.  This is based on what I could find online and what I managed to piece together by looking over various computers.  If you find mistakes, please use the contact form to send me an e-mail and I will make the necessary corrections promptly.

Here are a few of my references that I used to compile this list:
Office 2000
Office 2002 (Office XP)
Office 2003
Office 2007
General info on how to retrieve the Executable’s build number

Virtual PC on Multiple Monitors

Ok, I finally decided to write my own post on the subject of how to configure Windows Virtual PC, and/or Windows XP Mode, to run in multiple monitors.  Why another article.  Simple, I searched high and low and managed to find bits and pieces, but no one seemed to give all the information, and certainly not clearly.  I thought I’d share a simple, visual, step by step illustration of what I did to make it work for me.

As I have found out, it can be done, and it isn’t very hard to accomplish, but it does come at a little cost.  Why Microsoft does not have a span multiple monitors setting directly in the Virtual Machine Settings beats me and based on the number of posts, why they still have not come out with an update or new version, bloes my mind.  Regardless, we have a round about way to make it happen, and here is how to implement it.

The process involves using Remote Desktop to connect to our Virtual PC/Virtual Machine.  Since Virtual PC/Virtual Machine does not allow multiple monitors we will benefit from Remote Desktop’s ability to do so instead.


  1. Before being able to use the remote desktop, we first need to configure our Virtual Machine to allow a Remote Desktop Connection.  Go to your Virtual Machines folder, select the Virtual Machine that you wish to configure to work using multiple monitors and click on the Settings button in the nav bar
    Virtual Machines Folder View
  2. Select the Networking heading and then ensure that your network adapter is one of your computer’s physical network adapter and not ‘Shared Networking (NAT)’ (for instance).  By doing so, when your Virtual Machine is launched it will take an IP address, thus allowing us to make a Remote Desktop connection.
    Virtual Machines Networking Settings
  3. Select the Logon Credentials heading and click on the Delete Saved Credentials (first ensure you have this information somewhere username and password otherwise you will not be able to log back into your Virtual Machine).An alternative to this is to leave the logon credential as is, and open your vitrual machine normally and then log out of it immediately.
    Virtual Machines Logon Credentials Settings
  4. Start Windows Run Command
    Windows 7 Run Command
  5. Start Remote Desktop by issuing the mstsc.exe /span command
    Windows 7 Run Command to Launch Remote Destop Spanning Multiple Monitors
  6. On the General Tab -> Logon Settings, enter the computer name of your Virtual Machine in the Computer control and then your Virtual Machines’ logon username in the User name control.  Notice how I also include the computer name in the User name control to enure that the proper domain is used for authentication.
    Remote Deskptop Logon Settings
  7. On the General Tab -> Display Configuration, ensure the Use all my monitors for the remote session checkbox is checked.
    Remote Deskptop Display Configuration Settings

Finally, click Connect.


A few things to keep in mind for this to work

  1. Your monitors must be configured to all be using the same resolution! Furthermore, I have read that the combined resolution of all your monitors must not exceed 4096 x 2048 pixels.
  2. You must set your Windows Firewall to allow Remote Desktop Connections as an exception (by default it is not allowed)
  3. You must be actively connected to your network for the Virtual Machine to take an IP address to be able to connect to with Remote Desktop.  There is a mean to not be required to be connected to a network by using the ‘Microsoft Loopback adapter’.  I will investigate this in the near future and post back with the results.
  4. This may not need to be explicitly stated, but your Virtual Machine needs to be running when you initiate the Remote Desktop session.


Drawbacks to this method

Beside having to take these extra steps to accomplish what I deem should have been a normal feature to include in Microsoft’s Virtual PC, this solution does present 3 distinct drawbacks:

  1. You have to have to be connected to a network.  This isn’t too big a deal since I doubt your travel with a second monitor!  As such, you will typically be using this technique in office, so you should have network access.
  2. Your monitors have to have the exact same resolution.
  3. The computer will consider the 2 monitors, 1 giant monitor.  So this means, windows snapping will no longer work and maximizing an application will make it span both monitors.  So you will manually have to resize your applications within your screen.


Alternative Solutions

So what other solutions are available, instead of jumping through all these steps… to enable a make shift dual monitor functionality with Virtual Machines.  Well, the solution is to switch Virtualization Software.  For Instamce, VMWare supports multiple monitors at the click of a button ‘Cycle multiple monitors’.  If you need true multi-monitor support, perhaps you need to look beyond what Microsoft is currently offering and hopefully they will update the application to support it natively in the future (One can hope!).


I hope this article saves you some of the time and frustrations I had trying to get this to work!


Below are a few links that helped me figure everything out, along with a few helpful posts in the Virtual PC forum:
Using Virtual PC with Multiple Monitors, Sort Of
Virtual PC on two monitors without additional software
VPC 2007 Dual Monitor support


Windows 7 Home Edition Connection to UNIX Server

The following article discusses editing your computer’s registry. Such action may lead to serious issue with your computer if not done properly. This website and it’s contributor’s assumes none responsibility for any of the information provided. Follow these steps at your own risk!

I was recently helping a colleague who had hit a wall with regards to configuring a client’s new computer which was running Windows 7 Home Edition with their Unix file server and database server (heart of their business).

Now, if you perform a search online, you will find numerous articles which explain that you can in fact connect Windows 7 to a UNIX server, but you have to ‘dumb it down a little’. To do so, you need to make 2 modifications to your Security Policies.

Go to Control Panel -> Administrative Tools -> Local Security Policy (Or Run secpol.msc)
Local Policies – Security Options

Locate the Network security: LAN Manager authentication level Policy
Change the Local Security Setting to Send LM & NTLM responses

Locate the Minimum session security for NTLM SSP Policy
Uncheck the Local Security Setting Require 128-bit encryption property

The problem is the fact that this may work if you are running Windows 8 Professional or Ultimate, but on Windows 7 Home Edition, the Local Security Policy Management Console is not available. So what is one to do?

Well, you can get around this problem, but you must edit 2 registry keys!

Navigate to the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa Key and then create a new DWord Key

ValueName: LmCompatibilityLevel
ValueData: 1
Base: Hexadecimal

Navigate to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\LSA\MSV1_0 registry key and edit the NtlmMinClientSec Key and change it to 0

Finally, reboot your computer. You should now be able to access your UNIX server files without the never ending login prompt…

MS Excel – VBA – Print 1 Page Wide

Have you ever wanted to setup your spreadsheet to print 1 page wide? It sounds like such a simple thing to do, and yet at first glance it appears not to be so easy in Excel’s VBA.

Now if you record a macro, or do some searching online, you’ll find that the method for setting up such settings using code, such as:

With ActiveSheet.PageSetup
    .FitToPagesWide = 1
    .FitToPagesTall = 5
End With

The problem being that you need to specify how many pages tall the document will be. Now I came across numerous post where people try to determine insert page breaks based on number of rows, or insert page breaks based on the height of rows, or I also came across posting stating to set the .FitToPagesTall to a extremely large number and Excel will automatically fit is properly.

Now, yes, these solutions will work, some requiring a lot more work than others, but as I found out, there is no need for such conveluted methods. One can merely set the .FotToPagesTall to False and Excel will resize according to fit the content by whatever value you specified in the .FitToPagesWide. So the finally code would merely be:

With ActiveSheet.PageSetup
    .FitToPagesWide = 1
    .FitToPagesTall = False 'Will take as many pages as required based on other settings
End With

Inversly, you could specify the .FitToPagesWide and set the value of .FitToPagesTall to False and Excel will resize accordingly.

One more simple technique in your bag of tricks!

MS Access – VBA – Select the Treeview Root Node

When using the a Treeview control and an expand control the Treeview sets’ the focus at the end/bottom node. So how can you return the focus, in this case ‘select’ the root node? To do so you merely need to use the following bit of code.

Me!TreeviewControlName.Nodes(1).Selected = True

That said, selecting Nodes(1) may not always yield the desireed result. The reason being that if sorting is accomplished after nodes are added the Nodes(1) may no longer be positioned at the top. So what do we do now? There is a solution, but I’m not going to reinvent the wheel on this one. UtterAccess has a sample database with a procedure named GotoFirstNode() that works around the above mentioned little problem. The sample database in question can be found at Treeview Sample With Drag And Drop. It also, covers many other functionalities and is greatly worth checking out.

MS Access – VBA – Determine a Control’s Associated Label

It can become necessary to need to determine the associated label to a given control. It actually is, yet again, very simple to do. Not what I’d call intuitive, but easy once you are aware of the proper synthax to use.

To reference a control’s associated label you use the following synthax




So let’s say we wanted to determine a control’s associated label’s caption, we do something along the lines of:


One note of caution however, you need to ensure you implement error handling to trap possible errors (Error number: 2467 – The expression you entered refers to an object that is closed or doesn’t exist) that may arise with control’s that do not have associated labels.

MS Access – VBA – Run Parameter Query in VBA

Once one delves into the wonderful world of MS Access & VBA programming, you quickly gets faced with the problem of executing queries and SQL statements from within VBA. No in general, this does not pose much of an issue and there are any number of great tutorials that cover the various way to handle this. For instance, Database Journal has a great article by Danny Lesandrini entitled Executing SQL Statements in VBA Code which covers all the methods available to a developer and explains the pros and cons of each.

That said, all of these articles cover but the basic idea of a simple SQL Statement. What happens if you want to execute a parameter query? How do you approach that. In fact, this isn’t to big an issue either, once you are shown how to handle it.

Firstly, let us very briefly cover the subject of a Parameter. What is a parameter? In a query, we can specify a criteria. In most instances, the criteria will be a static value. That said, it become necessary in many instances to make these criteria dynamic, and to do this there are different methods, but one common approach is to refer to a control on a form, thus allowing the end-user the ability to specify the criteria to apply to the query. This is what I am referring to in this post.

The problem arises that if you merely try to execute a query with a criteria to a form control, it will result in an error “Too Few Parameters”. The work around is that we much first make the database evaluates each parameter before running the query, to do so, we use the following code

    Dim db              As DAO.Database
    Dim qdf             As DAO.QueryDef
    Dim prm             As DAO.Parameter
    Dim rs              As DAO.Recordset
    Set db = CurrentDb
    Set qdf = db.QueryDefs("YourQueryName")
    For Each prm In qdf.Parameters
        prm = Eval(prm.Name)
    Next prm
    Set rs = qdf.OpenRecordset
    'Work with the recordset

    rs.Close 'Close the recordset
    'Cleanup after ourselves
    Set db = Nothing
    Set qdf = Nothing

So how does it work exactly? Well, we start off by specifying which query we are working with by setting the value of the qdf variable. Next, we llop through the parameters and evaluate each one. Finally, we execute the query. So simple, once you are shown the proper tachnique!

You may wish to look over the sample database found at Roger’s Access Library entitled Too few Parameters.

CodeIgniter 1.7 Professional Development – Review

I have done a considerable amount of web development over the years ranging from HTML to MySQL/PHP driven web applications utilizing the power of such things as javascript, AJAX, jQuery and many more…

I finally decided that it was about time for me to get serious and look into a FrameWork to better standardize my work. As such, I purchased a couple books on the matter, one of which was CodeIgniter 1.7 Professional Development by Adam Griffiths (272 pages) and published by PACKT Publishing.

All I can say is in comparison with the ZEND Framework in Action book, this was a real treat! It was easy to read and they started out with the very basics; Installing CodeIgniter!

The book is written in a manner that I found very fluid and the chapters just seems to flow one into the other.

I think this book is a great purchase for any new CodeIgniter developer looking to learn the basic quickly and easily. At +/-300 pages it isn’t too heavy to be intimidating, but does cover a lot of material in a manner you will understand.

I don’t regret this purchase in the least.