Si vous avez besoin d'adapter votre Classeur (Workbook
) ou un formulaire VBA en fonction de l'écran de l'utilisateur, vous pouvez utiliser le langage VBA pour modifier le "Zoom" de la feuille (voir le code VBA plus bas).
Pour savoir de quelle manière adapter le Zoom vous devez connaître la résolution de l'écran de l'utilisateur. Les deux fonctions suivantes vous permettent d'obtenir la Largeur de l'écran, la Hauteur de l'écran et, naturellement, leur combinaison.
Sommaire
Trouver la résolution de l'écran avec VBA
Le code fait appel à la fonction GetSystemMetrics32
de la librairie "User32"
. Si cela ne vous dit rien, cela n'a pas tellement d'importance. Sachez seulement que le code de la Déclaration qui suit doit se trouver au début de votre Module
(avant même les fonctions):
1 2 |
Declare PtrSafe Function GetSystemMetrics32 Lib "User32" _ Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long |
Grâce à cette déclaration, vous pouvez accéder à certaines valeurs du système dont la résolution de l'écran de l'ordinateur.
Mise-à-jour: pour la version 64-bit d'Office, j'ai modifié le code en ajoutant PtrSafe
après Declare
.
Fonctions VBA pour trouver la Largeur et la Hauteur de l'écran
Et voici donc les deux fonctions VBA prêtes à l'emploi (vous pouvez les utiliser telles quelles dans votre Projet après un copier/coller). Elles retournent la hauteur et la largeur de l'écran en pixels.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Declare PtrSafe Function GetSystemMetrics32 Lib "User32" _ Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long Public Function ResolutionEcranLargeur() 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo FunctionErreur Dim LargeurEcran As Long LargeurEcran = GetSystemMetrics32(0) 'largeur de l'écran en pixels ResolutionEcranLargeur = LargeurEcran Exit Function FunctionErreur: ResolutionEcranHauteur = "" End Function Public Function ResolutionEcranHauteur() 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo FunctionErreur Dim HauteurEcran As Long HauteurEcran = GetSystemMetrics32(1) 'hauteur de l'écran en pixels ResolutionEcranHauteur = HauteurEcran Exit Function FunctionErreur: ResolutionEcranHauteur = "" End Function |
Exemple d’utilisation des fonctions ResolutionEcranLargeur() et ResolutionEcranHauteur()
Voici comment vous pouvez obtenir le message contenant la résolution de votre écran (le résultat est formaté).
1 2 3 4 5 6 7 8 9 10 |
Sub ResolutionEcran() 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo ResolutionEcranErreur MsgBox "La résolution de l'écran (largeur x hauteur): " & (Chr(13) & Chr(10)) & Format(ResolutionEcranLargeur, "#,##0") & " x " & Format(ResolutionEcranHauteur, "#,##0"), vbInformation Exit Sub ResolutionEcranErreur: MsgBox "La résolution de l'écran n'a pas pu être obtenue..." End Sub |
Ceci n'est qu'un exemple. Vous pouvez, bien entendu le modifier selon vos besoins.
VBA: adapter la Feuille à la taille de l'écran
Maintenant que nous avons la résolution de l'écran de l'utilisateur, nous pouvons utiliser cette information pour adapter le Zoom de la Feuille.
Nous pouvons créer deux ou même plusieurs "tailles" de la Feuille. Pour un résultat optimal, il vous faudra tester le résultat sur les différentes résolution et trouver la valeur de Zoom qui convient le mieux. Voyez l'exemple suivant…
Exemple: comment adapter le Zoom
de la Sheet
selon la résolution de l'écran
Dans cet exemple, la Feuille est créée sur un écran avec la largeur de 1280 pixels. Pour être sûr que l'utilisateur avec un écran avec une plus faible résolution (par exemple: la largeur assez répandue de 1024 pixels) puisse voir tout le contenu, nous adaptons le Zoom
de la Feuille à 68%. L'utilisateur avec un écran de 1280 pixels de large verra le contenu dans sa taille originale (Zoom
= 100%).
Pour ce code, on utilisera la construction Select Case
(voir tutoriel).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub AdapterZoomSelonResolution() 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo ExempleErreur Select Case ResolutionEcranLargeur 'tester la résolution de la largeur 'adapter le zoom du WorkBook selon le résultat Case 1280: ActiveWindow.Zoom = 100 Case 1024: ActiveWindow.Zoom = 68 Case Else End Select Exit Sub ExempleErreur: MsgBox "Une erreur est survenue..." End Sub |
Attention: pour que ce code fonctionne, vous aurez besoin également du code VBA de la Déclaration et des deux fonctions qui se trouvent plus haut.
Il s'agit d'une petite amélioration mais qui sera certainement appréciée par les utilisateurs de vos macros: pensez comme des vrais PROS – la satisfaction de l'utilisateur est primordiale!
Pour aller plus loin en VBA et en Excel
Si vous souhaitez en apprendre plus sur les possibilités de VBA et de Excel, n'hésitez pas à explorer ce site car il contient de nombreuses informations utiles. En voici quelques-unes qui pourraient vous intéresser…
- Savez-vous qu'il est possible de centrer l'écran de votre ordinateur sur une cellule spécifique du Classeur Excel?
- Et s'il vous arrive que la Feuille se déplace sur l'écran lorsque vous appuyez sur les touches de position (les flèches), voici comment rétablir la situation.
- Vous pouvez aussi consulter la liste de toutes les fonctions disponibles en VBA.
- Et tant que vous y êtes, vous pouvez faire de même pour la liste des fonctions Excel. Saviez-vous qu'il y'en a plus de 480?
- Comment utiliser RECHERCHEV en VBA (tutoriel)
- Tout sur le Tableau Croisé Dynamique dans Excel
11 commentaires sur “VBA: Trouver la résolution de l’écran”
Bonjour,
J'ai un souci pour adapter le Zoom dans Excel automatiquement. J'ai un écran de 15″ et un écran de 21″. Les deux ont la même résolution : 1920×1080. Pourtant l'affichage n'est pas le même, même si le zoom est identique dans la feuille excel.
J'ai compris que cela venait du fait de "la mise en échelle" de l'écran. Pour mon écran de 15″, j'ai une mise en échelle de 125% et pour mon écran de 21″, j'ai une mise en échelle de 100%. Comment est-il possible de connaitre via le code VBA la valeur de la mise en échelle ?
Merci d'avance
Bonjour,
j'ai 2 écrans un en paysage et l'autre en portrait. J'utilise actuellement cette fonction mais j'aimerai récupérer les démentions de mon 2eme écran et pas le 1er.
es ce possible?
Bonjour Gael,
malheureusement, ce n'est pas aussi simple que cela. Par défaut, les valeurs:
GetSystemMetrics32(0)
etGetSystemMetrics32(1)
correspondent respectivement à la largeur et à la hauteur de l'écran PRINCIPAL.Pour le reste c'est moins fiable.
Ce que vous pouvez obtenir d'autre du système ce sont les valeurs:
–
GetSystemMetrics32(80)
: qui vous donne le nombre d'écrans–
GetSystemMetrics32(78)
: qui vous donne la somme de la largeur des écrans–
GetSystemMetrics32(79)
: qui vous donne la hauteur de l'écran avec la plus grande résolution– donc avec
GetSystemMetrics32(78) - GetSystemMetrics32(0)
, vous pouvez obtenir la largeur de l'écran secondaire dans le cas où ce dernier est plus large que l'écran principal.Donc c'est compliqué et il faudra "chipoter" un peu…
Cordialement, Martin
Bonjour,
chez moi cela ne fonctionne pas, cela me dit que je dois adapter mon code pour être utilisé sur les systèmes 64 bits …
Pourriez-vous m'aider ?
Merci
Bonjour Eric,
essayez de remplacer la première ligne du code:
Declare Function GetSystemMetrics32 Lib "User32" _
par
Declare PtrSafe Function GetSystemMetrics32 Lib "User32" _
Cela devrait fonctionner.
Cordialement, Martin
Super Merci beaucoup !
Bonjour,
Est-il possible de savoir via un code VBA (j'imagine que oui…) si il y a un double écran sur un PC, si oui le mode (étendu / double) et comment modifier ce paramètre.
Merci
Bonjour Philippe,
voici le code que j'ai trouvé:
https://www.developerfusion.com/thread/49351/vb-dual-screen/
Ce code vous permet de voir le nombre d'écrans et voir lequel est le principal.
(attention, c'est du VB et pas VBA donc vous devez supprimer la première ligne et aussi le contenu de la fonction
Failed
tout en gardant cette fonction)Par contre je n'ai rien trouvé concernant le test si l'écran est dupliqué ou pas…
Cordialement, Martin
Vous avez résolu votre problème ?
Bonjour
je vous propose une solution avec cette même api sans déclaration 32/64 et surtout compatible de 2003 a 365
si ça vous intéresse
'————————————————————————
Type rés: largeur As Long: hauteur As Long: End Type
Public Function ScreenResolution() As rés
Dim r As rés
r.largeur = ExecuteExcel4Macro("CALL(""user32″",""GetSystemMetrics"",""JJJJJ"", " & 0 & ")")
r.hauteur = ExecuteExcel4Macro("CALL(""user32″",""GetSystemMetrics"",""JJJJJ"", " & 1 & ")")
ScreenResolution = r
End Function
Sub test()
MsgBox "Largeur :" & ScreenResolution.largeur
MsgBox "Hauteur :" & ScreenResolution.hauteur
End Sub
'——————————————————————