2
votes

Comment distinguer par programme Excel 2019 de 2016?

Je maintiens un diagnostic qui détermine par programme la version des applications MS Office, y compris Excel et Word. Il a fonctionné correctement pour les versions de MS Office 2003, 2007, 2010, 2013 et 2016. Mais maintenant, je trouve qu'il signale incorrectement les applications MS Office 2019 comme MS Office 2016.

Il y a huit ans, MA Hanin a posté une question similaire:

Identification de la version d'Excel par programmation

Réponse de mathieu , la réponse acceptée, les nombres corrélés utilisés pour identifier MS Office dans le registre par rapport aux versions du produit. Par exemple, le nombre 14.0 correspond à Office 2010. Doug Glancy a directement répondu à la question avec le code VB qui imprime la propriété version de l'objet Excel Application:

https://docs.microsoft.com/en-us/office/vba/api/excel.application.version

Voici un script VB qui diagnostique quelle version, le cas échéant, d'Excel est installée sur le système:

On Error Resume Next
Set excelApp = CreateObject("Excel.Application") 
If Err.Number <> 0 Then
    WScript.Echo "Excel is not installed"
Else
    Wscript.Echo "Excel Version: " & excelApp.Version 
End If

Le diagnostic fidèlement signale les versions de MS Office cohérentes avec la publication de 2011. Depuis lors, il indique 15.0 pour Office 2013 et 16.0 pour Office 2016. Récemment, cependant, j'ai été surpris de constater qu'il signale également 16.0 pour Office 2019. Ce n'est tout simplement pas correct ! Les ensembles de fonctionnalités 2016 et 2019 sont clairement distincts, ils ne doivent donc pas être regroupés:

https://support.office.com/en-us / article / what-s-new-in-office-2019-5077cbbe-0d94-44cc-b30e-654e37629b0c? ui = en-US & rs = en-US & ad = US

Y a-t-il un autre façon de distinguer par programme Office 2016 d'Office 2019?


5 commentaires

Pas pour le moment. asap-utilities.com/blog/index.php/2018/10/05/...


stackoverflow.com/ questions / 3266675 /…


Avez-vous essayé d'exécuter simplement l'une des nouvelles fonctionnalités au lieu de CreateObject? Par exemple. Concat au lieu de concaténer? Si Err.Number <> 0 alors, ce n'est pas Excel 2019.


@TylerH, je pense que cela fonctionnerait bien comme solution de contournement provisoire. Mais cette rupture ne serait-elle pas une fois MSO 2022 sorti?


@ Snaps-a-Lot Office 2019 sera la dernière version autonome d'Office. Je me souviens avoir lu ceci lorsqu'ils ont annoncé l'existence de 2019, et cela semble assez probable étant donné qu'Office 2019 ne bénéficie que de 2 ans de support étendu au lieu des 5 ans habituels pour les versions précédentes. Cela signifie qu'Office 2016 et Office 2019 mourront tous deux «officiellement» en 2025 (à ce moment-là, Office 365 existera depuis 14 ans ). Si Microsoft change d'avis et publie un Office 2022 (et c'est un gros si), il est peu probable que celui-ci, aussi , soit toujours étiqueté comme version majeure 16.0.


4 Réponses :


0
votes

Une solution de contournement consiste à analyser le numéro de version à partir de la sortie de l'outil de gestion de licence du logiciel client MS Office, OSPP.VBS, exécuté avec l'option / dstatus. Voici un exemple de script CMD qui illustre la solution de contournement:

:: GetOfficeVer.cmd - Print the version of a licensed MS Office package.
::   Prerequisite:
::      Copy this cmd script to a folder including these MS Office files:
::          * OSPP.VBS    - MS Office Software Protection Platform script.
::          * OSPP.HTM    - Help file for OSPP.VBS.
::          * SLERROR.XML - Data file for OSPP.VBS.
::   Syntax:
::      GetOfficeVer [ComputerName[ PackageAbbr]]
::        ComputerName    - Windows system name  (defaults to local system)
::        PackageAbbr     - Package abbreviation (list below is not exhaustive)
::          *  ProPlus    - Office Professional Plus (default)
::          *  VisioPro   - Visio Professional
::          *  InfoPath   - InfoPath Designer
::   Return Values:
::          *  If the package is licensed, print the MS Office package version
::             string using the MS Office Application.Version property format.
::          *  If the package is unlicensed, print an empty line.
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
if %2_==_ (set MSO_PKG=ProPlus) else (set MSO_PKG=%2)
set "MSO_PKG_LIC=cscript "%~dp0\OSPP.VBS" /dstatus %1 | findstr /R /C:"^LICENSE NAME:.*%MSO_PKG%""
for /f "tokens=1-4 delims=, " %%G in ('!MSO_PKG_LIC!') do (set MSO_VER=%%J)
if %MSO_VER%_==_ (echo.) else ( echo %MSO_VER%.0)
endlocal

Conseils sur l'utilisation d'OSPP.VBS:

  • L'exécution peut prendre quelques secondes.
  • Il est inclus dans le dossier stocké dans la propriété Application.Path.
  • Il n'est pas nécessaire que MS Office soit installé sur le système à partir duquel il est exécuté.
  • Il n'est pas nécessaire de l'exécuter comme élevé pour cela.
  • Il échouera si le système cible a besoin d'un redémarrage.
  • Les versions 2013, 2016 et 2019 fonctionnent chacune par rapport aux trois versions.


0 commentaires

-1
votes

Vous pouvez essayer d'analyser excelApp.Path pour trouver le chemin d'installation. Cela fonctionnerait si le nouveau bureau est installé dans C: * \ Office 19 \ Excel.exe


1 commentaires

Office 2019 reste à la version 16.0 majeure: docs.microsoft.com/en-us / deployoffice / office2019 / overview donc les chemins d'installation seront probablement les mêmes.



0
votes

Oui, la v16 peut être 2016 ou 2019

Cela fonctionne pour la version pour moi.

:GetOfficeVer
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
    >%vbs% @echo off
    >>%vbs% echo Option Explicit ' Enforce variable declaration
    >>%vbs% echo Dim oShell
    >>%vbs% echo Dim lOfficeVersion
    >>%vbs% echo Set oShell = CreateObject("WScript.Shell")
    >>%vbs% echo On Error Resume Next
    >>%vbs% echo lOfficeVersion = GetOfficeVersionNumber() 
    >>%vbs% echo MsgBox "OfficeVersion = " ^& lOfficeVersion
    >>%vbs% echo     Function GetOfficeVersionNumber()
    >>%vbs% echo         GetOfficeVersionNumber = "" 
    >>%vbs% echo         Dim sTempValue
    >>%vbs% echo         sTempValue = oShell.RegRead("HKCR\Excel.Application\CurVer\")
    >>%vbs% echo         If Len(sTempValue) ^> 2 Then GetOfficeVersionNumber = Replace(Right(sTempValue, 2), ^".^", ^"^")
    >>%vbs% echo     End Function   
cscript //nologo %vbs%
pause
if exist %vbs% del /f /q %vbs%
endlocal
goto :EOF


1 commentaires

bravo pour la technique "ici document". Mais, sur les systèmes avec MSO 2019, il renvoie malheureusement "16". :-(



0
votes

Pour étendre les réponses déjà données, il semble que OSPP.VBS est malheureusement le moyen le plus sûr d'obtenir les informations dont nous avons besoin pour différencier Office 2016, 2019 et 365.

Au lieu de exécutant cscript OSPP.VBS / dstatus , il est possible d'obtenir les mêmes informations en implémentant nous-mêmes les requêtes WMI utilisées par OSPP.VBS (ici en C #):

// Implementation is based on the OSPP.VBS file in the Office directory,
// when it executes the /dstatus command...
// result examples:
// - Office 16, Office16StandardVL_MAK edition
// - Office 19, Office19Standard2019VL_KMS_Client_AE edition
// - Office 16, Office16O365ProPlusR_Subscription1 edition
// - Office 15, OfficeStandardVL_MAK edition

// This constant is apparently the same for all Office versions:
const string officeAppId = "0ff1ce15-a989-479d-af46-f275c6370663";

// Note: OSPP.VBS uses == instead of <= but it seems wrong...
string productClass;
if (Environment.OSVersion.Version <= new Version(6, 1)) // Windows 7 or below
    productClass = "OfficeSoftwareProtectionProduct";
else
    productClass = "SoftwareLicensingProduct";

// Get the product name for all Office products having a product key:
var query = $"SELECT Name FROM {productClass} where "
+ $"ApplicationID=\"{officeAppId}\" AND PartialProductKey <> NULL AND PartialProductKey <> \"\"";

using (var searcher = new System.Management.ManagementObjectSearcher(query))
{
    var result = new List<string>();
    foreach (var instance in searcher.Get())
    {
        result.Add(instance.Properties["Name"].Value?.ToString() ?? "Null");
    }
    
    // result now contains a list of license names with the same format as `cscript OSPP.VBS /dstatus`
}


0 commentaires