Страницы: 1 2 След.
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
По вопросам из тем форума, личку не читаю.
 
Правильно ли я понимаю, что версия и разрядность Excel определяются встроенными инструментами самого Excel, так?
Код
Sub versionExcel()
Dim v, b, x
    Calculate
    v = Application.CalculationVersion
    v = Left(v, Len(v) - 4) & "." & Right(v, 4)
    b = Application.OperatingSystem
    x = InStr(1, b, "(")
    v = v + Mid(b, x, InStr(1, b, ")") - x + 1)
    MsgBox (v)
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
 
Добрый день Виталий!
В #2 - обычный вариант определения разрядности Excel.
Код
Function Is64bit() As Boolean
  #If Win64 Then
    Is64bit = True
  #End If
End Function

Версия Excel = Val(Application.Version)
Изменено: ZVI - 04.10.2022 14:40:41
 
Без директив условной компиляции разрядность Excel можно и так определить:
Код
Function Is64bit() As Boolean
  Dim a(1 To 2)
  Is64bit = VarPtr(a(2)) - VarPtr(a(1)) = 24
End Function
 
Добрый день, Владимир!
Цитата
ZVI написал:
Версия Excel = Val(Application.Version)
К сожалению это не работает. В Excel 2019 выводится 16.
А команды препроцессора я не могу использовать, я использую объектную модель Excel (у себя в библиотеке).
Второй способ тоже не смогу использовать, т.к. это особенность типов данных библиотеки VB.
Изменено: bedvit - 04.10.2022 14:59:32
«Бритва Оккама» или «Принцип Калашникова»?
 
Добрый день, коллеги! Мне кажется, что, начиная с версии Excel 2010, метод из #17 будет выдавать правильный результат. Более старые версии не могут иметь разрядность офиса, равную 64.
Изменено: sokol92 - 04.10.2022 15:09:57
Владимир
 
Цитата
bedvit написал: В Excel 2019 выводится 16.
Правильно (для MS). А что должно выдавать?
 
У меня в Excel 2016 versionExcel выдает 18.1029(64-bit). Разве так нужно?
Цитата
Второй способ тоже не смогу использовать, т.к. это особенность типов данных библиотеки VB.
Как это? В VBA Excel это всегда так. Библиотека же взаимодействует с VBA или нет?
Виталий, напишите, пожалуйста поконкретней, что не получается: создать в VBA variant массив и посмотреть расстояние между адресами элементов массива?
 
Цитата
ZVI написал:
А что должно выдавать?
разные значения должны быть.
Логично же, что для Excel 2016 должно отличатся от Excel 2019. Или у Майкрософт другая логика?
Владимир, я не использую VBA. Весь код написан на С/С++. Используется только объектная модель Excel.
Цитата
ZVI написал:
versionExcel выдает 18.1029(64-bit)
у меня выдавала 19. Возможно это тоже неверный подход.
«Бритва Оккама» или «Принцип Калашникова»?
 
Виталий, Excel 2019 отличается от Excel 2019 номерами major и majorup, там еще есть minor (Application.Build) и minorup.
Номера сборки Excel отображаются в Файл - Учетная запись (там еще, если щелкнуть, то вверху видна версия офиса)
Не совет для C, но узнать номера версий и сборок  VBA, Excel, stdole и Office можно, например и так:
Код
Sub Test()
  Dim i As Long
  For i = 1 To 4
    Debug.Print GetVersion(i)
  Next
End Sub

Function GetVersion(i As Long)
  With ThisWorkbook.VBProject.References
    GetVersion = .Item(i).Name & ": " _
      & CreateObject("Scripting.FileSystemObject").GetFileVersion(.Item(i).FullPath)
  End With
End Function


Цитата
... Используется только объектная модель Excel
Ну, если из нее нельзя заставить VBA что-то создать, тогда понятно. В вопросе то изначально был код VBA.
Изменено: ZVI - 04.10.2022 21:16:08
 
bedvit, Определить разрядность ОС
Взять Application.path ну и тут ветвися

если os 32bit то и excel 32bit
если os 64bit
   если  приложение в Program Files(x86) то excel 32bit  
   в противном  excel 64bit
По вопросам из тем форума, личку не читаю.
 
Excel 2013 x64
===============
VBA: 7.1.11.26
Excel: 15.0.5485.1000
stdole: 10.0.19041.1
Office: 15.0.5485.1000
Application.Version=15.0

Excel 2016 x64  (данные от ZVI)
===============
VBA: 7.1.11.27
Excel: 16.0.15629.20156
stdole: 10.0.19041.1
Office: 16.0.15629.20152
Application.Version=16.0

Excel 2019 x64
===============
VBA: 7.1.11.27
Excel: 16.0.10390.20024
stdole: 10.0.19041.1
Office: 16.0.10390.20024
Application.Version=16.0

Код
Option Explicit

Sub test()
  Dim i As Long
  For i = 1 To 4
    Debug.Print GetVersion(i)
  Next
  Debug.Print "Application.Version= ", Application.Version
End Sub
 
Function GetVersion(i As Long)
  With ThisWorkbook.VBProject.References
    GetVersion = .Item(i).Name & ": " _
      & CreateObject("Scripting.FileSystemObject").GetFileVersion(.Item(i).FullPath)
  End With
End Function
Изменено: bedvit - 04.10.2022 21:33:34
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
ZVI написал:
номерами major и majorup, там еще есть minor и minorup.
а где это можно посмотреть? Application.Version выдает для двух версий одинаковое значение.
Цитата
sokol92 написал:
Application.Version. Но, например, для офисов 2016 и 2019 это свойство равно "16.0". Выручает свойство Application.CalculationVersion - ориентируемся на 2 первые цифры
Цитата
ZVI написал:
Файл - Учетная запись (там еще, если щелкнуть, то вверху видна версия офиса)
там и смотрю. Как это показать кодом?
Цитата
БМВ написал:
Определить разрядность ОС
здесь проще, определяю в С/С++ версию win и разрядность так (использую, win api):
OSVERSIONINFOA structure (winnt.h)
SYSTEM_INFO structure (sysinfoapi.h)
Код
   OSVERSIONINFOW os;
   os.dwOSVersionInfoSize = sizeof(os);
   GetVersionEx(&os);
   std::wstring ver = std::to_wstring(os.dwMajorVersion) + L"." + std::to_wstring(os.dwMinorVersion);

   SYSTEM_INFO lpSystemInfo;
   GetNativeSystemInfo(&lpSystemInfo);//x64=PROCESSOR_ARCHITECTURE_AMD64
 std::wstring(lpSystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ? L" (64-bit)" : L" (32-bit)")
Изменено: bedvit - 04.10.2022 21:56:18
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал: а где это можно посмотреть
minor = Application.Build
По нему, в принципе, и нужно определять 2016/2019/2021 для версии 16.0
Просто границы нужно узнать.
Цитата
bedvit написал: Как это показать кодом?
Код же приведен в #25. Какой еще нужен?

У меня для Excel 2016 64 bit выдает такое:
VBA: 7.1.11.27
Excel: 16.0.15629.20156
stdole: 10.0.19041.1
Office: 16.0.15629.20152
Изменено: ZVI - 04.10.2022 21:28:10
 
Цитата
ZVI написал:
minor = Application.BuildПо нему
. А что с номерами major? Мало пилят функционала для нового номера с 2016 по 2021?))
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 След.
Наверх