VBA : Différencier les versions Excel 365, 2016 et 2019

Jean-Eric

XLDnaute Occasionnel
Bonjour,
Mon 1er. post...
Auriez-vous vous une astuce pour déterminer la version Excel utilisée sous Windows (10) ?
Application.Version retourne la même valeur, soit 16.0, pour les 3 versions énumérées.
Merci par avance.
Cdlt.

Jean-Eric
 

Jean-Eric

XLDnaute Occasionnel
Bonsoir Staple1600,
De mémoire pour Excel 2016, c'était 7.01, comme pour Excel 365 (ma version).
J'en déduit que cela doit la même chose pour 2019.
Sinon , j'avais commencé à me poser la question, et cherché un peu.
J'ai lu un article (que je recherche) et de mémoire, c'était à priori très difficile de trouver une solution viable.
Cdlt.

Jean-Eric
 

Staple1600

XLDnaute Barbatruc
Bonjour

Jean-Eric
Tout est dit dans la macro ci-dessous
VB:
Sub En_Attendant_L_Ami_Ricoré()
Dim m$, vNu
With Application
m = "Version: " & .Version & vbCrLf
m = m & "Build: " & .Build & vbCrLf
m = m & "Code Produit: " & .ProductCode & vbCrLf
m = m & "Chemin Librairies: " & vbCrLf & .LibraryPath & vbCrLf
End With
MsgBox m, 64, "Infos"
vNu = Split(Split(Application.LibraryPath, "\")(2))(2)
MsgBox "Excel, c'est quoi ton numéro?" & vbCrLf & "C'est le: " & vNu, 48, ";-)"
End Sub
Pas mieux pour le moment (suis en train d'explorer la voie qui passe par la Registry)

PS: Espérons que tu retrouves l'article qui éclairera nos lanternes ;)
 

Staple1600

XLDnaute Barbatruc
Re

VB:
''Dim oRegistry
''Dim oFSO
''Dim sKey
''Dim sAppExe
''Dim sValue
''Dim sAppVersion
''Const HKEY_LOCAL_MACHINE = &H80000002
''Sub TestOK_W10_XL2K13()
'''adapté d'un vbscript de D. Pineault [231013]
''Set oRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}//./root/default:StdRegProv")
''Set oFSO = CreateObject("Scripting.FileSystemObject")
''sKey = "Software\Microsoft\Windows\CurrentVersion\App Paths"
''sAppExe = "excel.exe"
''oRegistry.GetStringValue HKEY_LOCAL_MACHINE, sKey & "\" & sAppExe, "", sValue
''MsgBox oFSO.GetFileVersion(sValue), vbInformation, "Excel File Version"
''Set oFSO = Nothing
''Set oRegistry = Nothing
''End Sub
PS: Comme il s'agit de titiller le registre de Windows, j'ai sécurisé le code VBA ici soumis.
(Mais il suffira de deux clics dans VBE pour tester, mais là on pourra pas me tenir pour responsable si jamais survenait un fâcheux aléa comme Windows sait en avoir le secret ;) )
 

Jean-Eric

XLDnaute Occasionnel
Bonjour Jean-Marie,
Je recherche encore le lien que j'avais consulté !...
#4 :
Je joins un fichier (y.c. ta procédure) que j'utilise. Les résultats ne sont pas satisfaisants.
#5 :
Pour le registre, le souci est de trouver une clé commune aux 3 versions, qui retournerait 2016, 2019 ou 365 !...
* ta procédure nécessite à mon humble avis des droits d'administarteur...

Je persévère...
@+

Jean-Eric
 

Pièces jointes

  • Version Windows et MS-Office.xlsm
    21.3 KB · Affichages: 10

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Jean-Eric

Laquelle de procédure?
Celle qui titille le registre?
C'est possible, j'ai peu-être testé en étant "logged" dans une session avec droits admin.

EDITION: En regardant ta PJ, je remarque qu'on a bu à la même source ;)
 

Jean-Eric

XLDnaute Occasionnel
Bonjour le fil, Jean-Marie,,
J'ai retrouvé le lien :
Vérifiez la version de l’application Excel
Le fichier joint comporte 2 modules : KenPuls et JeanEric
La fonction de KenPuls [AppVersion()] ne fonctionne pas pour mon cas. La clé LicensingNext n'existe pas dans le registre Windows.
HKEY_CURRENT_USER\Software\Microsoft\Office\xx.0\Common\Licensing\LicensingNext"
J'ai donc modifié la fonction [AppVersion_2()] avec un chemin différent :
HKEY_CURRENT_USER\Software\Microsoft\Office\xx.0\Common\Licensing\OlsToken
Lorsque j'exécute la procédure Check_2(), le résultat est Excel 365 (o365homepremretail).
Donc, je suis satisfait , mais !...

Bon, maintenant, qu'en est il pour vous ?
Pouvez-vous tester la chose (exécuter Check_1 et Check_2) et faire un retour ?

Merci par avance.
Jean-Eric
 

Pièces jointes

  • AppVersion.xlsm
    20.2 KB · Affichages: 15

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Jean-Eric

J'ai testé Check1 et Check2
(sur XL2K10 et XL2k13) => OK
Tu peux tester Check_3 (j'ai pas XL 2016 ou supérieur sous la main) ;)
VB:
Private Function zAppVersion()
Select Case Val(Application.Evaluate("INFO(""VERSION"")"))
Case 16
'?
Case 15
zAppVersion = 2013
Case 14
zAppVersion = 2010
Case Is = 12
zAppVersion = 2007
Case Else
'Too old to bother with
zAppVersion = 0
End Select
End Function
Sub Check_3()
MsgBox "You are running Excel " & CStr(zAppVersion), vbInformation, "Test"
End Sub
 

Jean-Eric

XLDnaute Occasionnel
Bonsoir,
@JM
La fonction plante à la 1ère. ligne. La fonction INFO() ne comprend pas VERSION.
Pensais-tu à l'argument RELEASE ?

Sinon, peux tu me dire si dans le registre (Regedit) les suivantes existent pour Excel 2010 et 2013 ?
HKEY_CURRENT_USER\Software\Microsoft\Office\xx.0\Common\Licensing\LastKnownC2RProductReleaseId
HKEY_CURRENT_USER\Software\Microsoft\Office\xx.0\Common\Licensing\OlsToken

Cordialement.
Jean-Eric
 

Staple1600

XLDnaute Barbatruc
Re

Donc ceci n'existe plus sur Excel 2016 et supérieur alors ?
01INFO.jpg

Sinon sur ma version Excel 2013, seul cette clé existe:
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Common\Licensing\OlsToken
 

Jean-Eric

XLDnaute Occasionnel
Bonjour le fil, JM
Check renvoie Excel 2016 et Check_2 me renvoie Excel 365 (résultat attendu).
Elle devrait retourner l'équivalenl suivant la version de l'application (Excel 2007, … , Excel 2019).

Des personnes intéressées pour tester Check_2 et faire un retour ?
Pour info, la fonction ne modifie pas le registre Windows. Elle lit simplement une valeur déterminée dans le registre.
Dans le fichier joint, la version Excel est affichée dans une cellule (aucune manipulation).
Cdlt.

Jean-Eric
 

Pièces jointes

  • AppVersion.xlsm
    20.5 KB · Affichages: 13

Jean-Eric

XLDnaute Occasionnel
Bonjour à tous,
A près une série de tests effectués par JM et Chris, que je remercie chaleureusement, je joins la fonction App_Version() dans le fichier joint.
Elle permet donc de retourner la version d'Excel utilisée, en différenciant les versions 365, 2016 et 2019.
J'ai cependant encore un doute avec la lecture du registre pour l'utilisateur qui ne dispose pas des droits d'administrateur (!?).
Je vais poursuivre les tests, pour déceler d'éventuels bugs.
Cordialement.

VB:
Public Function AppVersion() As Long
Dim registryObject As Object
Dim rootDirectory As String
Dim keyPath As String
Dim arrEntryNames As Variant
Dim arrValueTypes As Variant
Dim x As Long

    Select Case Val(Application.Version)
    
        Case Is = 16
            'Check for existence of Licensing key
            keyPath = "Software\Microsoft\Office\" & CStr(Application.Version) & "\Common\Licensing\OlsToken"
            rootDirectory = "."
            Set registryObject = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & rootDirectory & "\root\default:StdRegProv")
            registryObject.EnumValues &H80000001, keyPath, arrEntryNames, arrValueTypes

            On Error GoTo ErrorExit
            For x = 0 To UBound(arrEntryNames)
                If InStr(arrEntryNames(x), "365") > 0 Then
                    AppVersion = 365
                    Exit Function
                End If
                If InStr(arrEntryNames(x), "2019") > 0 Then
                    AppVersion = 2019
                    Exit Function
                End If
            Next x

        Case Is = 15
            AppVersion = 2013
        Case Is = 14
            AppVersion = 2010
        Case Is = 12
            AppVersion = 2007
        Case Else
            'Too old to bother with
            AppVersion = 0
    End Select

    Exit Function

ErrorExit:
    'Version 16, but no licensing key.  Must be Office 2016
    AppVersion = 2016

End Function
 

Pièces jointes

  • AppVersion.xlsm
    20.5 KB · Affichages: 8

Discussions similaires