Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

SERIEUXETCOOL

XLDnaute Occasionnel
Bonsoir le Forum,

Je développe une macro qui est maintenant sur la fin. Néanmoins je rencontre quelques difficultés de compatibilité.

J'ai développé la macro sous Excel 2007 (version 12.0) et sous Windows XP (32-bit). Elle fonctionne très bien.
-Elle ne fonctionne plus à l'ouverture par Excel 2003.
-Elle ne fonctionne pas mieux avec Excel 2007 depuis Windows Seven (64-bit).
-Et enfin elle ne s'ouvre pas non plus avec Office 2011 pour Mac.

Pour éviter à l'utilisateur de se retrouver face à un message d'erreur, j'aimerais limiter l'ouverture du fichier Excel.
Les deux paramètres sont donc la version d'Excel, et la version de l'OS.

J'ai cherché sur le net et j'ai réussi à contrôler la version d'Excel. Ça fonctionne. Voici le code :


Code:
Private Sub Workbook_Open() 

If Val(Application.Version) <> 12 Then
    MsgBox "L'application a été élaborée à l'aide d'office 2007 (version 12.0) sous Windows XP (32-bit)." & Chr(10) & Chr(10) _
    & "Vous utilisez actuellement la version " & Application.Version & " d'office qui tourne sous " & Application.OperatingSystem & "." & Chr(10) & Chr(10) _
    & "Le fichier va se fermer pour des raisons de non compatibilité."
    Application.Quit
End If

End Sub


Malheureusement je n'ai pas trouvé le moyen de contrôler la version de l'OS ou alors s'il est en 32 ou 64 bit.

Ma question est alors la suivante :

Peut-on contrôler la version de l'OS ou le type de bus (32 ou 64) du système au même titre que la version d'office ?

Merci à ceux qui pourront m'aiguiller.

Bien cordialement,

André
 

kiki29

XLDnaute Barbatruc
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Salut, voir Savoir quelle version de windows (XP, Seven 32b, Seven 64b) - Forum des professionnels en informatique

que l'on pourra mixer avec celui de Frédéric Sigonneau pour les OS Antérieurs

Code:
Option Explicit

Public Declare Function GetWinVersion Lib "kernel32" Alias "GetVersionExA" _
                                      (lpVersionInformation As OSVERSIONINFO) As Long
Public Declare Function GetWinVersionEx Lib "kernel32" Alias "GetVersionExA" _
                                        (lpVersionInformation As OSVERSIONINFOEX) As Long

'Déclaration des constantes
Const VER_SUITE_SMALLBUSINESS = &H1
Const VER_SUITE_ENTERPRISE = &H2
Const VER_SUITE_BACKOFFICE = &H4
Const VER_SUITE_BLADE = &H400
Const VER_SUITE_COMMUNICATIONS = &H8
Const VER_SUITE_TERMINAL = &H10
Const VER_SUITE_SMALLBUSINESS_RESTRICTED = &H20
Const VER_SUITE_EMBEDDEDNT = &H40
Const VER_SUITE_DATACENTER = &H80
Const VER_SUITE_SINGLEUSERTS = &H100
Const VER_SUITE_PERSONAL = &H200

Const VER_NT_WORKSTATION = &H1
Const VER_NT_DOMAIN_CONTROLLER = &H2
Const VER_NT_SERVER = &H3

Public Const VER_PLATFORM_WIN32s = 0
Public Const VER_PLATFORM_WIN32_WINDOWS = 1
Public Const VER_PLATFORM_WIN32_NT = 2

'Structure pour les versions WinDOS
Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128    'sous type de certaines versions
End Type

'Structure pour les versions WinNT
Public Type OSVERSIONINFOEX
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128    'sous type ou info sur service pack installé
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    wProductType As Byte
    wRest As Byte
End Type


Public Sub GetWindowsVersion()
Dim oviWinNT As OSVERSIONINFOEX
Dim oviWin32 As OSVERSIONINFO
Dim strVer As String
Dim Os As String
Dim OSType As String
Dim NumeroVersion As String
Dim Detail As String
Dim Msg$, SP$

    oviWin32.dwOSVersionInfoSize = Len(oviWin32)
    GetWinVersion oviWin32
    Detail = Mid(oviWin32.szCSDVersion, 2, 1)

    Select Case oviWin32.dwPlatformId

        Case VER_PLATFORM_WIN32_WINDOWS

            If oviWin32.dwMajorVersion = 4 And oviWin32.dwMinorVersion = 0 Then
                Os = "Windows 95"
                If Detail = "A" Then
                    Os = Os & " OSR1"
                ElseIf Detail = "B" Then
                    Os = Os & " OSR2"
                End If
            ElseIf oviWin32.dwMajorVersion = 4 And oviWin32.dwMinorVersion = 3 Then
                Os = "Windows 95 OSR2"
                If Detail = "B" Then
                    Os = Os & ".1"
                ElseIf Detail = "C" Then
                    Os = Os & ".5"
                End If
            ElseIf oviWin32.dwMajorVersion = 4 And oviWin32.dwMinorVersion = 10 Then
                Os = "Windows 98"
                If Detail = "A" Then Os = Os & " SE (Seconde Édition)"
            ElseIf oviWin32.dwMajorVersion = 4 And oviWin32.dwMinorVersion = 90 Then
                Os = "Windows ME (Millenium Édition)"
            End If
            NumeroVersion = "[" & oviWin32.dwMajorVersion & "." _
                            & oviWin32.dwMinorVersion & _
                            IIf(Asc(Detail) = 0, "", "." & Detail) & "]"

        Case VER_PLATFORM_WIN32_NT

            oviWinNT.dwOSVersionInfoSize = Len(oviWinNT)
            GetWinVersionEx oviWinNT

            If oviWinNT.dwMajorVersion = 3 And oviWinNT.dwMinorVersion = 0 Then
                Os = "Windows NT 3.0"
            ElseIf oviWinNT.dwMajorVersion = 3 And oviWinNT.dwMinorVersion = 1 Then
                Os = "Windows NT 3.1"
            ElseIf oviWinNT.dwMajorVersion = 3 And oviWinNT.dwMinorVersion = 51 Then
                Os = "Windows NT 3.51"
            ElseIf oviWinNT.dwMajorVersion = 4 Then
                Os = "Windows NT 4.0"
            ElseIf oviWinNT.dwMajorVersion = 5 And oviWinNT.dwMinorVersion = 0 Then
                Os = "Windows 2000"
            ElseIf oviWinNT.dwMajorVersion = 5 And oviWinNT.dwMinorVersion = 1 Then
                Os = "Windows XP"
            ElseIf oviWinNT.dwMajorVersion = 5 And oviWinNT.dwMinorVersion = 2 Then
                Os = "Windows 2003 Serveur"
            End If

            'De quel type est le produit NT/2000/XP/2003 ?
            Select Case oviWinNT.wProductType
                Case VER_NT_WORKSTATION
                    If oviWinNT.dwMajorVersion < 5 Then
                        OSType = "Station de travail"
                    Else
                        If oviWinNT.wSuiteMask And VER_SUITE_PERSONAL Then
                            OSType = "Édition familiale"
                        Else
                            OSType = "Professionnel"
                        End If
                    End If
                Case VER_NT_DOMAIN_CONTROLLER
                    OSType = "Serveur (Contrôleur de domaine)"
                Case VER_NT_SERVER
                    If oviWinNT.wSuiteMask And VER_SUITE_DATACENTER Then
                        OSType = "Serveur (Centre de données)"
                    ElseIf oviWinNT.wSuiteMask And VER_SUITE_ENTERPRISE Then
                        If oviWinNT.dwMajorVersion = 5 And oviWinNT.dwMinorVersion = 0 Then
                            OSType = "Serveur avancé"
                        Else
                            OSType = "Edition Entreprise"
                        End If
                    ElseIf oviWinNT.wSuiteMask And VER_SUITE_BLADE Then
                        OSType = "Édition Web"
                    Else
                        OSType = "Serveur"
                    End If
            End Select

            NumeroVersion = "[" & oviWinNT.dwMajorVersion & "." _
                            & oviWinNT.dwMinorVersion & "." _
                            & oviWinNT.dwBuildNumber & "]"

            If oviWinNT.wServicePackMajor >= 1 Then
                SP = "Service Pack : " & oviWinNT.wServicePackMajor & "." & _
                     oviWinNT.wServicePackMinor
            Else
                SP = "Service Pack : " & "Aucun Service Pack installé"
            End If
    End Select

    Msg = "Système : " & Os & " " & OSType & vbLf
    Msg = Msg & "Numéro version : " & NumeroVersion & vbLf
    Msg = Msg & SP
    MsgBox Msg
End Sub
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Salut Kiki29,

Tout d'abord merci de porter un intérêt à la discussion. C'est cool.

J'ai pu tester les deux codes que tu propose. Celui de Frédéric Sigonneau me donne de bon résultats, mais malheureusement rien sur le 32 ou 64 bits. Quand au code de l'autre forum, j'ai pu remarquer qu'il s'agissait d'une fonction. Or je suis assez débutant pour rester franc.

J'ai donc créé une procédure dans laquelle j'ai fait appel à la fonction. Mais rien n'en est sortit. Normal, dans la fonction il n'y a aucun "MsgBox". Du coup, vu que la programmation parait un peu trop complexe pour moi, je n'ai pas su voir ou était stocké l'information utile parmi les variables. Donc en gros, je n'ai pas su m'en servir correctement.

Par contre j'ai observé dans le code la mention de 32 et 64 bits. Donc le code doit en effet permettre de récupérer cette info. Sauf que je ne sais pas faire^^

Je vais essayer de gratter encore un peu mais j'ai de gros doutes...

Merci en tout cas pour ces deux codes qui, je pense, une fois compilés tout deux ensemble doivent donner de très bon résultats.

André
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

J'ai pu mener d'autres tests et voici les résultats :

-Macro sous Windows XP 32 bit et Office 2007 => Nickel, rien à dire. Normal elle a été programmée et testée sous ces conditions.

-Macro sous Seven 32 Bit et Office 2010 => Ne fonctionne pas. Plante à l'affichage d'un UserForm qui utilise un WebBrowser. En supprimant le WebBrowser la macro se déroule entièrement mais les graphiques ne se sont pas incrustés aux endroits demandé par la code. Problème du à Seven 32 bit ou Office 2010 ???

-Macro sous Seven 64 bit et Office 2007 => Ne fonctionne pas non plus. Plante à l'affichage d'un UserForm qui utilise un WebBrowser. Je n'ai pas pu tester le code en enlevant le WebBrowser. Problème du à Seven 64 bit puisque c'est le même Office 2007 qui a été utilisé dans la version qui fonctionne ???

-Macro sous Mac et Office 2011 => Ne fonctionne pas non plus. Plante à l'affichage d'un UserForm qui utilise un WebBrowser. Je n'ai pas pu tester le code en enlevant le WebBrowser. Problème du à Mac ou Office 2011 ???


J'ai pu faire ces tests pour le moment. Il me semble que le problème ne viens pas de la version d'Office mais plutôt de la version de l'OS. Il faudrait que je teste sous Windows XP un office 2010 ou 2011 pour vérifier cette hypothèse.
Conclusion : Je doit autoriser l'accès au fichier Excel uniquement à partir d'un Windows XP 32 bit. Comment dois-je m'y prendre ? Je ne parviens pas à isoler proprement la version de l'OS.

Si quelqu'un à des réponses sur ce sujet je suis preneur.

André

Ps : Kiki29 a proposé 2 codes qui me semblent très intéressent dans cette logique. Mais je ne parviens pas à m'en servir proprement. Peut être la solution se trouve dans ces 2 codes ???
 

kiki29

XLDnaute Barbatruc
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Salut, et que donne une version allégée, peut-être suffisante dans ton cas
Code:
Option Explicit

Sub Tst()
    '   OS
    Debug.Print Application.OperatingSystem
    '   OFFICE
    Debug.Print Application.Version
    ' Debug.Print Val(Application.Version)
End Sub

Perso : Windows (32-bit) 5.01 et 8.0e pour 97, 10.0 pour 2002 et 12.0 pour 2007
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

J'ai testé ton code Kiki29,

Il est très similaire à celui que j'ai compilé pour le moment. Le mien est le suivant :

Code:
Private Sub Workbook_Open()

#If NotWin32 Then '32 ou 64 bit
    MsgBox "L'application a été élaborée à l'aide d'office 2007 (version 12.0) sous Windows XP (32-bit)." & Chr(10) & Chr(10) _
    & "Vous utilisez actuellement la version " & Application.version & " d'office qui tourne sous " & Application.OperatingSystem & "." & Chr(10) & Chr(10) _
    & "Le fichier va se fermer pour des raisons de non compatibilité."
    Application.Quit
#End If

If Val(Application.version) <> 12 Then 'Office
    MsgBox "L'application a été élaborée à l'aide d'office 2007 (version 12.0) sous Windows XP (32-bit)." & Chr(10) & Chr(10) _
    & "Vous utilisez actuellement la version " & Application.version & " d'office qui tourne sous " & Application.OperatingSystem & "." & Chr(10) & Chr(10) _
    & "Le fichier va se fermer pour des raisons de non compatibilité."
    Application.Quit
End If

End Sub

Je teste que l'ordi est bien en 32 bit, et que la version d'office est bien la 2007. Malheureusement je ne parviens pas isoler uniquement windows XP. Du coup si j'utilise un Windows Seven je ne sais pas l'interdire et du coup Excel plante.

En gros il faut pouvoir gérer le type d'OS, la version de Office, et si on est en 32 OU 64 bit.

Il ne me reste plus qu'un cas de figure.

Merci à toi Kiki29
 

chris

XLDnaute Barbatruc
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Bonjour

Pour info, j'ai Windows Seven 64 bits mais la ligne Application.OperatingSystem renvoie Windows (32-bit) NT 6.01.
Office est installé en version 32 bits : cela renvoie sans doute cette information.
 

kiki29

XLDnaute Barbatruc
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Salut, merci pour l'info, n'ayant pas de version 64 Bits sous la main, c'était malheureusement ce que je craignais et donc le lien donné pour tester est bien utile
 

JNP

XLDnaute Barbatruc
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Bonjour le fil :),
Code:
#If NotWin32 Then
me laisse un peu sceptique, je ne suis pas sûr que la variable NotWin32 existe :rolleyes:...
En principe c'est Mac, Win32 et Win64.
Pour 2010, c'est VBA7 qu'il faut détecter :p...
Comme je déteste me répéter, va jeter un œil sur ce post :D...
Pour le WebBrowser, c'est comme les OCX, c'est à proscrire pour la compatibilité :p...
Bonne suite :cool:
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Pour le WebBrowser, c'est comme les OCX, c'est à proscrire pour la compatibilité ...

En effet je pense que c'est ce composant la qui met en défaut la compatibilité. Pourtant moi je cherchais le composant "Web Browser" mais ne l'ayant pas trouvé dans la liste qui m'était proposée j'ai du me rabattre sur le composant qui s'en rapprochait le plus "Navigateur Web Microsoft"

Possible que ça vienne de la ?

J'y comprends pas grand chose à ces modules et librairies.

André
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Restreindre l'ouverture d'un fichier à une version d'Excel ET à une version d'OS

Bonsoir le Forum,

Bien j'ai finis par comprendre et résoudre en partie mon problème de restriction d'ouverture suivant des critères.

La solution proposée par JNP était juste.

Mon problème est venu de la non présence d'une Dll de la base de registre. Mon WebBrowser faisait appel à : "Emplacement C:\WINDOWS\system32\shdocvw.ddl"

Alors qu'il aurait au du pointer vers ieframe.dll
J'avais Internet Explorer 6 installé sur ma machine. En installant IE 8 mon composant "Navigateur Web Microsoft" avait disparu au profit su composant "Navigateur Web Browser".

Et ce composant pointait bien vers "ieframe.dll". Tout est ensuite rentré dans l'ordre car de base, tous les Windows possèdent "ieframe" du au fait que Internet Explorer soit préinstalé.

Sauf que moi sans savoir pourquoi, je n'avais pas ce composant. Mon vrai problème de non compatibilité venait de la.

Fastidieux pour remonter au problème, mais c'est fait. Piouf !

Merci à tous ceux qui ont participé. Merci à vous.

André
 

Discussions similaires

Statistiques des forums

Discussions
312 025
Messages
2 084 751
Membres
102 653
dernier inscrit
kulas11