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
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?
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
@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
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
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
@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
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
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é
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.
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.
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