XL 2016 VBA: action dans toutes les feuilles sauf une

Aloha

XLDnaute Accro
Bonjour,

Dans un fichier une macro doit exercer des actions identiques dans toutes les feuilles sauf une, mais elle s'arrête à cette feuille et ignore les feuilles qui suivent.
Un extrait de la macro:
Code:
For Each wSht In Worksheets
    If wSht.Name <> "Modèle" Then
    wSht.Select
    Range("B6:H8").Select
    Selection.Copy
    Range("B6:H8").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    End If
Next

Est-ce qu'une construction qui ressemblerait à celle-ci:
Code:
For Each wSht In Worksheets except "Modèle"
n'est pas possible?
Sinon, comment résoudre le problème?
Salutations
Aloha
 

Aloha

XLDnaute Accro
Re,
@ JM:
désolé, je ne comprends pas ce que tu veux dire par là:
J'ai pas dit qu'on en avait besoin
Mais que c'était peu utilisé.
Oui, j'ai bien besoin de remplacer les formules par les valeurs, sinon il n'y aura que des formules qui ne fonctionnent pas parce que le fichier auquel les formules INDIRECT font référence ne sera pas ouvert (en plus il faut sélectionner le bon service pour que les plein de calculs qui se font dans la feuille "Personnel" concernent ce service et pas un autre) ou pas disponible (si j'ouvre le fichier dans un autre ordinateur ce qui sera le cas. Donc, il faut absolument les valeurs.
A propos de la zone de contrôle, elle a quelle utilisation en réalité? Et où trouver les outils pour dessiner des cadres?

@ "Job75":
Merci, je vais tester ce code.
En le contemplant je me suis rendu compte que j'avais oublié de préciser que, faute de mieux, jai copier le code 9 fois et j'ai changé chaque fois le nom du service parce que je ne suis pas à même de dire à Excel, dans un langage qu'il comprend:
Code:
For fichiers 1 to 10
ouvre un fichier après l'autre (schéma du chemin: H:\Heures 2018\Récolte des fiches\XX\XX 2017.xlsx;  le prochain: H:\Heures 2018\Récolte des fiches\XY\XY 2017.xlsx"; etc...)
et exécuter la macro
Next

Une question à ce propos: est-ce que procéder comme ça ça ralentit l'action ou pas?

A+
Aloha
 

Staple1600

XLDnaute Barbatruc
Re


@Aloha
Sans être désobligeant, ça sent le gaz.
Ou plutôt l'usine à gaz.
Je t'encourage comme déjà dit à explorer la solution logiciel tiers RH.
Sinon ce que tu ne comprenais pas s'adressait à job75 qui avait posté un message supprimé dans la foulée.

@job75
Je présuppose que le FillAcross est plus rapide qu'une boucle, non ?
Mais peut-être ai-je tort.
Si cette fonctionnalité existe dans VBA, c'est qu'elle doit avoir son utilité (et ses avantages), non ?
 

Aloha

XLDnaute Accro
Re,

@JM:
encore devrais-je savoir ce que signifie "RH"!
D'ailleurs, malgré mon bon nez, je ne sens, pour l'instant (!!) même pas une fuite de gaz!
Mon système fonctionne depuis 2004, si je ne me trompe, sans faille. Heureusement, il n'y a pas eu des modifications majeures dues aux nouveaux contrats collectifs qui se suivaient. L'année passée le dernier a été signé, d'où mon projet, que j'ai, à présent, avec le généreux concours de gens comme toi, bon espoir de mener à bien.
Valete!
Aloha
 

Staple1600

XLDnaute Barbatruc
Re

@job75
Toi qui a sous le coude de quoi chronométrer les macros, tu peux faire un test peut-être? ;)

NB: Je sais que l'utilisation des Arrays est a privilégier.
Mais comme dit précédemment, l'avantage que je vois à FillAcross c'est qu'il peut recopier le format (en une seule ligne de code)
Ce que ne fera pas la restitution d'un Array.
 

job75

XLDnaute Barbatruc
Toi qui a sous le coude de quoi chronométrer les macros, tu peux faire un test peut-être? ;)
C'est fait, j'ai créé un classeur de 1000 feuilles, chez moi sur Win 10 Excel 2013 :

- ta macro du post #7 => 12,4 secondes

- ma macro du post #15 => 1,4 seconde.

Edit : dans la plage B6:H8 j'ai mis une formule très simple : =ADRESSE(LIGNE();COLONNE())

A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Je viens de tester sur 62 feuilles
VB:
Sub b()
Dim arrWSN() As String, i%, wSht As Worksheet, top, fin, duree
Application.ScreenUpdating = False
top = Timer
'crée un tableau avec le nom de toutes les feuilles du classeur actif
ReDim arrWSN(1 To ActiveWorkbook.Sheets.Count)
For i = 1 To Sheets.Count
arrWSN(i) = Sheets(i).Name
Next i
'ici recopie du contenu (formule inclue) de la plage B6:H8 de la feuille Modèle vers toutes les feuilles
Worksheets(arrWSN).FillAcrossSheets Worksheets("Modèle").Range("B6:H8"), xlFillWithAll
'conversion des palges en valeurs seules
For Each wSht In Worksheets
    If wSht.Name <> "Modèle" Then
    wSht.Range("B6:H8").Value = wSht.Range("B6:H8").Value
    End If
Next wSht
fin = Timer
duree = Int((fin - top) * 1000) / 1000
MsgBox duree
End Sub
Résultat: 0.304

En ajoutant: Application.ScreenUpdating = False
je passe à 0.187
 

job75

XLDnaute Barbatruc
Re JM,

Toujours sur le classeur de 1000 feuilles, avec la même formule et la plage colorée en jaune :

- ta macro du post #7 avec xlFillWithAll => 12,4 secondes (inchangé)

- cette macro (classique) s'exécute en 6,8 secondes :
Code:
Sub CopieTout()
    Dim P As Range, wSht As Worksheet
    Set P = Sheets("Modèle").Range("B6:H8")
    For Each wSht In Worksheets
        If wSht.Name <> "Modèle" Then
            With wSht.Range("B6:H8")
                P.Copy .Cells
                .Value = .Value
            End With
        End If
    Next
End Sub
A+
 

Staple1600

XLDnaute Barbatruc
Re

@job75
Chez moi, ta macro donne 1.421
alors que la macro b donne 0.187 ???
(voir mon message précédent)
NB: Testé sur 62 feuilles
VB:
Sub CopieTout()
Dim P As Range, wSht As Worksheet, top, fin, duree
Set P = Sheets("Modèle").Range("B6:H8")
Application.ScreenUpdating = False
top = Timer
    For Each wSht In Worksheets
        If wSht.Name <> "Modèle" Then
            With wSht.Range("B6:H8")
                P.Copy .Cells
                .Value = .Value
            End With
        End If
    Next
    fin = Timer
duree = Int((fin - top) * 1000) / 1000
MsgBox duree
End Sub
 

Aloha

XLDnaute Accro
Re,
Ok, si la charte l'exige!
Avec la multitude de mes questions, pour ne pas abuser davantage, je t'ai posé la question à toi (et à tous ceux qui l'ont lue).
Et il y en a encore une autre qui me tracasse: délier rapidement les liaisons entre cellules.
Vale!
Aloha
 

Staple1600

XLDnaute Barbatruc
Re

@Aloha
Poser des questions c'est pas abuser.
Mais c'est plus fluide de suivre cette pratique du forum:
Une question (ou un thème de problématique) -> Une discussion
(Et rien n’empêche de mettre un lien pour dire que telle discussion est en rapport avec telle autre)

Me concernant, je t'ai donné mon avis sur la question de ce fil.
(voir un logiciel)
Pour l'autre question , j'attends de lire ta nouvelle discussion. ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 232
Messages
2 086 461
Membres
103 220
dernier inscrit
samira2024