升级R至4.4.2后,如何用Excel VBA从注册表提取R InstallPath
解决32位Excel读取R 4.4.2注册表路径为空的问题
核心原因
你使用的是32位Excel,在64位系统中,32位程序访问HKEY_LOCAL_MACHINE\SOFTWARE会被系统自动重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node分支。而R 4.4.2默认安装为64位时,其注册表项是写在**64位专属的HKEY_LOCAL_MACHINE\SOFTWARE\R-core\R**下的,32位Excel用原代码的WScript.Shell读不到这个分支。
解决思路及代码修改
替换原有的注册表读取逻辑,改用WMI的StdRegProv类,明确指定访问64位注册表分支:
' 获取R安装路径 Function GetR_HOME() As String GetR_HOME = GetRegistryValue64(HKEY_LOCAL_MACHINE, "SOFTWARE\R-core\R", "InstallPath") End Function ' 读取64位注册表项的函数 Function GetRegistryValue64(ByVal hKey As Long, ByVal keyPath As String, ByVal valueName As String) As String Dim objReg As Object Dim result As Variant Const HKEY_LOCAL_MACHINE = &H80000002 Const KEY_READ = &H20019 Const KEY_WOW64_64KEY = &H100 Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") ' 以64位模式读取注册表 objReg.GetStringValue hKey, keyPath, valueName, result If Not IsEmpty(result) Then GetRegistryValue64 = result Else ' 兜底尝试读取32位分支(适配32位R的情况) objReg.GetStringValue hKey, "SOFTWARE\Wow6432Node\R-core\R", valueName, result GetRegistryValue64 = IIf(Not IsEmpty(result), result, "") End If End Function
额外排查点
- 确认R安装时勾选了**“Save version number in registry”**选项,如果没勾,注册表不会生成对应项;
- 检查Excel是否以管理员权限运行,部分注册表项需要权限才能读取;
- 若你安装的是32位R,可直接修改原代码的路径为
"SOFTWARE\Wow6432Node\R-core\R"来读取。
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

