Страницы: 1
RSS
Програмно определить тип операционной системы, VBA (Application.OperatingSystem)
 
Доброго дня всем!
Помогите, плз, "снять лыжи", а то туплю неимоверно...
Это:
Код
Sub test()
MsgBox Application.OperatingSystem
End Sub
выдает мне "Windows (32-bit)"
Но просмотр основных сведений о системе пишет: "64-разрядная операционная система".
КАК?! O_O
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
А если так?
Код
Sub test()
    #If Win64 Then
        MsgBox "Кажется 64-bit", vbInformation, ""
    #Else
        MsgBox "НЕ 64-bit", vbInformation, ""
    #End If
End Sub
 
читаем переменную окружения ProgramFiles(x86) если оно есть то 64 если нет 32
или через WMI
select OSArchitecture from Win32_OperatingSystem

New,  это приложение а вопрос про ОС. хотя кто его знает...

собственно и Application.OperatingSystem - выдает 32 так как, вангую, офис 32
Изменено: БМВ - 08.12.2021 16:00:33
По вопросам из тем форума, личку не читаю.
 
Цитата
New написал:
А если так?
неа...
Изменено: Ёк-Мок - 08.12.2021 17:07:48
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
А так?
Код
Sub CheckWin()
    If Not Environ("ProgramFiles(x86)") = "" Then
        MsgBox "Running on 64-bit Windows"
    Else
        MsgBox "Running on 32-bit Windows"
    End If
End Sub
Изменено: New - 08.12.2021 16:16:14
 
New Здравствуйте А как понять решетки в сообщении 2? Первый раз вижу такую запись.
У меня win32 и он правильно отрабатывает
Изменено: Евгений Смирнов - 08.12.2021 16:49:42
 
Хэш-символы представляют собой команду препроцессора, то есть команды, которые обрабатываются перед компиляцией, по существу создавая динамический/условный код. Эти типы команд часто используются в таких языках, как C/C++, для управления методами кроссплатформенного программирования. Обычно используется для проверки конкретной среды или платформы (например, VBA, Windows, MacOSX и т.д.), а затем реализует код для конкретной платформы.
https://docs.microsoft.com/ru-ru/cpp/preprocessor/hash-if-hash-elif-hash-else-and-hash-endif-directives-c-cpp?view=msvc-160&viewFallbackFrom=vs-2019
Изменено: New - 08.12.2021 17:09:03
 
Цитата
БМВ, написал:
собственно и Application.OperatingSystem - выдает 32 так как, вангую, офис 32
Точно!  Через "три пальца" (Alt+Ctrl+Delete) Диспетчер задач пишет, что и офис 2003, и 2007, и 2013, установленные на ноуте, все 32-битные (блин, хотя помню, что ставил 64-битный 2013... ан нет, однако!)
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Цитата
New, написал:
А так?
да, так пишет про 64-бита операционку...
Изменено: Ёк-Мок - 08.12.2021 17:17:37
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
БМВ, New, огромное спасибо за "смазку для лыж"!  (8
Для меня тема закрыта, так как трабл был не в сабже.

ps ох уж эти обратные совместимости офффисоффф MS )8
Изменено: Ёк-Мок - 08.12.2021 17:20:32
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
вот все почему-то меряются пипис*ками - вот у меня процессор i7! А у меня i9. А у меня видеокарта RTX3090! А у меня 8Гб оперативки, а у меня 16Гб оперативки, лохи, а у меня 32Гб оперативки. Но стоит спросить какой у тебя Excel, то начинается - у меня 97, а у меня 2003, а у меня 2010 и у всех 32 бита... Зато 32Гб оперативки...
P.S. я вот пишу код и думаю - надо всегда писать под 64бит, сейчас 32 ни у кого нет, а лишний код писать в лом... а тут как всегда
Изменено: New - 08.12.2021 17:25:10
 
OFF
New, писать OFF если не по теме мессендж в теме - это может успокоить Модераторов! (8
У заказчикофф пипи*ски недлинны (8
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Итак:
1. Разрядность операционной системы узнаем как в #5
2. Разрядность офиса узнаем как в #2. Напомню, что для 64-разрядной Windows можно установить как 64-разрядный, так и 32-разрядный офис.
3. "Для полноты картины" осталось узнать версию офиса. До офиса 2016 включительно это можно было сделать с помощью Application.Version. Но, например, для офисов 2016 и 2019 это свойство равно "16.0". Выручает свойство Application.CalculationVersion - ориентируемся на 2 первые цифры (для Excel 2021 проверить не могу).
Владимир
 
Off
New, по разному складывается. Например очень долго в мозгах сидела рекомендация использовать 32х разрядные продукты, если нет надобности в обработке больших массивов, это тянулось с времен , когда только зародилиь x64 продукты. Дистрибутив меньше - удобно установить 32. У 10 32 11му тоже 32 для унификации.  В большой конторе это тоже не просто. Те же обновления нужно тянуть для 2х систем? а на переходном периоде могут быть машины с x32 осью, и как результат x32 приложениями, даже если новые с 64, то и пакет нужно делать второй и обновления ....  Так что не все просто и зависит от размера кошелька.
По вопросам из тем форума, личку не читаю.
 
У меня функция ниже отработала на отлично, т.е., точно ответила какая у меня ОС и какая её разрядность.

И не только у меня:

Код

Источник.
Upd:
Цитата
БМВ написал:
Вывод хорошо оформленная функция написанная дилетантом.
Так будьте добры напишите пожалуйста нам дилетантам, нормальную рабочую функцию.
Upd:
Критика от БМВ есть, а толковой функции для нас так и не сделал. Проверял функцию, что выше, на двух разных компьютерах, все нормально работает.
Изменено: DANIKOLA - 09.12.2021 18:17:02
 
DANIKOLA,  
Цитата
БМВ написал:
через WMI select OSArchitecture from Win32_OperatingSystem
:)

И конечно автору привет
   Dim oOSs                  As Object    'Collection of OSs  - это важно, ведь вдруг в одном экземпляре системы вернет не единственное, а несколько объектов только в случае мультзагрузки..  :D. ну а как следствие  
Код
 For Each oOS In oOSs    'Enumerate each OS provided by WMI
        getOperatingSystem = getOperatingSystem & oOS.Caption & " " & oOS.Version & _
                             " (" & oOS.OSArchitecture & "), "
    Next
    getOperatingSystem = Left(getOperatingSystem, Len(getOperatingSystem) - 2)    'Remove the last ", "
или просто

Код
 For Each oOS In oOSs    'Enumerate each OS provided by WMI
        getOperatingSystem = oOS.Caption & " " & oOS.Version & _
                             " (" & oOS.OSArchitecture & ")"
    Next

или использовать не Caption a Name  или добавлять BootDevice или SystemDevice

А за
Код
    Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sHost & "\root\cimv2")
    Set oOSs = oWMI.ExecQuery("SELECT Caption, Version, OSArchitecture FROM Win32_OperatingSystem")
без проверки доступности хоста sHost я б руки варвал. Попробуйте использовать то что недоступно или не существует . Ошибку выдаст после  длительной задумчивости , а  задумчивость будет и при недоступности и при нехватке прав на удаленное подключение. Об этом как минимум нужно упомянуть.

Вывод хорошо оформленная функция написанная дилетантом.
Изменено: БМВ - 08.12.2021 22:33:04
По вопросам из тем форума, личку не читаю.
Страницы: 1
Читают тему (гостей: 1)
Наверх