如何通过MS-Access VBA获取Office 365完整构建版本号
VBA获取Office 365完整显示版本实现方案
你之前通过Application.Version/Application.Build属性、读取MSAccess.exe文件属性、读取HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration下CurrentVersionToReport值拿到的都是截断后的短版本号,这些值是为了兼容旧版Office逻辑保留的标识,和「文件|账户」界面展示的完整版本数据源不一致。
以下两个方案均可拿到准确的版本信息,可直接在Access VBA环境运行,兼容32/64位Office、32/64位Windows系统。
方案1:直接读取注册表显示版本值(与界面文本完全一致,优先推荐)
即点即用版Office的界面展示版本字符串,直接存储在注册表ClickToRun\ProductReleaseInfo项的DisplayVersion值中,读取该值不需要做版本映射、字符串拼接,拿到的内容和用户在界面看到的文本完全一致,适合直接展示在主窗体用于故障排查。
注意32位Office安装在64位Windows系统时,注册表会自动重定向到Wow6432Node节点,代码中已做适配。
完整可运行代码:
#If VBA7 Then Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongPtr, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As LongPtr) As Long Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As LongPtr, ByVal lpValueName As String, ByVal lpReserved As LongPtr, lpType As Long, lpData As Any, lpcbData As Long) As Long Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As LongPtr) As Long #Else Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long #End If Const HKEY_LOCAL_MACHINE = &H80000002 Const KEY_READ = &H20019 Const KEY_WOW64_32KEY = &H200 Const REG_SZ = 1 Function GetFullOfficeDisplayVersion() As String Dim hKey As LongPtr Dim res As Long Dim valueType As Long Dim valueLen As Long Dim displayVersion As String ' 优先读取64位注册表路径 res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Office\ClickToRun\ProductReleaseInfo", 0, KEY_READ, hKey) ' 读取失败则尝试32位重定向路径(适配32位Office装在64位系统场景) If res <> 0 Then res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Office\ClickToRun\ProductReleaseInfo", 0, KEY_READ Or KEY_WOW64_32KEY, hKey) End If ' 非即点即用版本(MSI安装版)走兼容读取逻辑 If res <> 0 Then GetFullOfficeDisplayVersion = Application.Version & "." & Application.Build & " (MSI安装版)" Exit Function End If ' 读取DisplayVersion值 valueLen = 255 displayVersion = String(valueLen, 0) res = RegQueryValueEx(hKey, "DisplayVersion", 0, valueType, ByVal displayVersion, valueLen) RegCloseKey hKey If res = 0 And valueType = REG_SZ Then GetFullOfficeDisplayVersion = Left(displayVersion, valueLen - 1) Else GetFullOfficeDisplayVersion = "版本读取失败" End If End Function
调用方法:直接在VBA中或窗体控件数据源中调用GetFullOfficeDisplayVersion()即可,返回示例如Microsoft® Access® for Microsoft 365 MSO (版本 2205 Build 16.0.15225.20288) 64位,和界面展示内容完全匹配。
方案2:读取mso.dll文件版本(无注册表操作,适合做版本判断)
即点即用版Office的MSAccess.exe是启动器壳程序,文件属性里只存短版本号,完整的构建版本信息存储在核心库mso.dll中,读取该文件的版本号可以拿到纯数字格式的完整四位构建号,适合做版本范围判断(比如识别受ODBC故障影响的2205版本)。
代码如下:
Function GetFullOfficeBuildNumber() As String Dim msoPath As String Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' 优先读取64位公共目录下的mso.dll msoPath = Environ("CommonProgramFiles") & "\Microsoft Shared\Office16\mso.dll" If Not fso.FileExists(msoPath) Then ' 尝试32位公共目录路径 msoPath = Environ("CommonProgramFiles(x86)") & "\Microsoft Shared\Office16\mso.dll" End If If fso.FileExists(msoPath) Then GetFullOfficeBuildNumber = fso.GetFileVersion(msoPath) Else ' 兼容MSI安装版 GetFullOfficeBuildNumber = Application.Version & "." & Application.Build End If End Function
返回示例如16.0.15225.20288,可以直接通过判断构建号前缀确认是否在故障版本范围内。
使用建议
- 面向用户展示版本信息排查故障时用方案1,返回内容和用户手动查看的路径完全一致,降低沟通成本。
- 需要做自动版本校验、故障版本拦截逻辑时用方案2,纯数字格式方便做大小比较。
内容的提问来源于stack exchange,提问作者dbmitch
相关产品推荐
相关产品推荐

