XL 2016 Figer la position de la fenêtre de commentaire dans une zone de la feuille de calcul visible.

babast_s

XLDnaute Nouveau
Bonjour à tous,

Je cherche à délimiter une zone sur ma feuille de calcul pour afficher les images que j'intègre dans les commentaires des diverses cellules.
Le souci c'est lors de l'intégration de l'image, la dimension de la fenêtre de commentaire reste, mais pas sa position sur la feuille de calcul.
De ce fait les trois quart de l'affichage des image se font or de l’écran, il faut donc se déplacer sur la feuille de calcule alors que je n'ai pas besoin de le faire.
Il existe peut être une autre solution, mais or de ma connaissance pour le moment.

Merci pour votre aide, bonne journée, babast.

exemple.jpg
 

job75

XLDnaute Barbatruc
Bah d'après le post #1 babast_s est allergique au défilement (Scroll).

Alors pour lui éviter toute tentation j'ai mis dans le ThisWorkbook de ce fichier (2) :
VB:
Private Sub Workbook_Open()
Feuil1.ScrollArea = "A1:T39" 'interdit le défilement
End Sub
Les barres de défilement étant alors inutiles je les ai masquées via les Options avancées.
 

Pièces jointes

  • Modèles babast(2).xlsm
    329.7 KB · Affichages: 12

patricktoulon

XLDnaute Barbatruc
bonjour a tous
ouaisp!!! ben testez ce fichier
pas la peine de sélectionner ou rightclick utilisez le normalement
surveillance silencieuse déclenchée par un event commandbars qui est sans arrêt en mouvement
et qui consomme peau de chagrin par rapport a un do loop sur timer
mettez le même code dans les feuilles concernées quelque soit le scrollvertical le commentaire est toujours a 15 point du visiblerange.top
ca n'est pas bloquant puisque ca tourne en interne
donc on l'utilise comme il s'utilise normalement
le commentaire apparaît au survol et est placé comme c'est voulu
;)
 

Pièces jointes

  • Modèles babast. v pat xlsm.xlsm
    333.4 KB · Affichages: 16

job75

XLDnaute Barbatruc
Bonjour patricktoulon, le forum,

Là je découvre totalement ce genre de boucle.

Juste une question : pourquoi utiliser le contrôle 2040 (Partager le classeur) ? Pourrait-on utiliser une CommandBar personnalisée ?

A+
 

patricktoulon

XLDnaute Barbatruc
re
oui ça fonctionne avec les barres (non builder)
mais le code de création de la bar doit être dans un module ça plante quand le code est dans le thisworkbook c'est dommage ça éparpille le code
 

Pièces jointes

  • Modèles babast. v 2pat xlsm.xlsm
    335 KB · Affichages: 7

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Impressionnant ce système !

Par contre je ne comprends pas du tout:
1 - Ce qui déclenche l'évènement Cmbrs_OnUpdate() qui semble se déclencher toutes les 1 secondes.

2 - Ni quoi et pourquoi ça:
VB:
Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled

3 - Ni pourquoi les modifications de Cmbrs en changement de feuille (ça fonctionne SANS)
Code:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Set Feuille = Sh
    Set Cmbrs = Application.CommandBars
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Set Cmbrs = Nothing
End Sub

4 - Ni pourquoi les commentaires commencent toujours par s'afficher dans leur position initiale avant de prendre la position VisibleRange.Top + 15 sachant que la fonction ReplaceComment de leur repositionnement a déjà été exécutée plusieurs fois.

En fait j'y comprends pas grand chose :)
 

patricktoulon

XLDnaute Barbatruc
re
bonjour @Dudu2

Par contre je ne comprends pas du tout:
1 - Ce qui déclenche l'évènement Cmbrs_OnUpdate() qui semble se déclencher toutes les 1 secondes.
cmbrs c'est la totale des commandbarS la collection!!!!
sa gestion a l'origine n'est pas implémentée dans la liste des events dans le module thisworkbook
donc je crée la gestion de ses evenement avec
VB:
Public WithEvents Cmbrs As CommandBars     'creation de l'object commandbars events
démonstration
comme tu peux le voir dans la capture ci dessous si je choisi "cmbrs" et bien dans la combo des events ,j'ai l’implémentation en l’occurrence le seul events dispo c'est le "onupdate"
demo4.gif


parti de la je manipule son evenement onupdate
dans le quel je met le .enabled d' un control d'une des barre a son contraire a chaque fois
avec
VB:
Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled


3 - Ni pourquoi les modifications de Cmbrs en changement de feuille (ça fonctionne SANS)
non c'est
VB:
Private Sub Worksheet_Activate()
Set ThisWorkbook.feuille = ActiveSheet
Set ThisWorkbook.Cmbrs = Application.CommandBars
End Sub

Private Sub Worksheet_Deactivate()
Set ThisWorkbook.Cmbrs = Nothing
End Sub
a noter que cmbrs et feuille sont public et donc manipulable dans tous le classeur
A CONDITION!!! DE FAIRE PRECEDER "ThisWorkbook" COMME CI DESSUS !!!!!!!!!!!!
en effet thisworkbook est un module classe (même punition que les userforms a patricktoulon) ;) ;) :p :p

quand tu modifie l'emplacement d'un commentaire par vba (et non manuellement) il se pose d'abords a l'emplacement par défaut c'est comme ca on y peut rien

voila j’espère t'avoir un minimum éclairé

je tiens a préciser tout de même une faille a cette astuce
si un userform est affiché en modal la fonction est inopérante et c'est normal car le userform modal est bloquant
cela dit
ca reste une astuce sympa pour travailler sur sheets sans devoir recourrir a des app.ontime (trop long(1seconde min)) ou autre timer gourmand en ressources
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour Job,
Ok, je vais réfléchir à tout ça
Je voulais signaler que ce code SEUL (sans les codes évènements sur Worksheets) suffit au fonctionnement.
Donc on ne passe pas initialement dans Cmbrs_OnUpdate() pour le ... Enabled = .Not ...Enabled.
VB:
Public WithEvents Cmbrs As CommandBars     'Creation de l'Object Commandbars Events

Private Sub Workbook_Open()
    Set Cmbrs = Application.CommandBars
End Sub

'Évènement Commandbars
Private Sub Cmbrs_OnUpdate()
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled
    ReplaceComment
End Sub

Sub ReplaceComment()
    Dim Com As Comment
    For Each Com In ActiveSheet.Comments
        Com.Shape.Top = ActiveWindow.VisibleRange.Top + 15
    Next
End Sub
 

babast_s

XLDnaute Nouveau
Bonjour à tous,
Un grand merci à vous tous, car je suis novice et vous m'apporter une grande aide, je mets hélas beaucoup de temps à déchiffrer les codes... et je m'en excuse d'avance.

@patricktoulon, Merci beaucoup, ton code fonctionne lors de l'intégration dans mon ficher même avec la quarantaine de feuille et le code d’erreur à disparus par rapport à ta première version. Un grand merci.

@job75, Merci beaucoup, l'idée de tout bloque, me plait énormément, car je partage ce ficher avec beaucoup de personnes, mets je viens de faire l'essais sur le ficher, mais hélas la quarantaines de feuilles dans le fichier dois l’empêcher de fonctionner ou alors j'ai raté quelque chose, du coup il faut que je puisse faire individuellement sur chaque feuille car elles ne sont pas identique, je suis preneur de tes idées. Encore Merci.
 

Dudu2

XLDnaute Barbatruc
@patrick,
Merci pour tes explications.
Je ne connaissais rien à ce WithEvents et j'ai appris un sacré truc !
je manipule son evenement onupdate dans le quel je met le .enabled d' un control d'une des barre a son contraire a chaque fois
Ok alors si chaque fois que tu changes cette valeur ça déclenche l'évènement qui lui-même change cette valeur, on devrait partir dans une boucle infernale. Je ne comprends pas ce qui la temporise. A moins qu'Excel ne scanne les modifs des CommandBars que toutes les n fractions de temps (1 seconde ?)
A CONDITION!!! DE FAIRE PRECEDER "ThisWorkbook" COMME CI DESSUS !!!!!!!!!!!!
en effet thisworkbook est un module classe
Ok je ne connaissais pas cette astuce pour utiliser publiquement des variables d'un module de classe Workbook ou Worksheet ou autre d'ailleurs.
 

patricktoulon

XLDnaute Barbatruc
Bonjour Job,
Ok, je vais réfléchir à tout ça
Je voulais signaler que ce code SEUL (sans les codes évènements sur Worksheets) suffit au fonctionnement.
Donc on ne passe pas initialement dans Cmbrs_OnUpdate() pour le ... Enabled = .Not ...Enabled.
VB:
Public WithEvents Cmbrs As CommandBars     'Creation de l'Object Commandbars Events

Private Sub Workbook_Open()
    Set Cmbrs = Application.CommandBars
End Sub

'Évènement Commandbars
Private Sub Cmbrs_OnUpdate()
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled
    ReplaceComment
End Sub

Sub ReplaceComment()
    Dim Com As Comment
    For Each Com In ActiveSheet.Comments
        Com.Shape.Top = ActiveWindow.VisibleRange.Top + 15
    Next
End Sub

perso je préfère laisser l'option quel sheet bénéficie ou pas de cet agrément
met le en route et regarde la conso (compteur W7 ou performances dans la gestion des taches window
demonstration
sans le logiciel de capture d'animation je decolle pas des 1% au repos et 2/3% au move de la souris
demo4.gif
 

patricktoulon

XLDnaute Barbatruc
re
valeur, on devrait partir dans une boucle infernale. Je ne comprends pas ce qui la temporise. A moins qu'Excel ne scanne les modif des CommandBars que toutes les n fractions de temps (1 seconde ?)

elle est infernale oui mais en interne pas dans vba
ce qui la temporise c'est justement tout le reste
bien évidemment plus tu aura des codes lourds et mal conncus plus la temporisation sera plus longue
cela dit il faut ramer beaucoup avec du code pourri pour la ralentir autant :p;)
d'ailleurs si tu savais le nombre de boucle interne tournant a gogo même quand tu est devant une feuille sans rien faire ;) ;) ;) ;)
 

Dudu2

XLDnaute Barbatruc
En effet, la CPU est peu sollicitée.
Pour le traitement des évènements Worksheet (Activate Deactivate) tu peux aussi les ramener dans le code du Workbook pour tout avoir regroupé, fut-ce en ayant une liste des noms des feuilles candidates.
Par contre le point 4 reste inexpliqué
4 - Ni pourquoi les commentaires commencent toujours par s'afficher dans leur position initiale avant de prendre la position VisibleRange.Top + 15 sachant que la fonction ReplaceComment de leur repositionnement a déjà été exécutée plusieurs fois.
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 450
Messages
2 109 731
Membres
110 553
dernier inscrit
loic55