2012-01-02 194 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 
相關問題