Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

événement lors du changement de largeur d'une colonne

6 réponses
Avatar
Jean-Claude
(Excel 2003)

Bonjour,
en VBA, existe-t-il un événement qui permette de détecter le changement de
largeur d'une colonne ?
Mon but est d'avoir un classeur dans lequel les colonnes A à H aient, au
total, une largeur fixée. Ainsi, si j'arrive à détecter le changement de
largeur d'une colonne, je peux recalculer les autres largeurs pour rester
sur le total fixé.

Il ne s'agit pas de verrouiller les colonnes (le pb général est un peu plus
compliqué, mais je le simplifie pour cette question). Ou une autre manière
que par les événements ?
J'ai cherché sur internet et dans l'aide Excel, mais en vain...

Merci bien.
Jean-Claude

6 réponses

Avatar
MichD
Bonjour Jean-Claude,

Il n'existe aucun événement qui fait précisément ce que tu désires, mais
tu peux utiliser l'une ou l'autre ou les 2 procédures suivantes pour vérifier que la largeur
des colonnes n'excède pas celle déterminée par la valeur de la constante.

Tu insères le code dans le module Feuille où l'action se déroule.

'Dans le haut du module
Const LargeurDesColonnes = 400
'-------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("A1:H1").Width > LargeurDesColonnes Then
'procédure de redimensionnement des colonnes
End If

End Sub

'-------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Range("A1:H1").Width > LargeurDesColonnes Then
'procédure de redimensionnement des colonnes
End If

End Sub
'-------------------------------------


MichD
--------------------------------------------
"Jean-Claude" a écrit dans le message de groupe de discussion : 4e4a5059$0$18778$

(Excel 2003)

Bonjour,
en VBA, existe-t-il un événement qui permette de détecter le changement de
largeur d'une colonne ?
Mon but est d'avoir un classeur dans lequel les colonnes A à H aient, au
total, une largeur fixée. Ainsi, si j'arrive à détecter le changement de
largeur d'une colonne, je peux recalculer les autres largeurs pour rester
sur le total fixé.

Il ne s'agit pas de verrouiller les colonnes (le pb général est un peu plus
compliqué, mais je le simplifie pour cette question). Ou une autre manière
que par les événements ?
J'ai cherché sur internet et dans l'aide Excel, mais en vain...

Merci bien.
Jean-Claude
Avatar
Jean-Claude
Merci,
j'avais déjà essayé cette solution, mais elle n'est valable que si on change
la sélection ou si on modifie une cellule.
Si je me contente de changer la largeur d'une colonne, cela ne déclenche pas
ces 2 événements.
Ou peut-être gérer un timer pour vérifier les largeurs de colonnes toutes
les 1/2 seconde ?

Pour être plus précis, je cherche à transformer automatiquement le contenu
d'un classeur en fond d'écran (avec adresses, mails, téléphones de
correspondants habituels et autres infos) de la manière suivante :
- utiliser le CopyPicture pour générer une image de la taille de l'écran (je
sais faire)
- la sauvegarder sous forme d'un fichier bmp (je sais faire)
- gérer la bordure de 1 pixel générée à tort (je sais faire)
- la mettre en fond d'écran (je sais faire)
Mais l'idéal est que la zone du CopyPicture ait la même taille que l'écran
(je sais gérer les tailles points/pixels).
Donc je cherche, lorsqu'on change la taille d'une colonne, à caler la
dernière colonne sur la bonne taille.

Jean-Claude
Avatar
MichD
Il n'existe aucune procédure événementielle qui réagit à la modification d'une largeur de colonne.

Cependant, tu peux créer un processus sans fin qui vérifie à chaque x secondes la largeur totale
d'une plage de cellule. Pour ce faire, emploie la méthode OnTime de l'objet Application

Par exemple, tu utilises l'événement "Workbook_Open" dans le ThisWorkbook pour lancer la
procédure Test qui à son tour va lancer la procédure "Largeur_Colonne". Cela va former une
boucle qui va s'exécuter dès l'ouverture du fichier jusqu'à la fermeture de ce dernier...

Tu as un exemple complet de la méthode sur le site internet de Chip Pearson
http://www.cpearson.com/excel/OnTime.aspx

À mettre dans un module standard :

'----------------------------
Sub test()
Application.OnTime Now + (TimeValue("00:00:01") / 2), "Largeur_Colonne"
End Sub

'------------------------------------
Sub Largeur_Colonne()
'Code de vérification de la largeur des cellules
Call Test
End Sub
'------------------------------------

MichD
--------------------------------------------
"Jean-Claude" a écrit dans le message de groupe de discussion : 4e4a93d6$0$30781$

Merci,
j'avais déjà essayé cette solution, mais elle n'est valable que si on change
la sélection ou si on modifie une cellule.
Si je me contente de changer la largeur d'une colonne, cela ne déclenche pas
ces 2 événements.
Ou peut-être gérer un timer pour vérifier les largeurs de colonnes toutes
les 1/2 seconde ?

Pour être plus précis, je cherche à transformer automatiquement le contenu
d'un classeur en fond d'écran (avec adresses, mails, téléphones de
correspondants habituels et autres infos) de la manière suivante :
- utiliser le CopyPicture pour générer une image de la taille de l'écran (je
sais faire)
- la sauvegarder sous forme d'un fichier bmp (je sais faire)
- gérer la bordure de 1 pixel générée à tort (je sais faire)
- la mettre en fond d'écran (je sais faire)
Mais l'idéal est que la zone du CopyPicture ait la même taille que l'écran
(je sais gérer les tailles points/pixels).
Donc je cherche, lorsqu'on change la taille d'une colonne, à caler la
dernière colonne sur la bonne taille.

Jean-Claude
Avatar
MichD
Une autre approche :

Tu appelles cette procédure avec l'événement "Workbook_open" dans le Thisworkbook

Dans le haut du module standard, déclaration de la variable
Dim Arrêt As Boolean
'-------------------------
Sub Largeur_Colonne()
Dim T As Double
T = Timer + 1 / 2

Do While Timer <= T
DoEvents
If Arrêt = True then Exit sub
' Appel du code largeur des cellules
Loop
End Sub
'------------------------------
Sub Largeur_Cellules()
'ton code
End Sub
'-------------------------------

Et tu utilises la procédure événementielle suivante du ThisWorkbook
pour arrêter l'exécution de la procédure et fermer le classeur

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Arrêt = True
End Sub
'-------------------------


MichD
--------------------------------------------
"Jean-Claude" a écrit dans le message de groupe de discussion : 4e4a93d6$0$30781$

Merci,
j'avais déjà essayé cette solution, mais elle n'est valable que si on change
la sélection ou si on modifie une cellule.
Si je me contente de changer la largeur d'une colonne, cela ne déclenche pas
ces 2 événements.
Ou peut-être gérer un timer pour vérifier les largeurs de colonnes toutes
les 1/2 seconde ?

Pour être plus précis, je cherche à transformer automatiquement le contenu
d'un classeur en fond d'écran (avec adresses, mails, téléphones de
correspondants habituels et autres infos) de la manière suivante :
- utiliser le CopyPicture pour générer une image de la taille de l'écran (je
sais faire)
- la sauvegarder sous forme d'un fichier bmp (je sais faire)
- gérer la bordure de 1 pixel générée à tort (je sais faire)
- la mettre en fond d'écran (je sais faire)
Mais l'idéal est que la zone du CopyPicture ait la même taille que l'écran
(je sais gérer les tailles points/pixels).
Donc je cherche, lorsqu'on change la taille d'une colonne, à caler la
dernière colonne sur la bonne taille.

Jean-Claude
Avatar
Jean-Claude
Merci bien pour ces précisions, cela va m'éviter de chercher :-))
Jean-Claude
Avatar
MichD
Cette section devrait plutôt se lire comme suit pour exécuter la procédure à chaque .5 seconde

'---------------------------------
Sub Largeur_Colonne()
Dim T As Double

Do While Arrêt = False
T = Timer + 1 / 2
Do While Timer <= T
DoEvents
If Arrêt = True Then Exit Sub
Loop
' Appel du code largeur des cellules
Call Largeur_Cellules
Loop
End Sub
'---------------------------------


MichD
--------------------------------------------