Se débarasser d'un clignotement - macro

Salut !

Je dispose d'un fichier Excel dont toutes les feuilles sont protégées. Sur ces feuilles se trouvent des tableaux, dans lesquels certaines données peuvent être rentrée à l'aide de macros. Ainsi, ma macro a besoin de dé-protéger, puis re-protéger les feuilles en question. Comme mon fichier comporte beaucoup de feuilles, ça provoque un clignotement, lors de l'exécution de la macro, qui dure 1/3 voire 1/2 seconde et est très désagréable. Y a-t-il un moyen de faire autrement ?

J'ai créé un fichier pour l'exemple que je joins à ce post.

Merci d'avance !
Eldervand

27exemple.xlsm (38.58 Ko)

Bonjour,

Il faut mettre en début de module

Application.ScreenUpdating = False

Et en fin de module

Application.ScreenUpdating = True

En général cela suffit

A+

Top ! Merci beaucoup !!

Re-Salut !

L'usage de

Application.ScreenUpdating = False

Et de

Application.ScreenUpdating = True

A fonctionné pendant 2 ou 3 exécutions, puis a brutalement cessé de fonctionner. Sans avoir changé quoi que ce soit, je vois à nouveau Excel effectuer toutes les manipulations. Une idée du problème ?
Merci d'avance !

Salut,

Quand tu protèges les feuilles passes la propriété UserInterfaceOnly sur Vrai cela t'évitera de devoir déprotéger les feuilles à chaque fois

Lecture ici : Méthode Worksheet.Protect (Excel) | Microsoft Learn

Et prenons l'habitude de passer nos Objets sur Nothing en fin de traitement

Dim lstO as ListObject
Set lstO = Sheets("Feuil1").Range("Tabl1").ListObject
'...
'...
Set lstO = Nothing

De plus ceci

lstO.DataBodyrange.Rows.Delete ' // Attention ceci peut te renvoyer une erreur

Peut renvoyer une erreur si le DataBodyRange ne comporte pas de ligne

Ha oui et ça c'est la méthode de "J'ai pas trop envie de me casser la tête"

    On Error Resume Next
    Tl1.DataBodyRange.Rows.Delete

Merci pour les conseils ! Je vais essayer !

bonjour, il faut eviter ce "on error", donc vérifier s'il y a encore du contenu avec

if lstO.listrows.count then lstO.DataBodyrange.Delete

et je préfère Set lstO = Sheets("Feuil1").Listobjects("Tabl1"), je pense que cela ne fonctionne pas partout avec ce "range" et c'est plus court.

Re-salut !

J'ai essayé de protéger mes feuilles avec le code

feuil1.protect UserInterfaceOnly: = True 

Mais malheureusement mes macros se voient empêcher de créer des lignes de tableau.

Ais-je commis une erreur ?

Pour donner plus de précision, la macro que j'essaie d'exécuter ici est celle-ci :

 With LB1
        Set NewLine = .ListRows.Add
        I = NewLine.Index
        .DataBodyRange(I, 1) = Format(TimeUTC, "hh:mm")
        .DataBodyRange(I, 2) = OnDuty & " ON"
        .DataBodyRange(I, 3) = OnDuty
    End With

LB1 étant mon tableau

NewLine étant un listRow

I étant un Long

re,

With LB1
    .ListRows.Add.Range.Resize(, 3).value = Array(Format(timeutc, "hh:mm"), onduty & " ON", onduty)
End With

Re,

Merci pour ta réponse. A moins que je ne fasse quelque chose de faux, ton code ne change malheureusement rien chez moi. Excel ne laisse pas ma macro créer de ligne de tableau tant que la protection (avec UserInterfaceOnly = true) est activée.

re,

Sub test()
     With Sheets("feuil1").ListObjects("TABL1")
           .Parent.Unprotect
          .ListRows.Add.Range.Resize(, 3).Value = Array(Format(Now, "'hh:mm:ss"), Format(Now, "dd-mm-yy"), "texte .....")
          .Parent.Protect
     End With
End Sub
8exemple-9.xlsm (43.69 Ko)

Bonjour

@BsAlv toujours dans les dingueries

Sub test()
  With Sheets("feuil1")
    .Unprotect
    .ListObjects("TABL1").ListRows.Add.Range.Resize(, 3).Value = Array(Format(Now, "'hh:mm:ss"), Format(Now, "dd-mm-yy"), "texte .....")
    .Protect
  End With
End Sub

ou au pire

Sub test()
  With Sheets("feuil1")
    .Unprotect
    With .ListObjects("TABL1")
      .ListRows.Add.Range.Resize(, 3).Value = Array(Format(Now, "'hh:mm:ss"), Format(Now, "dd-mm-yy"), "texte .....")
    End With
    .Protect
  End With
End Sub

A+

bonjour BrunoM45, le fil,

ou comme ca

 With Sheets("feuil1")
          .Unprotect
          .ListObjects("TABL1").ListRows.Add.Range.Resize(, 3).Value = Array(Format(Now, "'hh:mm:ss"), Format(Now, "dd-mm-yy"), "texte .....")
          .Protect
     End With

Salut le fil,

feuil1.protect UserInterfaceOnly: = True

Qu'en dis Microsoft :

True pour protéger l'interface utilisateur, mais pas les macros. Si cet argument est omis, la protection s'applique à la fois aux macros et à l'interface utilisateur.

Donc en fait, ne bloque pas les procédure mais bloque l'interface utilisateur, donc impossible d'écrire dans un tableau dont la feuille est protégée, utilises unprotect comme dis plus haut.

Si tu as toujours des clignotement je ne saurais trop te conseiller de faire du pas à pas "F8" et de voir par où passe le déroulement du code. il se peut que tu ai des Select qui trainent par-ci, par-là.

Bonjour…

Traitement d’un Tableau structuré bien préparé (à ma façon) : Nom (ici TB), Formules, Formats, Protections

mon tableau

Avec une évènementielle (Feuille du Tableau) ‘doubleclic juste sous la dernière Date

Private Sub Worksheet_BeforeDoubleClick(ByVal R As Range, Cancel As Boolean)
  If R.Address = [TB].Item([TB].Rows.Count + 1, 1).Address Then Cancel = 1: R(1, 4).Value = Now
End Sub
14mon-tableau.xlsm (17.48 Ko)

Donc si je comprends bien ce que tu me dis, Jean-Paul, même en utilisant

feuil1.protect UserInterfaceOnly: = True

une macro ne sera pas capable de créer une ligne dans un tableau ?

Re,

Oui elle sera capable si tu utilises la propriété Unprotect en début de procédure, puis tu reprotèges à la fin de la procédure avec Protect

Mais du coup j'en reviens à mon problème original, qui est que l'utilisation de protect et unprotect provoque un clignotement désagréable lorsque ma macro est activée ! Car pour je ne sais quelle raison, l'utilisation de

Application.Screenupdating = False

Ne fonctionne qu'une ou deux fois avant de cesser purement et simplement de marcher.

Désoler de vous ennuyer avec tout ça

Bonjour Eldervand

Et sinon avec ce genre de code, ça donne quoi

Private Sub Insert_Click()
  Dim Indx As Long, Num As Integer
  Dim NewLine As ListRow
  Dim Lo As ListObject
  Dim TabLo() As String, TabSht() As String
  ' Tableau des feuilles
  TabSht = Split("Feuil1,Feuil2,Feuil3,Feuil4,Feuil5,Feuil6", ",")
  ' Tableau des TS
  TabLo = Split("Tabl1,Tabl2,Tabl3,Tabl4,Tabl5,Tabl6", ",")
  ' Pout chaque TS
  For Num = 0 To UBound(TabLo)
    ' Désactiver le rafraichissement écran
    Application.ScreenUpdating = False
    ' Définir le TS
    Set Lo = Sheets(TabSht(Num)).ListObjects(TabLo(Num))
    ' Enlever la protection
    Sheets(TabSht(Num)).Unprotect
    ' Avec le TS
    With Lo
      Set NewLine = .ListRows.Add
      Indx = NewLine.Index
      .DataBodyRange(Indx, 1) = "Ceci n'est pas un texte."
    End With
    ' Remettre la protection
    Sheets(TabSht(Num)).Protect
  Next Num
  Application.ScreenUpdating = True
End Sub

Chez moi ça ne "clignote" pas

A+

Rechercher des sujets similaires à "debarasser clignotement macro"