Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
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 ?
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
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.
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 ???
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
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.
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.
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
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 🙄...
En principe c'est Mac, Win32 et Win64.
Pour 2010, c'est VBA7 qu'il faut détecter 😛...
Comme je déteste me répéter, va jeter un œil sur ce post😀...
Pour le WebBrowser, c'est comme les OCX, c'est à proscrire pour la compatibilité 😛...
Bonne suite 😎
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.
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.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD