2012-01-02 192 views
9

如何确定包含使用VBA的32位程序的文件夹的完整路径?它在32位Windows系统上称为“程序文件”,但在64位系统上称为“Program Files(x86)”。获取包含32位程序的“程序文件”文件夹的路径

+0

您切换32和64位 – rene 2012-01-02 14:31:27

+0

在特定的操作系统上? – rene 2012-01-02 14:33:26

+3

@rene:这取决于他的意思。在32位的Win XP上,只有一个“Program Files”文件夹。 “程序文件(x86)”通常只在64位窗口下可用。 – 2012-01-02 14:40:11

回答

14

ENVIRON将这样的伎俩:

debug.print Environ("ProgramFiles") 
debug.print Environ("PROGRAMFILES(X86)") 

'If you want to check if current PC is x64 
debug.print Environ("PROCESSOR_IDENTIFIER") 

环境变量列表可以发现here


UPDATE:基于谈话我已经受够了基督教,并根据我的意见,我看着这个多一点。

我有我上测试了两种机器:

  • 机1:Win 7的极限,64位,Office 2010的64位
  • 机2:Win 7的极限,32位,办公2007年32位

我跑在即时窗口下面的语句:

? Environ("ProgramFiles") 
? Environ("PROGRAMFILES(X86)") 
? Environ("ProgramW6432") 

结果

机1:

C:\Program Files 
C:\Program Files (x86) 
C:\Program Files 

机2:

C:\Program Files 
//Blank// 
//Blank// 

因此,基于这些有限的研究结果,您可能希望看到的,如果ProgramW6432有一个值。如果不是,则假定32位并使用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 

相反,您可以使用PROCESSOR_IDENTIFIER来确定x64与x86并执行相同的操作。

我不会说任何一种方法都是万无一失的,但应该让你走上正轨。

+0

伟大的解决方案;快速的问题,如果我们在32位机器上运行,会发生什么,Environ(“PROGRAMFILES(X86)”)只是返回空白?对不起,我没有一个人。 – James 2012-01-02 15:30:26

+0

我还没有一个方便,但environ(“HELLO_WORLD”)返回一个空字符串,所以我会想象你会得到相同的结果,如果该变量只用于64位机器。虚拟PC(和其他操作系统模拟器)是免费的。如果你有一个x86操作系统躺着,把灰尘吹掉,在虚拟环境中安装,看看会发生什么。 :) – ray 2012-01-02 17:33:24

+1

另外,我刚刚看到Christian的回答,我应该注意到,在我的机器上,我得到了var“ProgramFiles”与“PROGRAMFILES(X86)”的不同文件夹。您可能最好使用他的建议获取x64文件夹;并且在这里推测,如果“PROGRAMFILES(X86)”和“ProgramW6432”都返回空白值,那么“ProgramFiles”将适用。 – ray 2012-01-02 17:36:44

6

ray023's answer基本上是正确的,但一个加法:

至少在我的机器上(Win 7的家庭高级版64位,Access 2000中安装),都
Environ("ProgramFiles")
Environ("PROGRAMFILES(X86)")

...返回相同的文件夹,C:\Program Files (x86)

要在我的64位Windows上获得“非x86文件夹”(C:\Program Files),我需要使用Environ("ProgramW6432")

Here's another link关于Environ函数,包括代码如何列出所有环境变量(这就是我如何找到ProgramW6432)。


编辑:

正如我已经评论说,我只是测试它在我的另一台机器上的结果似乎不仅依赖于操作系统,但在安装微软Office版本还有:

本机运行在Win XP SP3 32位,和Access 2000安装:

Environ("ProgramFiles")回报C:\Programme
(这是“程序文件”的德文 - 我在德国和我的Windows是德语)

Environ("PROGRAMFILES(X86)")Environ("ProgramW6432")返回一个空字符串。

- >因此,确定“x86文件夹”(无论是在Win XP还是Win 7上)最安全的方式似乎是Environ("ProgramFiles")

+0

我无法证实这一点;我得到了预期的结果?我使用的是64位版本的办公软件,我可以确认您是否正确,因为我怀疑您不是?尽管感谢帮助。 – James 2012-01-02 16:37:33

+0

不,我使用的是32位版本(Access 2000,具体 - 这是安装在此机器上的MS Office的唯一部分)。 – 2012-01-02 16:48:44

+0

@ChristianSpecht这是有趣的B/C我有64位的单词,我使用ProgramFiles与PROGRAMFILES(X86)获得不同的文件夹。我不知道这个命令在使用时是否起作用;而不是我想花时间去测试它,但可能是詹姆斯的一些事情。 :P – ray 2012-01-02 17:44:15

5

我想我会总结这次讨论的结论。

Environ对于任何给定“程序文件”相关的环境变量将取决于视窗(32或64位),以及办公室(32或64位)而变化如下输出:

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 

请注意,对于Windows 64位+ Office 32位设置,Environ("ProgramFiles")的输出确实是而不是与Windows中的ProgramFiles环境变量的实际值匹配!在命令提示符处,echo %ProgramFiles%返回C:\Program Files,而不是C:\Program Files (x86)

如果需要(64位Windows C:\Program Files 32位Windows和C:\Program Files (x86))的路径,32位程序文件的文件夹,那么你可以使用这个功能:

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 
相关问题