英文:
How can I determine if a user's PC is running Windows 10 or Windows 11 for Excel functions?
问题
我有一个由几个其他用户使用的Excel工作簿。我发现一些功能在不同的Windows操作系统上运行方式不同。我的工作簿需要根据不同的Windows系统做出反应。
过去,
b = oWsh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
会告诉我版本,即"Windows 10企业版"。实际上有点奇怪,因为当我查看注册表时,它显示"Windows 10专业版"……"企业版"从哪里来?
无论如何,当我在Win 11上运行相同的命令时,它仍然显示"Windows 10专业版"。
我如何知道其他人的PC上的操作系统是Win 10还是Win 11?
如详细信息中所述。
英文:
I have an Excel workbook used by several other users. I've discovered that a few of the functions work differently on different windows OS. My workbook needs to react to the different windows.
In the past,
b = oWsh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")"^
would tell me the version, ie "Windows 10 Enterprise". Actually it's a little weird because when I look in the registry it says "Windows 10 Pro"...where does the "Enterprise" come from?
Anyway, when I run the same command on Win 11, it still says "Windows 10 Pro".
How can I find out if the OS on someone else's PC is Win 10 or Win 11?
As described in the details.
答案1
得分: 3
你可以通过使用WMI了解很多信息。它相当神秘,而在VBA中执行它也不会变得更简单。
Function IsWindows11() As Boolean
Dim WMIService As Object
Dim OsInfo As Object
Dim Entry As Object
Set WMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OsInfo = WMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each Entry In OsInfo
If InStr(Entry.Name, "Microsoft Windows 11") > 0 Then
IsWindows11 = True
Exit Function
End If
Next
IsWindows11 = False
End Function
如果你想了解为什么这段代码有效,可以学习一下WMI。你也可以在Powershell中使用类似以下命令来执行类似的操作:
Get-ComputerInfo | select OsName
但然后你需要调用它并获取答案。
英文:
You can find out a lot by using WMI. It is quite cryptic and doing in VBA doesn't make it less so.
Function IsWindows11() As Boolean
Dim WMIService As Object
Dim OsInfo As Object
Dim Entry As Object
Set WMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OsInfo = WMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each Entry In OsInfo
If InStr(Entry.Name, "Microsoft Windows 11") > 0 Then
IsWindows11 = True
Exit Function
End If
Next
IsWindows11 = False
End Function
If you want to understand why this works, read up on WMI. You can do similar things in Powershell with a command like this
Get-ComputerInfo | select OsName
but then you'll have to call that and pick up the answer.
答案2
得分: 1
以下是来自链接的代码部分的翻译:
作者发布的代码
' 用于确定 Windows 版本号的函数
Option Compare Database
Option Explicit
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Public Function getVersion() As String
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
getVersion = "版本是 " & osinfo.dwMajorVersion & "." & osinfo.dwMinorVersion
End Function
回复中的代码
'---------------------------------------------------------------------------------------
' 过程:getOperatingSystem
' 作者:Daniel Pineault, CARDA Consultants Inc.
' 网站:http://www.cardaconsultants.com
' 目的:返回活动操作系统的详细信息
' 版权:只要版权声明保持不变(包括作者、网站和
'
' 修订历史:
' Rev Date(yyyy/mm/dd) Description
' **************************************************************************************
' 1 2012-Sep-27 初始发布
'---------------------------------------------------------------------------------------
Public Function getOperatingSystem()
Dim localHost As String
Dim objWMIService As Variant
Dim colOperatingSystems As Variant
Dim objOperatingSystem As Variant
On Error GoTo Error_Handler
localHost = "." ' 技术上可以针对允许的情况远程运行
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & localHost & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem In colOperatingSystems
getOperatingSystem = objOperatingSystem.Caption & " " & objOperatingSystem.Version
Exit Function
Next
Error_Handler_Exit:
On Error Resume Next
Exit Function
Error_Handler:
MsgBox "发生了以下错误。" & vbCrLf & vbCrLf & _
"错误编号:" & Err.Number & vbCrLf & _
"错误来源:getOperatingSystem" & vbCrLf & _
"错误描述:" & Err.Description, _
vbCritical, "发生错误!"
Resume Error_Handler_Exit
End Function
希望这对你有帮助。
英文:
The OP stated here, that the link, VBA to find Windows Version, posted in a comment by Siddharth Rout, answered the question. Following is the code from that link.
Code from post author
'FUNCTION TO DETERMINE WINDOWS VERSION NUMBER
Option Compare Database
Option Explicit
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Public Function getVersion() As String
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
getVersion = "Version is " & osinfo.dwMajorVersion & "." & osinfo.dwMinorVersion
End Function
Code in a reply
'---------------------------------------------------------------------------------------
' Procedure : getOperatingSystem
' Author : Daniel Pineault, CARDA Consultants Inc.
' Website : http://www.cardaconsultants.com
' Purpose : Return the active OS details
' Copyright : The following may be altered and reused as you wish so long as the
' copyright notice is left unchanged (including Author, Website and
'
' Revision History:
' Rev Date(yyyy/mm/dd) Description
' **************************************************************************************
' 1 2012-Sep-27 Initial Release
'---------------------------------------------------------------------------------------
Public Function getOperatingSystem()
Dim localHost As String
Dim objWMIService As Variant
Dim colOperatingSystems As Variant
Dim objOperatingSystem As Variant
On Error GoTo Error_Handler
localHost = "." 'Technically could be run against remote computers, if allowed
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & localHost & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem In colOperatingSystems
getOperatingSystem = objOperatingSystem.Caption & " " & objOperatingSystem.Version
Exit Function
Next
Error_Handler_Exit:
On Error Resume Next
Exit Function
Error_Handler:
MsgBox "The following error has occured." & vbCrLf & vbCrLf & _
"Error Number: " & Err.Number & vbCrLf & _
"Error Source: getOperatingSystem" & vbCrLf & _
"Error Description: " & Err.Description, _
vbCritical, "An Error has Occured!"
Resume Error_Handler_Exit
End Function
答案3
得分: 0
Debug.Print Application.OperatingSystem
(但正如@Sam所说,它不起作用。我今天在Win 11的工作中检查了一下,结果是NT 10)
英文:
Debug.Print Application.OperatingSystem
(but as @Sam says it does't work. I checked it today 29-05-23 in job with Win 11 and the result was NT 10)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论