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
Bonsoir,
Lorsque je voulais préparer un fichier, Excel s'est bloqué, c.-à-d. que si je veux sélectionner l'un des fichiers ouverts il émet un son, mais je n'arrive pas à sélectionner le fichier, ni les autres qui sont ouverts; chaque fois que je clique il émet le son. Que faire?
 

Staple1600

XLDnaute Barbatruc
Re

Ce code fonctionne et s’exonère de devoir passer par un Copier/Coller
VB:
Sub Macro1()
Dim wSht As Worksheet
For Each wSht In Worksheets
    If wSht.Name <> "Modèle" Then
    wSht.Range("B6:H8").Value = wSht.Range("B6:H8").Value
    End If
Next
End Sub
 

Aloha

XLDnaute Accro
Bonjour,

@JM:
merci pour ton code; il fonctionne et j'ai réussi à faire fonctionner la macro entière.

Mais je n'arrive pas à comprendre la différence de ton code modifié par rapport à l'ancien pour ce qui est des fiches après "Modèle" non traitées! ...A moins que je ne me sois grossièrement trompé. Je vais essayer l'ancien encore une fois pour y voir clair.
D'ailleurs, il y a deux routines similaires pour copier dans les mêmes cellules: d'abord les formules, puisque quand j'ouvre les fichier il y a les valeurs au lieu des formules et lorsque je l'exécute avec F8, dans la première routine, je vois comme la macro poasse d'une feuille à l'autre; lorsqu'elle est arrivée à la dernière, elle refait la même chose, à la différence près qu'elle ne colle pas des formules mais qu'elle remplace les résultats par les valeurs pour qu'elles soient permanentes (fonction INDIRECT), mais là la dernière feuille reste active, et les autres feuilles ne sont pas sélectionnées, alors que les formules sont bien remplacées par les valeurs dans celles-là aussi. Est-ce normal pour Excel?

Le code complet (qui se trouve dans un deuxième fichier)
Code:
Sub Remplacer_formules()
    Dim wSht As Worksheet
    Workbooks("XX 2017").Activate
    Sheets("Modèle").Visible = True
    Sheets("Modèle").Select
    Range("B6:H8").Select
    Selection.Copy
For Each wSht In Worksheets
    If wSht.Name <> "Modèle" Then
    wSht.Select
    Range("B6:H8").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    End If
Next wSht
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
    Sheets("Modèle").Visible = False
    ActiveWorkbook.Save
    ActiveWindow.Close
End Sub
Bonne journée
Aloha
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

@Aloha
Recyclage d'une de mes réponses dans un vieux fil
https://www.excel-downloads.com/threads/largeur-de-colonne.231863/#post-1479875
Et pour faire un peu de pub à FillAcrossSheets (un peu trop inutilisé à mon gout)
;)
VB:
Sub a()
Dim arrWSN() As String, i%, wSht As Worksheet
'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"), xlFillWithContents
'conversion des plages 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
End Sub
 

Aloha

XLDnaute Accro
Bonjour,
Merci pour ce code.
Il doit remplacer quelle partie de "mon code"? Je ne comprends pas le début, avec le "tableau pour toutes les feuilles du classeur actif"
Vu mes maigres compétences en VBA je ne comprends pas et ne voit pas (F8) ce que fait
Code:
ReDim arrWSN(1 To ActiveWorkbook.Sheets.Count)
For i = 1 To Sheets.Count
arrWSN(i) = Sheets(i).Name
Next i
A+
Aloha
 

Staple1600

XLDnaute Barbatruc
Re,

@Aloha
Relis les lignes en vert dans mon messages précédent
Dans le VBA, il n'y a pas que le VBA, il y a aussi les commentaires du VBA ;)
Un tableau est ici à prendre au sens de Array

Sinon ma dernière macro peut remplacer toute ta macro.
Celle du message#6

NB: Après 10 ans de présence sur le forum (tu t'es inscrit en 2007), tu ne peux pas arguer avoir de faibles compétences en VBA, sauf à être la Belle au Bois Dormant et avoir dormi depuis le 27 mars 2007 ;)
 
Dernière édition:

Aloha

XLDnaute Accro
Re,
Ok, merci beaucoup.
En tout cas elle est bien rapide, ce qui n'est pas un défaut.
Toutes mes questions récentes concernant du code VBA concernaient le même projet. J'ai plusieurs macros, dont celle qui doit copier les données mensuelles dans les fichiers annuels. Celle-là prend, pour janvier où les fichiers annuels sont vides et où elle doit créer une feuille pour chaque salarié, puis y coller les données - et après celle-là suit la présente, qui (encore une fois à cause de INDIRECT) doit d'abord coller les formules puis les valeurs - 20 minutes pour 10 services avec quelque 120 salariés! S'il y avait moyen de l'accélérer, cela m'arrangerait beaucoup, parce que bloquer un ordinateur pendant plus de 20 minutes (avec les autres macros dans la chaîne) c'est en réalité trop long. Ce qui prend beaucoup de temps c'est d'enlever la liaison entre chaque fois 2 cellules verticales, puisque l'action est exercée cellule par cellule. Dans ma naïveté je m'étais imaginé qu'on pouvait sélectionner l'aire concernée et que Excel traiterait toutes les cellules à la fois.
A+
Aloha
P.S.: J'avais d'ailleurs bien lu les commentaires
 

Staple1600

XLDnaute Barbatruc
Re

parce que bloquer un ordinateur pendant plus de 20 minutes (avec les autres macros dans la chaîne) c'est en réalité trop long.
C'est pile poil le temps qu'il faut pour un moment de convivialité entre collègues autour d'une galette des rois à l'heure du café ;)

Sinon après la galette mangée, on peut se dire qu'un logiciel tiers RH serait peut-être plus adapté et plus rapide qu'Excel, non ?
Mais dans ce cas, il faut sortir les sous, et et fini les pause galettes/café ;)
 

Aloha

XLDnaute Accro
Re,

J'avais l'intention de conseiller à la personne qui gère l'affaire de lancer les macros avant la pause de midi. Avec un peu de chance ce sera fini après, et comme il ne le fait qu'une fois par mois ce sera supportable.

Le jour où la réglementation changera trop, mon système ne fonctionnera plus parce qu'il ne pourra digérer de grosses modifications et là il faudra trouver une solution plus professionnelle.

Mais, je suis bien avancé dans mon projet et j'ai mis en chaîne les macros s'occupant des différentes étapes et, à côté des macros 1, 2 et 3, pour lesquelles j'ai mis, pour l'instant, des boutons, j'ai créé un bouton qui fait l'action de tous les autres.

Code:
Sub Tout_copier ()
macro 1
macro 2
macro 3
End Sub

Après, je me suis mis à la cosmétique pour embellir les boutons, mais j'avais du mal à faire ce que je voulais. E.a. j'avais du mal à mettre des cadres autour. J'y ai réussi, mais je voulais embellir les cadres aussi, en vain.
Ce n'est pas évident. Je n'ai trouvé nulle part, même pas dans l'onglet "Dessin" que j'ai fait afficher, un outil pour dessiner un cadre. Finalement j'ai trouvé dans "Développeur" Insérer une zone de contrôle, mais si je comprends bien ce n'est pas un simple cadre (?) et destiné à une autre utilisation.
Une indication est la lenteur avec laquelle Excel a réagi même lorsque je n'ai fait que modifier le texte d'un bouton, chose pas facile non plus.
D'ailleurs, je n'ai pas compris jusqu'à présent s'il faut mettre un bouton de contrôle de formulaire ou un bouton de commande (Contrôle ActiveX) pour lancer une macro.

Vale!
Aloha
 
Dernière édition:

Staple1600

XLDnaute Barbatruc

job75

XLDnaute Barbatruc
Bonjour Aloha, JM,

J'avoue ne m'être jamais servi de FillAcrossSheets, il faudrait voir le gain de temps sur 100 feuilles avec :
Code:
Sub Remplacer_formules()
    Dim t, wSht As Worksheet
    Workbooks("XX 2017").Activate
    t = Sheets("Modèle").Range("B6:H8").Formula
    For Each wSht In Worksheets
        If wSht.Name <> "Modèle" Then
            With wSht.Range("B6:H8")
                .Formula = t
                .Value = .Value
            End With
        End If
    Next
    ActiveWorkbook.Close True
End Sub
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 441
Membres
103 210
dernier inscrit
Bay onais