Get path of "Program files" folder that contains 32-bit programs
One-stop shop
I thought I'd summarize the conclusions that can be drawn from the information scattered across all answers here, plus a bit of integration on my part. Credits to all previous answer posters!
The output of Environ
for any given "program file"-related environment variable will vary depending on Windows (32 or 64 bit) as well as Office (32 or 64 bit) as follows:
Windows Office ProgramFiles PROGRAMFILES(X86) ProgramW6432
------- ------ ---------------------- --------------------- ----------------
32-bit 32-bit C:\Program Files [empty string] [empty string]
64-bit 32-bit C:\Program Files (x86) C:\Program Files (x86) C:\Program Files
64-bit 64-bit C:\Program Files C:\Program Files (x86) C:\Program Files
Note that for the Windows 64 bit + Office 32 bit setup, the output of Environ("ProgramFiles")
does not match with the actual value of the ProgramFiles
environment variable in Windows! At the command prompt, echo %ProgramFiles%
returns C:\Program Files
, not C:\Program Files (x86)
.
If you need the path to the 32 bit program files folder (C:\Program Files
for 32-bit Windows, and C:\Program Files (x86)
for 64-bit Windows) then you can use this function:
Function Get32BitProgramFilesPath() As String
If Environ("ProgramW6432") = "" Then
'32 bit Windows
Get32BitProgramFilesPath = Environ("ProgramFiles")
Else
'64 bit Windows
Get32BitProgramFilesPath = Environ("ProgramFiles(x86)")
End If
End Function
Environ will do the trick:
debug.print Environ("ProgramFiles")
debug.print Environ("PROGRAMFILES(X86)")
'If you want to check if current PC is x64
debug.print Environ("PROCESSOR_IDENTIFIER")
List of environment variables can be found here.
UPDATE: Based on the conversation I've had with Christian and based on my comments, I looked into this a little more.
I have two machines I tested on:
- Machine 1: Win 7 Ultimate, 64 Bit, Office 2010 64 Bit
- Machine 2: Win 7 Ultimate, 32 Bit, Office 2007 32 Bit
I ran the following statements in the immediate window:
? Environ("ProgramFiles")
? Environ("PROGRAMFILES(X86)")
? Environ("ProgramW6432")
Results
Machine 1:
C:\Program Files
C:\Program Files (x86)
C:\Program Files
Machine 2:
C:\Program Files
//Blank//
//Blank//
So, based on these limited findings, you may want to see the if ProgramW6432 has a value. If not, assume 32 bit and use ProgramFiles.
IF Environ("ProgramW6432") <> "" THEN
'I'm 64 bit so check both ProgramW6432 and PROGRAMFILES(X86)
ELSE
'I'm 32 bit so check ProgramFiles
END IF
Conversely, you could use PROCESSOR_IDENTIFIER to determine x64 vs. x86 and do the same thing.
I wouldn't say either way is foolproof but should get you on the right track.