Exemple de zoom automatique par VBA

Pour écrire et partager des tutoriels et des astuces (Excel, Calc et Google Sheets uniquement)
Avatar du membre
waard
Contributeur
Contributeur
Messages : 436
Appréciations reçues : 16
Inscrit le : 9 février 2015
Version d'Excel : 2013, 2016, FR
Téléchargements : Mes applications

Message par waard » 22 mai 2016, 12:11

Hello, :D

:ordi2: J'ai proposé un exemple de codage en V.B.A. de contrôle de zoom auto sur une plage de cellules, quelque soit la taille d'écran et de la taille de la fenêtre, ici : https://www.excel-pratique.com/fr/telech ... -no236.php
demo moteur zoom.jpg
Il s'agit de mon fichier que j'avais programmé sur un sujet du forum, dont j'ai commenté en détail le code et expliqué le schéma directeur. Sujet en question : http://forum.excel-pratique.com/excel/z ... 71863.html
:?: :) Sur ce sujet, vous trouverez aussi des exemples réalisé par Eriiic dont celui qui utilise un contrôle par rafraichissement toutes les secondes, en utilisant la méthode Ontime, plutôt que par boucle infinie comme pour mon code.

Sommaire
1. Principe
2. Schéma de fonctionnement
3. Pour l'adaptation
4. Masterclass : Utilisation d'une boucle de contrôle infinie
5. Masterclass : Utilisation de l'événement classeur : Workbook_open
6. Masterclass : Utilisation de l'événement classeur : Workbook_WindowResize
7. Masterclass : Utilisation de l'événement feuille : Worksheet_Activate
8. Masterclass : Utilisation de l'événement feuille : Worksheet_BeforeDoubleClick

:|||:
1. Principe
:?: Le principe de cet ensemble de macro dont la principale tourne comme un moteur, contrôlant en permanence l'adéquation du zoom, répond à une préoccupation d'avoir en permanence un zoom affichage adéquat, afin d'avoir affiché par exemple un tableau dans sa totalité, quelque soit la taille de l'écran ou de la fenêtre de l'écran.

:!: Le zoom est prévu pour fonctionner sur la feuille 1 uniquement, qui réalise une correction de zoom sur la plage du tableau allant de A1:T50.
> Afin de permettre à Excel d'identifier si l'utilisateur est sur la feuille 1 et qu'il doit faire ou non son contrôle de zoom permanent sur cette plage, une cellule INTERRUPTEUR est basée dans la feuille 1 en A1. De même un bouton poussoir, permet de désactiver aussi le zoom permanent en cliquant dessus.

2. Schéma de fonctionnement
A l'ouverture du classeur, par gestion de l'événement "Workbook_Open" correction du zoom sur la plage A1:T50.
Puis la macro événement classeur : "Workbook_Open" lance un chrono appelé : "Lancement_opensub" dans le module : "Boucle_principal_ctrle_zoom".
a--> Au bout d'une seconde le chrono : "Lancement_opensub" lance la macro : "opensub" servant à vérifier le zoom démarre et va tourner en permanence comme un moteur.
b------> "opensub" lance une boucle infinie qui contrôle en permanence si le zoom de la plage A1:T50 dans la feuille1 est adéquate, en fonction de la taille de la fenêtre de l'application Excel, si l'utilisateur change la taille de celle-ci, dans ce cas "opensub" lance automatiquement la macro "zoom" pour calculer la correction, tout en permettant avec la methode Doevents, de pouvoir continuer à utiliser Excel sans désagréments importants.
c---------> Evénement SI : Si l'utilisateur change la taille de la fenêtre principale, alors la macro "zoom" corrige le zoom pour qu'il soit adapté à la plage tableur A1:T50.
d---------> Evénement SI : Si l'utilisateur change la taille de la sous-fenêtre d'application, correspondant à celle du classeur, alors un événement classeur se lance "Workbook_WindowResize" et adapte le zoom en conséquence à la plage A1:T50.
b------> La méthode Doevent placé dans la boucle "Opensub" permet de rafraichir l'application à un degré suffisamment élevé pour permettre à l'utilisateur de continuer à utiliser Excel sans désagréments. Par contre l'utilisation de ce moteur monopolise des ressources matériels, visible dans le gestionnaires de tâches Windows
b------> Dans cette boucle, est analysé en fonction de l'activation de l'interrupteur dans la cellule A1 (1 = ""ON"" / 0 = ""OFF"") si la correction zoom doit être faite ou non.
Ainsi si l'utilisateur est sur la feuille 2, aucune correction n'est réalisé, par contre à l'activation de la feuille 1 le contrôle de correction de zoom s’effectue, néanmoins si on appuis sur le bouton poussoir, même en étant sur la feuille 1, la cellule A1 prenant 0, la boucle passe le contrôle de correction." ::B.

3. Pour l'adaptation
'** Interrupteur :
"Dans le module VBA, sur chaque module feuille, quand l'utilisateur va sur une feuille, l'interrupteur prend une valeur 1 ou 0, soit ON ou OFF, si est sur la feuille 1 = ON, sur feuille 2/3/4 = OFF.
Il doit y avoir autant de code d'activation/désactivation de zoom que de feuille créées."
'** Zone de zoom :
Le zoom se fait sur ThisWorkbook.Worksheets(1).Range("A1:T50") pour une autre zone modifier la plage ou mieux nommer une plage cellule dans Excel (exemple, on nomme A1 à T50 => ZOOM et on fait référence à range("ZOOM") ), ainsi plus besoin de modifier en dur dans VBA, mais seulement dans Excel, (penser à mettre en pause la boucle zoom avant modifications :mrgreen: ).
'** Objet géré par le zoom :
"Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre
Windows(1).Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%, etc "
** Cas de doevents qui permet de garder la main sur l'application sans effet de freezing :
"DoEvents est une ligne de rafraichissement d'application, pour permettre à l'utilisateur de reprendre la main quand besoin d'utilisation d'Excel, sinon Excel continuera à boucler à l'infinie sur ce calcul, empêchant l'utilisateur d'utiliser Excel, bien faire attention a être parcimonieux avec l'utilisation de doevents, les processeurs n'aiment pas trop être sursollicités.
Cela permet aussi de lancer d'autres macro, la boucle de zoom se mettant en pause à ce moment laisser démarrer la macro."
'** Lieu de l'interrupteur :
L'interrupteur est spécifié dans la ligne ThisWorkbook.Worksheets(1).Range("A1").Value = 1, pour spécifier un autre emplacement, indiquer une autre adresse cellule, vous pouvez la mettre en police blanche, excel ne lisant que la valeur informatique et non la valeur d'affichage comme l'utilisateur (^-^)
'** Calcul de la boucle infinie :
La boucle infinie perdure tant que la cellule "xfc1" est vide, en théorie personne n'utilise cette cellule IsEmpty(ThisWorkbook.Worksheets(1).Range("xfc1")), mais au cas où, soyez prévenu que si vous remplissez cette cellule la gestion du zoom est arrêté et ne se relancera qu'à la réouverture du fichier et si la cellule est vide.

8) :?: Sauf besoins de personnalisation plus poussés, normalement pour une adaptation courante seul ces 3 types de ligne de code sont à adapter :
ThisWorkbook.Worksheets(1).Select 'Selection feuille où se trouve le tableau pour éviter un bug '<< Spécifier la feuille <<
ThisWorkbook.Worksheets(1).Range("A1:T50").Activate  'définit la zone de zoom << Spécifier zone de zoom <<
ThisWorkbook.Worksheets(1).Range("A1").Value = 1 << Spécifier où se trouve l'interrupteur<<

4. Masterclass : Utilisation d'une boucle de contrôle infinie
:?: Afin d'avoir une boucle infinie, il faut par exemple utiliser une boucle Tant Que / Do while Loop, en spécifiant une condition d'arrêt qui ne se produira normalement jamais, comme par exemple en spécifiant une condition de poursuite de boucle tant que la cellule XFC1 soit vide. Ainsi la boucle tournera à l'infinie en faisant ses calculs en boucle, néanmoins le fait de calculer en boucle mettra Excel en mode freezing, d'où l'utilité d'utiliser la méthode DoEvents, qui rendra à chaque passage sur cette ligne la main à l'utilisateur en rafraichissant l'application, par contre il faut que ce rafraichissement soit assez optimale et judicieux pour garder des conditions d'utilisations normales, mais cette méthode ne permet pas de récupérer certaines fonctions comme l'affichage des commentaires, car passer un curseur sur un commentaire n'est pas compris par Excel, mais la plupart des fonctions fonctionnent et il est même possible de lancer d'autre macro, pour ce faire cliquer par exemple sur le smiley du fichier. :)

:!: Par contre, il ne faut pas lancer cette boucle infinie à l'ouverture du classeur, car cela créera des bugs, d'où l'utilisation du chrono de lancement, qui lance la boucle 1 seconde l'ouverture du classeur.
:!: De plus étant donné que nous allons avoir certaines variables en commun avec plusieurs autres macro, il faut penser à les déclarer en variables générales.

:arrow: Ici dans le fichier, on utilise l'événement classeur Workbook_open > qui lance une macro chrono "Lancement_opensub" > Qui elle même au bout d'une seconde lance la macro boucle infinie "opensub"
Code se trouvant dans le module Thisworkbook
'Déclaration variables en mode général pour pouvoir reprendre les valeurs de variables et être mises à jour dans plusieurs sub dans le module thisworkbook	
'zoommindansapplication = valeur du ZOOM quand en affichage minimale du zoom actif	
'zoommaxdansapplication = valeur du DEZOOM quand affichage normal du zoom actif	
'zoomchangedansapplicationuser = valeur de la taille de la fenetre de l'application	
Dim zoommindansapplication, zoommaxdansapplication, zoomchangedansapplicationuser As Double	
	
'A Procédure d'événement macro en lancement à l'ouverture du classeur si modification affichage de l'application	
Private Sub Workbook_Open()	
'1 définition des variable zooms	
ThisWorkbook.Worksheets(1).Select 'Selection la feuille où se trouve le tableau pour éviter un bug '<<<<<<<<<<<<<<< Spécifier la feuille <<<<<<<<<<<<<<<	
ThisWorkbook.Worksheets(1).Range("A1:T50").Activate  'définit la zone de zoom pour variables zoom...dansapplication '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
ActiveWindow.zoom = True 'zoom sur selection	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
zoommindansapplication = Windows(1).zoom 'à l'ouverture mise en val de départ du ZOOM quand en affichage minimale du zoom actif	
zoommaxdansapplication = Windows(1).zoom 'à l'ouverture mise en val de départ du déZOOM quand affichage normal du zoom actif	
zoomchangedansapplicationuser = Application.UsableWidth 'à l'ouverture mise en val de départ de la taille de la fenetre de l'application	
'OPTION ouverture / A activer si vous ne voulez pas qu'à l'ouverture la plage soit selectionné '<<<<<<<<<<<<<<< OPTION <<<<<<<<<<<<<<<	
'ThisWorkbook.ActiveSheet.Range("A1").Select 'A l'ouverture du classeur, le curseur cellule se trouve sur la cellule A1 de la feuille active et évite que l'ensemble du tableau ne soit selectionné	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
'2 suite à l'ouverture du fichier, lancement de la macro "Lancement_opensub" après 1 seconde d'attente, géré par le chrono de la macro "Lancement_opensub" (afin d'éviter un bug rendant inactives certaines fonctions Excel)	
Lancement_opensub 'lance le chrono d'attente d'1 seconde et de cette macro chrono, lancera la gestion du zoom d'affichage ^^	
End Sub	
	
Code se trouvant dans le module Thisworkbook	
'Déclaration variables en mode général pour pouvoir reprendre les valeurs de variables et être mises à jour dans plusieurs sub dans le module boucle_principal_ctrle_zoom	
'zoommindansapplication = valeur du ZOOM quand en affichage minimale du zoom actif	
'zoommaxdansapplication = valeur du DEZOOM quand affichage normal du zoom actif	
'zoomchangedansapplicationuser = valeur de la taille de la fenetre de l'application	
Dim zoommindansapplication, zoommaxdansapplication, zoomchangedansapplicationuser As Double	
	
'SOMMAIRE	
'0. Par gestion d'événement d'ouverture fichier, lance auto. le Point A	
'A. Lancenment du controle zoom au bout d'1 seconde	
'B. Controle permanent de la taille d'affichage et du zoom dans excel par boucle infinie	
'C. Correction exceptionnelle si user touche à la taille de la fenetre de l'application puis retour dans le point B.	
'CE. Correction exceptionnelle Si événement classeur de redimensionnement sous fenetre classeur, alors lancement process Workbook_WindowResize	
'Info. si user va dans les feuille 2 / 3 / 4 interrupteur s'active et ne fait pas le controle zoom, mais reprend s'il retourne sur feuille 1, voir macro interne à chaque feuille désactivant le ctrle zoom (INTERRUPTEUR dans cellule A1 // 1 pour ON / 0 pour OFF)	
	
'A. Lancenment du controle zoom au bout d'1 seconde	
Sub Lancement_opensub()	
'1 redéfinition des variables zooms étant donné qu'on change de module dans vba	
zoommindansapplication = Windows(1).zoom 'à l'ouverture 1er lancement mise en val de départ du ZOOM quand en affichage minimale du zoom actif	
zoommaxdansapplication = Windows(1).zoom 'à l'ouverture 1er lancement mise en val de départ du déZOOM quand affichage normal du zoom actif	
zoomchangedansapplicationuser = Application.UsableWidth  'à l'ouverture 1er lancement mise en val de départ de la taille de la fenetre	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
'2 Attendre 1 seconde et lance la macro opensub suite à l'ouverture du fichier, permet d'éviter le bug qui rend inactif certains onglet d'outils excel	
Application.OnTime Now + TimeValue("0:00:01"), "opensub"	
End Sub	
	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
	
'B. Controle permanent de la taille d'affichage et du zoom dans excel	
Sub opensub()	
Dim CEL_SELECT_EN_COURS As Variant 'Déclaration variable pour connaitre la cellule en cours que l'user à selectionnée pour pouvoir garder l'adresse ce cellule	
'---------------------------------------------------------------------------------------------------------	
'1 lance boucle sans fin (enfin tant que cellule xfc1 vide) de controle de zoom de la fenetre	
Do While IsEmpty(ThisWorkbook.Worksheets(1).Range("xfc1")) 'Boucle infinie enfin en théorie, tant que la cellule xfc1 est vide	
'---------------------------------------------------------------------------------------------------------	
On Error Resume Next 'gestion d'erreur, si erreur passe à ligne suivante sans s'arrêter	
'---------------------------------------------------------------------------------------------------------	
DoEvents 'ligne de raffraichissement, pour permettre à l'utilisateur de reprendre la main quand besoin d'utiliser excel, sinon excel continu à boucler à l'infinie sur le calcul de la cellule vide xfc1	
'---------------------------------------------------------------------------------------------------------	
'I Si affichage normal et que le zoom correspond au zoom de départ ou adéquate alors rien, sinon ZOOM	
If Application.WindowState = xlMaximized And Windows(1).zoom <> zoommaxdansapplication Then 'Maximised = affichage normal	
   If ThisWorkbook.Worksheets(1).Range("A1").Value = 1 Then 'si utilisateur est ou va sur la feuille 1, alors l'interrupteur prend 1 et la macro teste l'affichage, si l'user est sur une autre feuille, l'interrupteur prend valeur 0 est ne fait pas le test de zoom '<<<<<<<<<<<<<<< Spécifier emplacement de l'interrupteur <<<<<<<<<<<<<<<	
      CEL_SELECT_EN_COURS = ActiveCell.Address 'Définition à l'adresse de la cellule selectionné en cours par user au moment du zoom	
      ThisWorkbook.Worksheets(1).Range("A1:T50").Activate 'définit la zone de zoom '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
      ActiveWindow.zoom = True 'zoom sur selection	
      zoommaxdansapplication = Windows(1).zoom 'redéfinit la valeur de zoom pour mettre à jour la valeur zoommaxdansapplication  lors du prochain passage de boucle lors du test : If Application.WindowState = xlMaximized And Windows(1).Zoom <> zoommaxdansapplication Then	
      'Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre / Windows(1).Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%,...	
      ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
   End If	
End If	
'---------------------------------------------------------------------------------------------------------	
'II Si affichage minimisé et que le zoom correspond au zoom de départ minimale ou adéquate alors rien, sinon ZOOM	
If Application.WindowState = xlNormal And Windows(1).zoom <> zoommindansapplication Then 'Minimised = affichage réduit	
   If ThisWorkbook.Worksheets(1).Range("A1").Value = 1 Then 'si utilisateur est ou va sur la feuille 1, alors l'interrupteur prend 1 et la macro teste l'affichage, si l'user est sur une autre feuille, l'interrupteur prend valeur 0 est ne fait pas le test de zoom '<<<<<<<<<<<<<<< Spécifier emplacement de l'interrupteur <<<<<<<<<<<<<<<	
      CEL_SELECT_EN_COURS = ActiveCell.Address 'Définition à l'adresse de la cellule selectionné en cours par user au moment du zoom	
      ThisWorkbook.Worksheets(1).Range("A1:T50").Activate 'définit la zone de zoom '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
      ActiveWindow.zoom = True 'zoom sur selection	
      zoommindansapplication = Windows(1).zoom 'redéfinit la valeur de zoom pour mettre à jour la valeur zoommindansapplication  lors du prochain passage de boucle lors du test  : If Application.WindowState = xlNormal And Windows(1).Zoom <> zoommindansapplication Then	
      'Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre / Windows(1).Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%,...	
      ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
   End If	
End If	
'---------------------------------------------------------------------------------------------------------	
'III Si l'user touche à la taille de la fenetre principale, lancement de la macro zoom	
If Not Application.UsableWidth = zoomchangedansapplicationuser Then	
   zoom   '1 User à toucher à la taille de la fenetre lance auto la procédure d'adaptation du zoom	
   zoomchangedansapplicationuser = Application.UsableWidth   '2 Puis une fois la macro zoom terminée Redefinition Variable zoomchangedansapplicationuser	
End If	
'---------------------------------------------------------------------------------------------------------	
Loop 'et repart pour une nouvelle boucle si xfc1 est vide	
End Sub	
	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
	
'C. Correction exceptionnelle si utilisateur touche à la taille de la fenetre de l'application puis retour dans le point B.	
Sub zoom()	
Dim CEL_SELECT_EN_COURS As Variant 'Déclaration variable pour connaitre la cellule en cours que l'user à selectionné	
'---------------------------------------------------------------------------------------------------------	
On Error Resume Next 'process de gestion d'erreur, si erreur passe la ligne sans arrêter macro	
'---------------------------------------------------------------------------------------------------------	
DoEvents 'ligne de raffraichissement, pour permettre à l'utilisateur de reprendre la main quand besoin d'utiliser excel, sinon excel continu à boucler à l'infinie sur le calcul de la cellule vide xfc1	
'---------------------------------------------------------------------------------------------------------	
'00. si utilisateur est ou va sur la feuille 1, alors l'interrupteur prend 1 et la macro teste l'affichage, si l'utilisateur est sur une autre feuille, l'interrupteur prend valeur 0 est ne fait pas le test de zoom	
If ThisWorkbook.Worksheets(1).Range("A1").Value = 1 Then	
CEL_SELECT_EN_COURS = ActiveCell.Address 'Définition à l'adresse de la cellule selectionné en cours par l'utilisateur au moment du zoom	
'---------------------------------------------------------------------------------------------------------	
   '1 si fenêtre en mode normal ou réduit alors zoom sur selection	
   If Application.WindowState = xlNormal Then 'Si fenêtre en format réduit agrandit zoom dans application	
      ThisWorkbook.Worksheets(1).Range("A1:T50").Activate  'définit la zone de zoom à la selection '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
      ActiveWindow.zoom = True 'zoom sur selection	
      zoommindansapplication = Windows(1).zoom 'redifinit la variable ZOOM zoommindansapplication	
      'Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre / Windows(1).Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%,...	
      ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
'---------------------------------------------------------------------------------------------------------	
   Else	
'---------------------------------------------------------------------------------------------------------	
      '2 si fenêtre en mode maximisé alors zoom sur selection	
      If Application.WindowState = xlMaximized Then 'si fenêtre en format maximisé alors zoom application	
         ThisWorkbook.Worksheets(1).Range("A1:T50").Activate  'définit la zone de zoom à la selection '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
         ActiveWindow.zoom = True 'zoom sur selection	
         zoommaxdansapplication = Windows(1).zoom 'redifinit la variable ZOOM zoommaxdansapplication	
         'Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre / Windows(1).Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%,...	
          ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
      End If	
   End If	
End If	
End Sub	

5. Masterclass : Utilisation de l'événement classeur : Workbook_open
:?: En utilisant les événements, il est possible de faire ajuster aussi le zoom, ici sera expliqué l'événement Workbook_open.
A chaque ouverture du classeur, Excel va parcourir cet événement.

1 Il faut d'abord lui définir d'ouvrir sur la feuille à zoomer pour éviter un bug.
2 Puis définir définir la zone de zoom.
3 Et enfin zoomer.
'A Procédure d'événement macro en lancement à l'ouverture du classeur si modification affichage de l'application	
Private Sub Workbook_Open()	
'1 définition des variable zooms	
ThisWorkbook.Worksheets(1).Select 'Selection la feuille où se trouve le tableau pour éviter un bug '<< Spécifier la feuille <<
ThisWorkbook.Worksheets(1).Range("A1:T50").Activate  'définit la zone de zoom pour variables zoom...dansapplication '<< Spécifier zone de zoom <<	
ActiveWindow.zoom = True 'zoom sur selection	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'OPTION ouverture / A activer si vous ne voulez pas qu'à l'ouverture la plage soit selectionné '<< OPTION <<	
'ThisWorkbook.ActiveSheet.Range("A1").Select 'A l'ouverture du classeur, le curseur cellule se trouve sur la cellule A1 de la feuille active et évite que l'ensemble du tableau ne soit selectionné	
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
'2 suite à l'ouverture du fichier, lancement de la macro "Lancement_opensub" après 1 seconde d'attente, géré par le chrono de la macro "Lancement_opensub" (afin d'éviter un bug rendant inactives certaines fonctions Excel)	
Lancement_opensub 'lance le chrono d'attente d'1 seconde et de cette macro chrono, lancera la gestion du zoom d'affichage ^^	
End Sub	
8) En gros le jeu d'écriture se fait sur 3 lignes de code, qui servira de base dans toutes les macros pour zoomer :
ThisWorkbook.Worksheets(1).Select << Spécifier la feuille <<
ThisWorkbook.Worksheets(1).Range("A1:T50").Activate << Spécifier zone de zoom <<
ActiveWindow.zoom = True 'activation zoom sur selection

6. Masterclass : Utilisation de l'événement classeur : Workbook_WindowResize
:?: En utilisant les événements, il est possible de faire ajuster aussi le zoom, ici sera expliqué l'événement Workbook_WindowResize.
Qui sert non pas à gérer les événements de redimensionnement de la taille de la fenêtre de l'application Excel dans son ensemble :? , Mais ::o sert à gérer les redimensionnement de la taille de la sous-fenêtre classeur DANS l'application Excel. :wink:

1 Etant donné que pour chaque zoom de plage, le zoom sélectionne l'ensemble des cellules de la plage, il est nécessaire avant de récupérer l'adresse où se trouve l'emplacement de la dernière cellule sélectionnée.
2 Puis définir définir la zone de zoom.
3 Et zoomer.
4 Redéfinir les variables de taille de zoom si vous utiliser une boucle de contrôle infinie
5 Étant donné qu'à ce moment toute la plage A1:T50 est sélectionnée, on resélectionne l'adresse de cellule du point 1.
Code se trouvant dans le module Thisworkbook
'CE Procédure événement de ZOOM si sous fenêtre interne dans application Excel redimenssionné	
Private Sub Workbook_WindowResize(ByVal Wn As Window)	
Dim CEL_SELECT_EN_COURS As Variant 'Déclaration variable pour connaitre la cellule en cours que l'utilisateur à selectionné pour garder le curseur à cet emplacement	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
DoEvents 'ligne de raffraichissement, pour permettre à l'utilisateur de reprendre la main quand besoin d'utiliser excel, sinon excel continu à boucler à l'infinie sur le calcul de la cellule vide xfc1	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
On Error Resume Next 'Process de gestion d'erreur, si erreur passe la ligne sans arrêter macro	
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
'1 si utilisateur sur feuille 1 et si fenêtre en mode normal ou réduit alors zoom sur selection tableau	
If ThisWorkbook.Worksheets(1).Range("A1").Value = 1 Then 'si utilisateur est ou va sur la feuille 1, alors l'interrupteur prend 1 et la macro teste l'affichage, si l'user est sur une autre feuille, l'interrupteur prend valeur 0 est ne fait pas le test de zoom '<<<<<<<<<<<<<<< Spécifier l'emplacement de l'interrupteur <<<<<<<<<<<<<<<	
CEL_SELECT_EN_COURS = ActiveCell.Address 'Définition à l'adresse de la cellule selectionné en cours par lutilisateur au moment du zoom	
'----------------------------------------------------------------------------------------------------------------------------	
   If Application.WindowState = xlNormal Then 'Si fenêtre en format réduit agrandit zoom dans application	
      ThisWorkbook.Worksheets(1).Range("A1:T50").Activate 'définit la zone de zoom à la selection '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
      '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
      ActiveWindow.zoom = True 'zoom sur selection	
      zoommindansapplication = Windows(1).zoom 'redifinit la variable ZOOM zoommindansapplication	
      'Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre / .Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%,...	
      ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
   Else	
      If Application.WindowState = xlMaximized Then 'si fenêtre en format maximisé alors zoom application à 80%	
      ThisWorkbook.Worksheets(1).Range("A1:T50").Activate 'définit la zone de zoom à la selection '<<<<<<<<<<<<<<< Spécifier zone de zoom <<<<<<<<<<<<<<<	
      '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
      ActiveWindow.zoom = True 'zoom sur selection	
      zoommaxdansapplication = Windows(1).zoom 'redifinit la variable ZOOM zoommaxdansapplication	
      'Windows(1).Zoom => windows(1) pour 1 donne objet en cours quand macro démarre / .Zoom donne la valeur du zoom dans l'application, 100 pour normal, 200 pour zoom 200%,...	
      ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
      End If	
   End If	
'----------------------------------------------------------------------------------------------------------------------------	
End If	
End Sub	

7. Masterclass : Utilisation de l'événement feuille : Worksheet_Activate
:?: En utilisant les événements de feuille, il est possible de faire ajuster aussi le zoom, ici sera expliqué l'événement Worksheet_Activate.
A chaque fois que l'utilisateur activera la feuille en appuyant sur l'onglet feuille, cet événement se lancera, dans la plupart des cas après être sorti et re-rentré dans la dite feuille.

Le code est plus simple, puisque le point 1 étant déjà réalisé, il ne reste que 2 étapes à coder :
1 Puis définir définir la zone de zoom.
2 Et zoomer.
Option, il est possible aussi d'ajouter les lignes de codes pour ne pas rester sur une selection de l'ensemble de la plage.
Private Sub Worksheet_Activate()
'Dim CEL_SELECT_EN_COURS As Variant 'Déclaration variable pour connaitre la cellule en cours que l'utilisateur à selectionné pour garder le curseur à cet emplacement
'CEL_SELECT_EN_COURS = ActiveCell.Address 'Définition à l'adresse de la cellule selectionné en cours par lutilisateur au moment du zoom
'1 quand user va sur la feuille 2, ZOOM sur la plage
ThisWorkbook.Worksheets(2).Range("A1:V20").Activate '<< Spécifier zone de zoom <<
ActiveWindow.zoom = True 'activation zoom sur selection
'ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente	
End Sub
:!: Par contre, si entrée dans l'onglet par lien hypertexte, un bug se produit, il faut d'abord forcé le code à bien activer la feuille pour réaliser le zoom.
1 Forcer l'activation de la feuille
2 Définir le zoom
3 Et zoom
With ThisWorkbook.Worksheets(1) 'Forcer l'activation de la feuille
      .Visible = xlSheetVisible
      .Activate
      .Range("A6").Select
End With
ThisWorkbook.Worksheets(1).Range("A1:R6").Activate  'définit la zone de zoom pour variables zoom
ActiveWindow.Zoom = True 'zoom sur selection

8. Masterclass : Utilisation de l'événement feuille : Worksheet_BeforeDoubleClick
:?: En utilisant les événements de feuille, il est possible de faire ajuster aussi le zoom, ici sera expliqué l'événement Worksheet_BeforeDoubleClick.
Le principe est d'avoir par raccourci double-clic dans une plage, de réajuster le zoom à la demande par ce double-clic.

1 Tout d'abord on définit la plage du double clic, où l'action doit avoir lieu.
2 Puis définir définir la zone de zoom.
3 Et zoomer.
Option, il est possible aussi d'ajouter les lignes de codes pour ne pas rester sur une selection de l'ensemble de la plage.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Dim CEL_SELECT_EN_COURS As Variant 'Déclaration variable pour connaitre la cellule en cours que l'utilisateur à sélectionné pour garder le curseur à cet emplacement
'CEL_SELECT_EN_COURS = ActiveCell.Address 'Définition à l'adresse de la cellule sélectionné en cours par l'utilisateur au moment du zoom
If Not Intersect(Target, ActiveSheet.Range("A1:T50")) Is Nothing Then 'Si l'utilisateur n'a pas cliquer en dehors de la plage tableau, alors zoom
ActiveSheet.Range("A1:T50").Activate '<< Spécifier zone de zoom <<
ActiveWindow.zoom = True 'activation zoom sur selection
'ThisWorkbook.ActiveSheet.Range(CEL_SELECT_EN_COURS).Select  'Pour ne pas rester sur la zone zoomée, retour à la cellule selectionnée précédente   
End If
End Sub

Et voilà quelques exemples de codage d'ajustement auto du zoom par V.B.A. :D :wink:
1 membre du forum aime ce message.
"One and yet a mass"
COHENNY Tristan - Projet MYRMIDON
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message