XL 2021 Masquer des colonnes plus rapidement qu'avec Selection.EntireColumn.Hidden = True

ESCOUGER2022

XLDnaute Nouveau
Bonjour,
En utilisant la méthode classique "Selection.EntireColumn.Hidden = True" dans une macro pour masquer une ou plusieurs colonnes le temps d'exécution est très long, de l'ordre d'une seconde par colonne.
Sauriez-vous me dire s'il est possible de programmer cela différemment de manière à réduire ce temps ?
J'ai essayé différentes possibilités proposées sur le net telles que "Worksheets("Sheet1").Columns("C").Hidden = True"
ou utiliser la propriété "Range.Hidden = True, mais le temps d'exécution n'est pas réduit.
Merci d'avance de vos réponses
 

job75

XLDnaute Barbatruc
Bonjour à tous,
En utilisant la méthode classique "Selection.EntireColumn.Hidden = True" dans une macro pour masquer une ou plusieurs colonnes le temps d'exécution est très long, de l'ordre d'une seconde par colonne.
Effectivement il suffit de ne pas sélectionner, cette macro est immédiate :
VB:
Sub Masquer()
Dim t, i
t = Timer
Application.ScreenUpdating = False
Columns.Hidden = False 'RAZ
For i = 2 To 1000 Step 2 '1 colonne sur 2
    Columns(i).Hidden = True
Next
MsgBox Timer - t
End Sub
A+
 

ESCOUGER2022

XLDnaute Nouveau
Merci à vous tous,
En appliquant vos différentes suggestions j'ai divisé le temps de traitement global de l'ensemble de mes procédures d'environ 50%.
C'est déjà super.
Après les vacances j'approndirai encore, car il doit encore rester quelques corrections à apporter deci delà.
Merci encore
 

bsalv

XLDnaute Occasionnel
chez moi, Masquer1 = 1.9 sec, Masquer2 = 0.12 sec donc 16 fois plus vite.
@job75, 0,8 sec amaai ...

Code:
Sub Masquer1()
     Dim t, i
     t = Timer
     Application.ScreenUpdating = False
     Columns.Hidden = False                  'RAZ
     For i = 2 To 16384 Step 2                '1 colonne sur 2
          Columns(i).Hidden = True
     Next
     MsgBox Timer - t
End Sub

Sub Masquer2()
     Dim t, i
     t = Timer
     Application.ScreenUpdating = False
     Columns.Hidden = False                  'RAZ
     For i = 2 To 16384 Step 2                '1 colonne sur 2
          s = s & "," & Cells(1, i).Address(0, 0)
          If Len(s) > 245 Then
               Range(Mid(s, 2)).EntireColumn.Hidden = True
               x = x + 1
               s = ""
          End If
     Next
     If Len(s) Then Range(Mid(s, 2)).EntireColumn.Hidden = True: x = x + 1
     MsgBox Timer - t & vbLf & x & " blocs"
End Sub
 

TooFatBoy

XLDnaute Barbatruc
chez moi, Masquer1 = 1.9 sec, Masquer2 = 0.12 sec donc 16 fois plus vite.
Tu dois être la seule personne au monde à avoir un PC encore plus lent que le mien. 🤣
Chez oim : Masquer1 = 1,24 s et Masquer2 = 0,11 s.

Mais ce qui est marrant, c'est ceci :
- Excel affiché à l'écran : Masquer1 = 1,24 s et Masquer2 = 0,11 s
- Excel minimisé dans la BdT : Masquer1 = 0,96 s et Masquer2 = 0,11 s
 

job75

XLDnaute Barbatruc
Bonjour le forum,

On peut aussi utiliser la méthode Union :
VB:
Sub Masquer2()
Dim t, decharge%, i%, P As Range
t = Timer
decharge = 100 'modifiable, chez moi 100 est l'optimum
Application.ScreenUpdating = False
Columns.Hidden = False 'RAZ
For i = 2 To 16384 Step 2 '1 colonne sur 2
    Set P = Union(IIf(P Is Nothing, Columns(i), P), Columns(i))
    If i Mod decharge = 0 Then P.Columns.Hidden = True: Set P = Nothing
Next
If Not P Is Nothing Then P.Columns.Hidden = True
MsgBox Timer - t
End Sub
Mais seconde ou dixième de seconde on est très très loin de la seconde par colonne du post #1.

A+
 

bsalv

XLDnaute Occasionnel
@job75, j'avais aussi essayer avec union, mais l'dée de decharger, c'est top !
Quand je regarde ma macro, je décharge 160 fois = chaque fois, 55 colonnes effectives = environ 110 colonnes brutes (1 sur 2) = même ordre de grandeur qu'avec union !!!

bon, maintenant on est à 0,12 à 0.20 sec pour 8.900 colonnes = 0,00002 sec par colonne, mieux est presque impossible.
 
Dernière édition:

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 173
dernier inscrit
Cerba95