Appliquer un ensemble d'actions à différents onglets

Bonjour,

J'ai un classeur Excel avec 60 onglets de données qui présentent tous le même formatage.

J'ai codé en VBA une macro qui me permet de faire un ensemble d'opérations de mise en forme que je veux refaire sur chaque onglet... j'ai beau utiliser une fonction For Each /code/ puis Next pour lui dire de sélectionner l'onglet d'après et de faire exactement la même chose, Excel s'évertue à ne le faire en boucle que sur le premier onglet du classeur...

Je vous donne le code que j'ai écrit ci-après; si vous pouvez m'aider à juste corriger ça, ça me sauverait pas mal de temps!

Merci à la communauté!

Brazben

Sub Process()

Bonjour,

Petite mise au point :

1) Tu n'as pas codé une macro, tu as fait un enregistrement de manipulations. Ce sont 2 choses très sensiblement différentes. Si tu avais ecrit toi-même ton code en connaissance de cause, tu aurais un tout autre code...

2) Si on veut de bons résultats à l'arrivée, il est souhaitable d'être précis dans la désignation des objets et outils qu'on manipule.

For Each... Next n'a rien d'une fonction, c'est une instruction itérative permettant donc une action en boucle, dédiée aux objets d'une même collection...

3) tu n'es guère plus précis sur ce que tu veux faire exactement, on ne peut donc que le déduire de ton code :

Tu parcours les feuilles de calcul de ton classeur pour dans chacune affecter la valeur de la cellule A1 (initialement) à deux autres cellules de la feuille après insertion d'une colonne en première position, cellules qui sont (dans la nouvelle colonne : A7 et cellule en A en regard de la dernière cellule utilisée en B (ex. col. A de la feuille avant insertion de colonne). Ce qui n'est pas de la mise en forme !

Cette opération se code proprement ainsi :

Sub Process()
    Dim ws As Worksheet, v
    For Each ws In ThisWorkbook.Worksheets
        v = .Cells(1, 1)
        ws.Columns(1).Insert
        ws.Cells(7, 1) = v
        ws.Cells(7, 2).End(xlDown).Offset(, -1) = v
    Next ws
End Sub

Mais dans la mesure où tu dis ne pas obtenir le résultat voulu, c'est que ce n'est pas cela que tu veux faire, et il faudrait donc commencer alors par indiquer précisément l'objet de l'opération et le résultat attendu.

Cordialement.

NB- Des balises Code sont à ta disposition pour citer du code. Utilise-les !

Bonjour MFerrand,

Merci pour ton retour.

Sur la mise au point :

1) Une partie est faite avec l'enregistreur de macro, ou du mois du copier-coller d'autres macros que j'ai écrites et une autre est écrite à la main; notamment des choses comme :

Selection.End(xlDown).Select
ActiveCell.Offset(0, -1).Select
Range(Selection, Selection.End(xlUp)).Select

qui n'existent pas via l'enregistreur de macro.

2) Ok pour le terme; j'ai appris à écrire des macros en grande partie par moi-même pour a boite et à date j'en ai une dizaine qui tournent plutôt bien sur l'ensemble des employés; je suis d'accord que mon code n'est pas le plus beau, mais j'applique un adage qui est que Tant que c'est étique et légal, seul le résultat compte; pour le code, j'y ajoute tant que ce n'est pas trop lent

3) Je te remets le code commenté que je veux appliquer à chaque onglet du classeur

Sub Process()

Dim ws As Worksheet 'créé une variable qui est l'onglet

For Each ws In ActiveWorkbook.Sheets 'prépare le pour chaque onglet, faire le code suivant

Columns("A:A").Select 'sélectionne la colonne A
Selection.Insert Shift:=xlToRight 'ajoute une colonne à droite en prévision d'une valeur qui va y être renvoyée
Range("B1").Select 'sélectionne la valeur en B1 que je souhaite renvoyér
Selection.Copy 'copie-la
Range("A7").Select 'sélectionne la cellule A7 pour préparer l'opération de copie
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False 'colle
Application.CutCopyMode = False
Range("A7").Copy 'recopie la même valeur
Range("B7").Select 'sélectionne B7 pour te préparer à descendre tout en bas, indépendamment du nombre de ligne qui peut varier d'un onglet à un autre
Selection.End(xlDown).Select 'sélectionne tout jusqu'à la dernière ligne
ActiveCell.Offset(0, -1).Select 'décale-toi en A + numéro de la dernière ligne
Range(Selection, Selection.End(xlUp)).Select 'sélectionne jusqu'en haut
ActiveSheet.Paste 'copie la valeur et mon TCD ne va en être que plus beau à terme
Application.CutCopyMode = False

Next ws 'fait le sur le prochain onglet jusqu'au dernier onglet
End Sub

En espérant que cela soit plus clair, excellente journée à toi et à tous

J'avais loupé un mot au passage ! Je réécris donc :

Sub Process()
    Dim ws As Worksheet, v, n%
    Application.ScreenUpdating = False
    For Each ws In ThisWorkbook.Worksheets
        v = ws.Cells(1, 1)
        ws.Columns(1).Insert
        n = ws.Cells(7, 2).End(xlDown).Row - 6
        ws.Cells(7, 1).Resize(n).Value = v
    Next ws
End Sub

Donc, sur chaque feuille, on prélève la valeur de A1, on insère une colonne en A, et dans cette nouvelle colonne, sur la plage allant de A7 jusqu'au niveau de la dernière cellule occupée en B, on affecte la valeur prélevée.

Si cela est conforme à l'action souhaitée, il ne te reste plus qu'à tester... !

Et je m'abstiens de tout commentaire avant !

Cordialement.

Merci MFerrand,

Quand je teste j'obtiens une Erreur d'exécution '6' : dépassement de capacité qui fait référence à la ligne

n = ws.Cells(7, 2).End(xlDown).Row - 6

n

ça te parle?

Merci beaucoup encore une fois

Oui ! Quelle est la première ligne vide après la 7 en B sur la feuille où cela se produit ?

L'erreur signifie que la réponse est supérieure à 32767, soit que End(xlDown) va chercher la fin de plage en fin de feuille.

Ok merci.

Je te mets un exemple du fichier source en PJ et le résultat souhaité (ex sur deux onglets).

Peut-être que cela t'aidera à y voir plus clair.

merci beaucoup!

Brazben

109fichier-source.xlsx (25.14 Ko)
134resultats-final.xlsx (25.74 Ko)

La macro fonctionne parfaitement sur ces deux feuilles, ce qui confirme que la feuille sur laquelle se produit l'erreur présente une différence structurelle avec celles-ci (a-priori pour permettre le fonctionnement correct de xlDown, mais avant de le modifier il conviendrait d'en avoir confirmation...)

Rechercher des sujets similaires à "appliquer ensemble actions differents onglets"