Etape (marqueur) dans une macro VBA
Bonjour à tous.
C'est ma première visite sur ce site (même sur un forum). Tout d'abord, merci à tous ceux qui sont à l'origine ou qui contribus à la vie du Forum. Je souhaite préciser que j'utilise les macro VBA déjà depuis 10 ans mais 100% autodidacte, je ne vais donc pas toujours au plus simple. Merci d'avance pour votre compréhension.
Je vais essayer d'exposer ma difficulté :
J'ai une macro qui fait un certain nombre de tache (présentation et soustotal dans certaine colonnes).
Mon fichier (qui est une extraction) a plusieurs onglets toujours les mêmes mais ils ne sont pas toujours tous présents (les taches sont différentes en fonction des onglets).
Forcément quand ma macro arrive sur un onglet qui n'existe pas elle bloque.
Je voudrai pouvoir dire au début de chaque onglet : Si est erreur la sélection de l'onglet "E2" aller à l'étape "DDDD" sinon aller à l'étape "AAAA"
C'est pourquoi je cherche un moyen de mettre des étapes tout au long de ma macro et comment écrire la fonction ci-dessus.
Dessous un petit extrait de ma macro (pour l'exemple si la page "E2" n'existe pas la macro s'arrête alors qu'il y a d'autre pages derrières
Merci d'avance
| 'Pour selection Page 08 |
| Sheets("08").Select |
| 'Mettre les volets en D4 |
| Range("D4").Select |
| ActiveWindow.FreezePanes = True |
| 'Mettre les filtres |
| Rows("1:1").Select |
| Selection.AutoFilter |
| 'insérer une ligne |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| 'Faire un plan |
| Columns("N:R").Select |
| Selection.Columns.Group |
| 'Nomer la plage de cellule HT08 et en faire un soustotal 9 |
| Dim PlageHT08 As Range |
| Range("H4").Select |
| Set PlageHT08 = Worksheets("08").Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7)) |
| PlageHT08.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotHT08", RefersTo:=PlageHT08 |
| Range("H3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHT08)" |
| 'Fin nomer et SStot HT08 |
| ' |
| 'Fin Onglet 08 |
| 'Pour selection Page E2 |
| Sheets("E2").Select |
Bonjour Sandrine357 et bienvenue
Pour commencer, VBA est un langage orienté objet il faut les utiliser, il est souvent inutile de faire des "Select"
Concernant la redirection d'erreur, il suffit d'utiliser On Error
On Error Goto Suite1
' procédure ...
Suite1:
' Suite procédureLe code modifié
Sub Sandrine357()
On Error GoTo Suite1
'Pour selection Page 08
With Sheets("08")
.Activate
'Mettre les volets en D4
.Range("D4").Select
ActiveWindow.FreezePanes = True
'Mettre les filtres
.Rows("1:1").AutoFilter
'insérer une ligne
.Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Faire un plan
.Columns("N:R").Columns.Group
'Nomer la plage de cellule HT08 et en faire un soustotal 9
Dim PlageHT08 As Range
.Range("H4").Select
Set PlageHT08 = .Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7))
ActiveWorkbook.Names.Add Name:="PlageSStotHT08", RefersTo:=PlageHT08
.Range("H3").FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHT08)"
End With
Suite1:
End SubNota : pour le code, pense à utiliser le bouton prévu pour ça
A+
Bonjour JExceL2fr,
Tout d'abord, je te remercie beaucoup pour ta réponse, mais je rencontre un problème supplémentaire :
J'ai l'impression que ça ne marche qu'une seule foi. Or j'en ai potentiellement 46.
Je mets dessous un extrait de ma macro
Dans cet exemple si la page A4 n'existe pas c'est très bien, mais si la page A4 et la page A5 n'existent pas la macro bloque sur With Sheets("A5")
| ' Idem selection Page A2 |
| On Error GoTo Suite2 |
| Sheets("A2").Select |
| 'Mettre les volets en D4 |
| Range("D4").Select |
| ActiveWindow.FreezePanes = True |
| 'Mettre les filtres |
| Rows("1:1").Select |
| Selection.AutoFilter |
| 'Mettre au format nombre |
| Columns("H:I").Select |
| Selection.NumberFormat = "#,##0.00" |
| 'Largeur auto de la colonne A pour les numéros de factures |
| Range("A1").Select |
| Columns("A:A").EntireColumn.AutoFit |
| 'insérer une ligne 3 fois |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| 'Faire un plan |
| Columns("N:R").Select |
| Selection.Columns.Group |
| Columns("B:B").Select |
| Selection.Columns.Group |
| Columns("T:T").Select |
| Selection.Columns.Group |
| 'Nomer la plage de cellule HTA2 et en faire un soustotal 9 |
| Dim PlageHTA2 As Range |
| Range("H4").Select |
| Set PlageHTA2 = Worksheets("A2").Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7)) |
| PlageHTA2.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotHTA2", RefersTo:=PlageHTA2 |
| Range("H3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHTA2)" |
| 'Fin nomer et SStot HTA2 |
| 'Idem pour TVAA2 |
| Dim PlageTVAA2 As Range |
| Range("I4").Select |
| Set PlageTVAA2 = Worksheets("A2").Range(Selection, Selection.Offset(0, -8).End(xlDown).Offset(1, 8)) |
| PlageTVAA2.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotTVAA2", RefersTo:=PlageTVAA2 |
| Range("I3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotTVAA2)" |
| ' |
| ' Fin Onglet A2 |
| Suite2: |
| ' Idem selection Page A3 |
| On Error GoTo Suite3 |
| Sheets("A3").Select |
| 'Mettre les volets en D4 |
| Range("D4").Select |
| ActiveWindow.FreezePanes = True |
| 'Mettre les filtres |
| Rows("1:1").Select |
| Selection.AutoFilter |
| 'Mettre au format nombre |
| Columns("H:I").Select |
| Selection.NumberFormat = "#,##0.00" |
| 'Largeur auto de la colonne A pour les numéros de factures |
| Range("A1").Select |
| Columns("A:A").EntireColumn.AutoFit |
| 'insérer une ligne 3 fois |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| 'Faire un plan |
| Columns("N:R").Select |
| Selection.Columns.Group |
| Columns("B:B").Select |
| Selection.Columns.Group |
| Columns("T:T").Select |
| Selection.Columns.Group |
| 'Nomer la plage de cellule HTA3 et en faire un soustotal 9 |
| Dim PlageHTA3 As Range |
| Range("H4").Select |
| Set PlageHTA3 = Worksheets("A3").Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7)) |
| PlageHTA3.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotHTA3", RefersTo:=PlageHTA3 |
| Range("H3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHTA3)" |
| 'Fin nomer et SStot HTA3 |
| 'Idem pour TVAA3 |
| Dim PlageTVAA3 As Range |
| Range("I4").Select |
| Set PlageTVAA3 = Worksheets("A3").Range(Selection, Selection.Offset(0, -8).End(xlDown).Offset(1, 8)) |
| PlageTVAA3.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotTVAA3", RefersTo:=PlageTVAA3 |
| Range("I3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotTVAA3)" |
| ' |
| ' Fin Onglet A3 |
| Suite3: |
| ' Idem selection Page A4 |
| On Error GoTo Suite4 |
| Sheets("A4").Select |
| 'Mettre les volets en D4 |
| Range("D4").Select |
| ActiveWindow.FreezePanes = True |
| 'Mettre les filtres |
| Rows("1:1").Select |
| Selection.AutoFilter |
| 'Mettre au format nombre |
| Columns("H:I").Select |
| Selection.NumberFormat = "#,##0.00" |
| 'Largeur auto de la colonne A pour les numéros de factures |
| Range("A1").Select |
| Columns("A:A").EntireColumn.AutoFit |
| 'insérer une ligne 3 fois |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| 'Faire un plan |
| Columns("N:R").Select |
| Selection.Columns.Group |
| Columns("B:B").Select |
| Selection.Columns.Group |
| Columns("T:T").Select |
| Selection.Columns.Group |
| 'Nomer la plage de cellule HTA4 et en faire un soustotal 9 |
| Dim PlageHTA4 As Range |
| Range("H4").Select |
| Set PlageHTA4 = Worksheets("A4").Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7)) |
| PlageHTA4.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotHTA4", RefersTo:=PlageHTA4 |
| Range("H3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHTA4)" |
| 'Fin nomer et SStot HTA4 |
| 'Idem pour TVAA4 |
| Dim PlageTVAA4 As Range |
| Range("I4").Select |
| Set PlageTVAA4 = Worksheets("A4").Range(Selection, Selection.Offset(0, -8).End(xlDown).Offset(1, 8)) |
| PlageTVAA4.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotTVAA4", RefersTo:=PlageTVAA4 |
| Range("I3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotTVAA4)" |
| ' |
| ' Fin Onglet A4 |
| Suite4: |
| ' Idem selection Page A5 |
| On Error GoTo Suite5 |
| With Sheets("A5") |
| 'Mettre les volets en D4 |
| Range("D4").Select |
| ActiveWindow.FreezePanes = True |
| 'Mettre les filtres |
| Rows("1:1").Select |
| Selection.AutoFilter |
| 'Mettre au format nombre |
| Columns("H:I").Select |
| Selection.NumberFormat = "#,##0.00" |
| 'Largeur auto de la colonne A pour les numéros de factures |
| Range("A1").Select |
| Columns("A:A").EntireColumn.AutoFit |
| 'insérer une ligne 3 fois |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| Rows("1:1").Select |
| Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove |
| 'Faire un plan |
| Columns("N:R").Select |
| Selection.Columns.Group |
| Columns("B:B").Select |
| Selection.Columns.Group |
| Columns("T:T").Select |
| Selection.Columns.Group |
| 'Nomer la plage de cellule HTA5 et en faire un soustotal 9 |
| Dim PlageHTA5 As Range |
| Range("H4").Select |
| Set PlageHTA5 = Worksheets("A5").Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7)) |
| PlageHTA5.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotHTA5", RefersTo:=PlageHTA5 |
| Range("H3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHTA5)" |
| 'Fin nomer et SStot HTA5 |
| 'Idem pour TVAA5 |
| Dim PlageTVAA5 As Range |
| Range("I4").Select |
| Set PlageTVAA5 = Worksheets("A5").Range(Selection, Selection.Offset(0, -8).End(xlDown).Offset(1, 8)) |
| PlageTVAA5.Select |
| ActiveWorkbook.Names.Add Name:="PlageSStotTVAA5", RefersTo:=PlageTVAA5 |
| Range("I3").Select |
| ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,PlageSStotTVAA5)" |
| End With |
| ' Fin Onglet A5 |
| Suite5: |
Bonjour Sandrine,
Vous ne semblez pas comprendre l'histoire du bouton à utiliser pour coller votre code
Ensuite, nous ne savions pas ce que vous vouliez faire !
si c'est pour reproduire la même chose sur plusieurs feuilles, il suffit de faire une boucle
Regardez comment se présente mon code (entre balises) et qui est celui à utiliser, j'espère qu'il marchera sur votre fichier
Sub Sandrine357()
Dim Sht As Worksheet
Dim PlageHTA() As String, PlageTVA() As String
Dim Inc As Integer
Inc = 1
' Pour chaque feuille du classeur
For Each Sht In ThisWorkbook.Sheets
Sht.Select
' Mettre les volets en D4
Sht.Range("D4").Select
ActiveWindow.FreezePanes = True
' Mettre les filtres
Sht.Rows("1:1").AutoFilter
' Mettre au format nombre
Sht.Columns("H:I").NumberFormat = "#,##0.00"
' Largeur auto de la colonne A pour les numéros de factures
Sht.Range("A1").Columns("A:A").EntireColumn.AutoFit
' insérer 3 lignes
Sht.Rows("1:3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Faire un plan
Sht.Columns("N:R").Group: Sht.Columns("B:B").Group: Sht.Columns("T:T").Group
'Nomer la plage de cellule HTA2 et en faire un soustotal 9
Sht.Range("H4").Select
Inc = Inc + 1
PlageHTA(Inc) = Sht.Range(Selection, Selection.Offset(0, -7).End(xlDown).Offset(1, 7))
ActiveWorkbook.Names.Add Name:="PlageSStotHTA" & Inc, RefersTo:=PlageHTA(Inc)
Sht.Range("H3").FormulaR1C1 = "=SUBTOTAL(9,PlageSStotHTA" & Inc & ")"
'Idem pour TVA2
Sht.Range("I4").Select
PlageTVA(Inc) = Sht.Range(Selection, Selection.Offset(0, -8).End(xlDown).Offset(1, 8))
ActiveWorkbook.Names.Add Name:="PlageSStotTVA" & Inc, RefersTo:=PlageTVA(Inc)
Sht.Range("I3").FormulaR1C1 = "=SUBTOTAL(9,PlageSStotTVA" & Inc & ")"
Next Sht
End SubA+