Équivalent de "Application.ScreenUpdating = False (or = True)" (de VBA Excel) dans Calc-LibreOffice

Hello,
Je débute dans les macros de LibreOffice.
Tout en ayant cet étonnement de voir certaines de mes macros issues d’excel tourner correctement sous LibreOffice-calc, je suis coincé pour ce qui est de parvenir à trouver l’équivalent de “Application.ScreenUpdating” qui permet de réduire considérablement les temps de traitement des macros.
Comment empêche t-on l’affichage de se “mettre à jour” lors des macros tournant sous LibreOffice ?
Par avance, un grand merci si vous avez la réponse, car ça fait un p’tit moment que je farfouille en vain le net, là. :wink:

Il serait peut-être utile de connaître la version de LibreOffice utilisée et l’OS de l’ordinateur.

Voici une simple feuille qui lance une macro avec ou sans rafraîchissement. Elle fonctionne correctement chez moi. En est-il de même sur ta machine ?

ScreenRefresh.ods (23.9 KB)

Bonjour,
il faut chercher lockControllers().
Ces pages seront utiles je pense

Ajout : j’ai trouvé avec ces mots-clés “+équivalent +Application.ScreenUpdating +libreoffice”. Moteur de recherche : startpage.com

Bonjour Luclibo,

D’abord, je te remercie pour avoir répondu à cette question.
J’étais tombé sur le point deux que tu soulignes.
Mais pour ma part, je n’ai su avec réussite intégrer ces directives dans mon code sous LibreOffice et obtenir une absence effective du refraîchissement de l’affichage durant le déroulé de la macro. C’est comme si je n’avais rien modifié : aucune différence.
Saurais-tu - ou quelqu’un d’autre - m’expliquer comment adapter et intégrer ces lignes de codes en début et fin de macro, ce afin que le rafraîchement de l’écran soit effectivement mis en pause ? Car je constate bien qu’il doit y avoir une subtilité qui m’échappe. :slight_smile:
Merci beaucoup.

Bonjour,
Une fois encore un exemple issu directement des macros exemples du livre de Bernard Marcelly et Laurent Godard.
REM ***** BASIC *****

rem Code14-02.odt bibli : Progression Module1
Option Explicit

Sub IndiquerProgression()
Dim monDocument As Object, avance As Object, i As Long
monDocument = ThisComponent
monDocument.lockControllers
avance = monDocument.CurrentController.StatusIndicator
avance.start( “Attendez svp …”, 100 )
For i = 1 To 100
avance.Value = i
if i = 75 then avance.Text = “Patience, bientôt fini …”
Wait 80 ’ ceci simule un codage prenant un certain temps
Next
avance.Text = “Terminé !”
wait 800
avance.end
monDocument.unlockControllers
End Sub

Bon courage
Claude

Bonsoir Claude,
Je te remercie pour ce tronçon de code que je vais tâcher de transposer, avec succès espérons. :slight_smile:
Il faut avouer que pouvoir mettre en pause la mise à jour de l’affichage sur certaines macros, ce n’est pas un luxe mais bel et bien une nécessité. :wink:
Je reviendrai ici dire si je suis parvenu à mes fins.
Un bon week-end à toi !

Bonjour Claude, et tout le monde aussi,

Jai donc transposé comme suit les lignes proposées dans mes macros :

Sub macrototo ()

’ Masquage du déroulement de la macro
’ Ça, ça fonctionne sous excel
’ Application.ScreenUpdating = False
’ Adaptation équivalente sous LibreOffice
Dim monDocument As Object
monDocument = ThisComponent
monDocument.lockControllers

’ Là viennent les traitements de la macro, qui
'fonctionnent très bien sous LibreOffice, mais
'prennent un moment du seul fait de l’affichage à
'l’écran durant le déroulé
’ …

’ Annulation du “masquage” de la MAJ de
’ l’affichage durant le déroulé de la macro
’ La version opérationnelle sous excel
’ Application.ScreenUpdating = True
’ Adaptation équivalente sous LibreOffice
monDocument.unlockControllers

End Sub

Alors, le résultat donne que je n’obtient aucune mise en veille de la mise à jour de l’affichage durant le déroulé. Les macros fonctionnent, très bien, mais prennent un temps fou alors que l’écran montre en direct les opérations.

Où ai-je faux dans le code que je transpose ?

Et si cela devait fonctionner, quel(s) sont alors les autre(s) paramétrages qu’il seraient nécessaires de compléter et effectuer pour que ce soit opérationnel ?

Encore merci pour votre attention à cette évocation de petite épine dans le pied. :wink:
Bonne journée à vous !

Voici un autre exemple trouvé sur un site anglais que j’ai intégré à une macro basique de recherche de coordonnées d’une cellule fusionnée.
Le premier exemple fonctionne si tu as un seul document en cours.
J’ai testé celui-ci en pas à pas et tout est bien désactivé pendant l’attente.
Je t’ai aussi rajouté un module que j’avais réalisé pour un fichier contenant beaucoup de liens externes et beaucoup de calcul et qui désactive le recalcul automatique.
N’hésites pas à revenir si tu as des soucis.
Claude
gel écran.ods (9.9 KB)

Bonjour Claude,

Je te remercie, une fois de plus, de ce nouvel exemple. :slight_smile:

Voilà comme je l’ai intégré, tél quel à la lettre près, en début et en fin dans ma macro.

Il n’y a donc que le code principal de la macro qui n’est pas fourni, puisqu’il fonctionne et n’est pas le coeur de mon problème.

Comme précédemment, ma macro pond son résultat. Et comme précédemment, la mise à jour de l’affichage est effectué durant les traitements, d’où la durée allongée de ces derniers.
Et je ne parviens toujours pas à détecter et comprendre pourquoi ce qui fonctionne chez toi ne fonctionne pas chez moi.

J’en revient - encore, et j’en suis désolé - à mes deux point initiaux :

  • Est-ce que mon intégrations du code que tu me proposes est erronée ? Ai-je manqué quelque chose ? Et si oui à quel endroit ?

Par exemple, est-ce que “ThisComponent” est compris par Calc et interprété, ou bien y a t’il nécessité de remplacer “ThisComponent” par le nom de la macro (ici “macroToto”) ? Je pense, par à priori, qu’il n’y a rien à modifier, mais là j’en viens à douter et à me dire que ce n’est peut-être pas le cas.

Ou est-ce qu’il faut que je place, comme dans ton code, “wait 800” en début - ou en fin ? - du code des mes traitements, ou ce n’est point nécessaire ? (je n’ai pas procédé à cet ajout. Peut-être est-ce là l’élément nécessaire qui me manquerait ?).

  • Si ce n’est pas le code qui pose problème, alors peut-être y a t’il un paramètre particulier à définir, quelque part, dans l’environnement de travail de Calc-LibreOffice, afin que cela fonctionne comme attendu ?
Sub macroToto()
'
' macroToto Macro
'
' Masquage du déroulement
' de la macro (excel : fonctionne)
'    Application.ScreenUpdating = False
' Equivalent pour LibreOffice,
' intégré selon le dernier modèle proposé
' (non opérationnel) :
Dim monDocument As Object, avance As Object, i As Long
monDocument = ThisComponent
monDocument.lockControllers
With ThisComponent
        .CurrentController.Frame.ContainerWindow.Enable = False
        If Not .isActionLocked Then .AddActionLock
        If Not .hasControllersLocked Then .lockControllers
End With
'
' ...
'
' --> Là vient le code de ma macro.
'      Cette dernière fonctionne.
'     ( Le résultat est cependant long à venir
'     s'il y a mise-à-jour de l'affichage )
'
' ...
'
' Annulation du masquage du déroulement
' de la macro (excel : fonctionne)
'    Application.ScreenUpdating = True
' Equivalent pour LibreOffice,
' intégré selon le dernier modèle proposé
' (non opérationnel) :
With ThisComponent
        If .hasControllersLocked Then .unlockControllers
        If .isActionLocked Then .removeActionLock
        .CurrentController.Frame.ContainerWindow.Enable = True
End With
'
End Sub

Merci pour l’attention que tu voudras bien apporter à ma question en suspens. :wink:

Bonjour,
Je ne peux pas tester pour l’instant mais je peux répondre à tes deux questions.
ThisComponent désigne le document en cours, celui qui comprend la macro
Le Wait 800 est juste une attente, donc inutile dans ton cas.
Dès que je peux je reprends des tests pour essayer de voir ce qui pourrait bloquer, en espérant que quelqu’un d’autre trouve une solution à ton problème avant toi ou moi.
Claude

Bonsoir Claude, Steph1,

Tout d’abord, je vous remercie ici encore de bien avoir voulu ne pas lâcher l’affaire. Vraiment, merci à vous.

Bien, j’ai compris ce qui ce passe…

D’abord, un élément de réponse pour toi, Steph1.
La version récente de LO que j’ai installé est la 7.5.7.1 en X86_64 pour un Win10, donc ,dans un état up to date. Mais là n’était pas le soucis, en fait.

En fait, ton script - que j’ai transposé, en créant un cellule complétée par 0 ou 1, et qui permet donc d’empêcher, ou pas, la maj de l’affichage - a illuminé ma faible lanterne et permis la mise en relief de mon incompréhension du phénomène.

Je m’explique, et d’avance vous présente un Mea Culpa, pour une erreur dûe à ma profonde méconnaissance de LibreOffice et de son univers macro.

En fait, sous excel et sans maj de l’affichage, la macro tourne en 4 seconde, à un iota près (je viens de tester juste avant en chronométrant tout cela).

La verdion LO pour laquelle j’avais transposé dès le départ les équivalents destinés à empêcher la maj de l’affichage produisaient au lancement un effet où je constatais des lignes qui changeaient de couleurs (une impression de maj d’affichage, donc, que je ne constatais pas du tout sous excel) et le délais de réalisation tenait en environ … 23 secondes…
Cela me semblait donc fort long, par comparaison avec excel, et j’avais ainsi l’impression que la maj de l’affichage n’était pas interrompue.

Le script de Steph1 m’a permi d’identifer qu’en fait, en alternant le boléen via la cellule dédiée, il apparaissait un résultat qui n’a pas manqué de me surprendre : une “version” de la macro AVEC maj de l’affichage, et qui elle prend … une minute et 43 secondes pour produire un résultat identique !

En fait - je suis désolé de devoir ici l’avouer. Je me flagèle ! - l’interruption de l’affichage était bel et bien effectif, ce avant même que je poste ici mon problème !
J’ai été trompé parce que mes yeux voyaient à l’écran quelques changements (oui, certe, mais considérablement moindres que lorsqu’il y a une maj de l’affichage effectif) et des temps de traitements qui étaient donc plus de cinq fois plus élevés que via excel !

Et je n’ai su imaginer cette option de traitements considérablement plus longs sous LO, dès le départ, ce au constat de mon test initial, car cela dépassait mon entendement !

Pardon. J’apprends. Et merci, merci beaucoup de l’attention que vous avez bien voulu apporter à mon “faux” soucis.

Je me repends, comme un modeste “Petit Scarabée” (cf. la série télé “Kung-fu”)
:wink:

Je vous souhaite à présent une bonne continuation ! :slight_smile: En espérant que vous ne m’en voulez pas trop de ma méprise de béotien.

1 Like

L’essentiel c’est de trouver une solution. Inutile de te “flagéler” ! Nous sommes tous passés par là. Et je te garantis que moi j’y traîne toujours “par là”!; C’est pour cela qu’il y a des forums d’entraide.
Claude