Get path of "Program files" folder that contains 32-bit programs
Environ will do the trick:
debug.print Environ("ProgramFiles") debug.print Environ("PROGRAMFILES(X86)")'If you want to check if current PC is x64debug.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 ProgramFilesEND 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.
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 IfEnd Function
ray023's answer is basically correct, but one addition:
At least on my machine (Win 7 Home Premium 64 bit, Access 2000 installed), bothEnviron("ProgramFiles")
andEnviron("PROGRAMFILES(X86)")
...return the same folder, C:\Program Files (x86)
.
To get the "non-x86-folder" (C:\Program Files
) on my 64 bit Windows, I need to use Environ("ProgramW6432")
.
Here's another link about the Environ
function, including code how to list all environment variables (that's how I found ProgramW6432
).
EDIT:
As I already said in a comment, I just tested it on my other machine as the results seem to depend not only on the operating system, but on the installed MS Office version as well:
This machine runs on Win XP SP3 32-bit, and Access 2000 is installed:
Environ("ProgramFiles")
returns C:\Programme
.
(that's "Program Files" in German - I'm in Germany and my Windows is in German)
Environ("PROGRAMFILES(X86)")
and Environ("ProgramW6432")
return an empty string.
--> So the safest way to determine the "x86 folder" (no matter if on Win XP or Win 7) seems to be Environ("ProgramFiles")
.