Largeur de colonnes non consécutives

Bonjour à tous,

Une petite question que je me pose : je veux que la taille d'une colonne sur 2 (ex colonne A, C, E, etc ...) jusqu'à la dernière (la 16384 ème) soit égale à 3
Voici ce que j'ai écrit

Sub taille()

Application.ScreenUpdating = False
der = Cells(1, Columns.Count).End(xlToRight).Column
For I = 1 To der Step 2
    Columns(I).Select
    Selection.ColumnWidth = 3
Next I
Application.ScreenUpdating = True
End Sub

ça marche très bien mais c'est excésivement long

Auriez vous une proposition à me faire pour réduire le temps d'exécution ?
Merci d'avance et bonne journée

un essai

Sub taille()

     Application.ScreenUpdating = False
     der = Cells(1, Columns.Count).End(xlToRight).Column
     t = Timer
     For i = 1 To Columns.Count Step 2
          s = s & "," & Cells(1, i).Address(0, 0)
          If Len(s) > 245 Or i = Columns.Count-1 Then
               Application.StatusBar = i & "   " & Left(s, 100)
               Range(Mid(s, 2)).EntireColumn.ColumnWidth = 3
               s = ""
          End If
          DoEvents
     Next i
     MsgBox Timer - t
     Application.StatusBar = False
     Application.ScreenUpdating = True
End Sub

Et bien sûr qui vient une fois de plus à mon secours ......
Merci beaucoup Bart, ta procédure se déroule 20 fois plus vite que la mienne

Au plaisir de te retrouver sur le Forum

10 fois plus vite (sans statusbar et Doevents)

Sub taille()

     Application.ScreenUpdating = False
     der = Cells(1, Columns.Count).End(xlToRight).Column
     t = Timer
     For i = 1 To Columns.Count Step 2
          s = s & "," & Cells(1, i).Address(0, 0)
          If Len(s) > 245 Or i = Columns.Count - 1 Then
               'Application.StatusBar = i & "   " & Left(s, 100)
               Range(Mid(s, 2)).EntireColumn.ColumnWidth = 3
               s = ""
          End If
          'DoEvents
     Next i
     MsgBox Timer - t
     Application.StatusBar = False
     Application.ScreenUpdating = True
End Sub

Bart,

Pourquoi gagne-t-on du temps en traitant cette procédure par paquet de 245 en 245 caractères ?

Bonjour à tous,

Ce n'est pas pour être plus rapide, c'est une contrainte. 255 est la longueur maximale d'une chaine de caractères qui peut etre donnée comme argument à la fonction Range.

Donc on est obligé de procéder par paquets pour éviter de dépasser la limite. Le plus optimisé, et instantané, serait de donner toute les colonnes d'un coup effectivement. Mais ça planterait au niveau de l'instruction

Range(Mid(s, 2)).EntireColumn.ColumnWidth = 3

Bonjour Saboh,

Encore une chose que ne savais pas :

255 est la longueur maximale d'une chaine de caractères qui peut etre donnée comme argument à la fonction Range.

Merci et bonne soirée

re,

une petite variante de la macro pour vous démonstrer ce chaine de 255. Si on fait la chaine en 1 fois, sa longueur est 40.600, divisé par 255 = 160 boucles. Dans la macro précédent, j'avais pris >=245, donc elle aurait quelque boucles en plus, mais un boucle, c'est presque nihil.

Sub taille()

     Application.ScreenUpdating = False

     t = Timer

     For i = 1 To Columns.Count Step 2
          s = s & "," & Cells(1, i).Address(0, 0)     'adresse de chaque 2eme cellule
     Next
     s = Mid(s, 2)                           'ignorer première virgule
     l = Len(s)

     Do While Len(s) > 0
          cnt = cnt + 1                      'compter le nombre de fois
          i = Len(s) + 1
          If i > 255 Then i = InStrRev(s, ",", 255)     'position de la dernière virgule <= charactère 255
          s1 = Left(s, i - 1)                'cette chaine sans dernière virgule
          Range(s1).EntireColumn.ColumnWidth = 3     '
          s = Mid(s, i + 1)                  'reste de la chaine après cette virgule
     Loop

     MsgBox "longueur de la chaine : " & Format(l, "#,###") & vbLf & cnt & " boucles" & vbLf & "prêt en " & Format(Timer - t, "0.00\s") & " = " & Format((Timer - t) / cnt * 1000, "0.0") & " millisec/boucle"
     Application.ScreenUpdating = True
End Sub

Bonjour Bart,

Tes explications complètent celles de Saboh, et j'ai bien compris le problème de la longueur de la chaîne qui ne doit pas dépasser 255
Pour l'histoire de la virgule que tu avais en début de chaîne, j'ai tout simplement écrit ceci :

en début de la macro, la variable est portée à "A1" , la boucle commence à 2 et ensuite

          s = s & "," & Cells(1, i).Address(0, 0)

Petit problème, c'est que si la première colonne change et n'est plus A, il faut intervenir dans le code

Bonne journée et à bientôt

Rechercher des sujets similaires à "largeur colonnes consecutives"