Bonjour le forum,
Est-il possible que la méthode Copy ne fasse planter l'exécution de ma macro qu'au bout d'un nombre Y de lancement ?
Je m'explique : j'ai une macro qui effectue une copie d'un onglet type (un onglet de modèle en quelque sorte) appelé "Trimestre", autant de fois que cela est nécessaire (généralement 12 onglets, donc 12 trimestres).
Admettons que j'ouvre mon fichier Excel et exécute cette macro. Les 12 onglets supplémentaires, créés à partir de l'onglet modèle "Trimestre", sont générés sans problème.
Ensuite par une autre macro, je décide de supprimer ces trimestres venant d'être créés.
Je relance la macro, tout fonctionne.
Je re-supprime les trimestres....
A chaque fois, au bout de la 5ème fois où j'exécute la macro, celle-ci bug et m'affiche une erreur 1004 : la méthode Copy de la classe Worksheets a échoué.
Est-il possible qu'il s'agisse d'un problème de "lourdeur" ou de mémoire car en effet, les trimestres générés sont assez lourds ? Je précise à toute fins utiles que cette erreur arrive quand cette ligne doit être exécutée :
Worksheets("Trimestre").Copy Before:=Sheets(Sheets.Count)
(vers la fin de l'extrait du code posté ci-dessous)
Je ne puis malheureusement vous envoyer le fichier car celui-ci comporte plus de 20 USF... Mais je vous fait un copier-coller du début du code de création des trimestres, au cas où une erreur m'aurait échappée...
En vous remerciant beaucoup par avance ! 🙂
Option Explicit
Private Sub CommandButton1_Click()
'Bouton OK du USF "TypeContrôle"
'Définition des types de variables utilisés
Dim c As Range
Dim Valeur As Currency
Dim Annee, F, X, Y, Z, MonAnneeDebut, MonAnneeFin As Integer
Dim A, B, G, Decal, Trimestre, Rajout, Col, Boucle, t As Byte
Dim M1, M2, M3, DateDebut, DateFin, DEmb, MaDate, MaDate1, MaDate2 As Date
Dim Msg, TrimDebut, TrimFin, Feuille, Feuilles, Nom, TrimestreEmbauche, TrimestreDebauche, Num, DDeb As Variant
'Test pour vérifier qu'une des deux options de l'USF a bien été sélectionnée
If TypeContrôle.OptionButton1.Value = False And TypeContrôle.OptionButton2.Value = False Then
Msg = MsgBox("Vous n'avez pas sélectionné l'une des deux options !", vbCritical, "Erreur...")
Exit Sub
End If
'Test pour vérifier que la mise en forme des données a été effectué en amont
If Sheets("Données").Range("A20").Value = "EMPNUM" Or Sheets("Données").Range("A20").Value = "" Then
Msg = MsgBox("Vous devez d'abord mettre en forme les données via le bouton ''Mise en forme des données'' du menu ''Données AS/400'' !" _
, vbCritical, "Erreur !")
Exit Sub
End If
'Test pour vérifier que le relevé n'a pas déjà été réalisé
If Worksheets.Count > 4 Then
Msg = MsgBox("Le relevé a déjà été généré !" & _
Chr(10) & "Pour générer un nouveau relevé, supprimez d'abord l'ancien avec le bouton ''Supprimer le relevé'' du menu ''Relevé''." _
, vbCritical, "Erreur...")
Exit Sub
End If
Sheets("BD").Range("T27:T" & Sheets("BD").Range("T65000").End(xlUp).Row).Font.ColorIndex = 0
If Sheets("Données").Range("A20").Value <> "N° Assuré" Then Sheets("BD").Range("Q4:S14").Font.ColorIndex = 0
TypeContrôle.Hide
If Sheets("BD").Range("L2").Value = "N" Then
Attente.Show
Attente.Repaint
End If
'Apparition de l'USF d'attente si l'on n'est pas en mode Administration
TypeContrôle.Hide
Sheets("Trimestre").Visible = True
'La feuille Trimestre doit être visible le temps de l'exécution.
If OptionButton1.Value = True Then
'Si l'utilisateur a sélectionné l'option 1 de l'USF : relevé automatique avec prise en compte de la prescription triennale
Sheets("Menu").Range("A4").Value = ""
If Sheets("BD").Range("L2").Value = "N" Then Application.ScreenUpdating = False
TrimDebut = Sheets("BD").Range("B6").Value 'Premier trimestre contrôlable
DateDebut = Sheets("BD").Range("D6").Value 'Commençant le
TrimFin = Sheets("BD").Range("B7").Value 'Dernier trimestre contrôlable
DateFin = Sheets("BD").Range("F7").Value 'Se terminant le
'1. GENERATION DES TRIMESTRES SOUS CONTROLE
With Sheets("BD").Range("P27😛" & Sheets("BD").Range("P65000").End(xlUp).Row)
Set c = .Find(TrimDebut, LookAt:=xlWhole)
X = c.Row
Set c = .Find(TrimFin, LookAt:=xlWhole)
Y = c.Row
End With
For A = X To Y
Nom = Sheets("BD").Cells(A, 16).Value 'Nom du trimestre (ex: 4T2007)
Worksheets("Trimestre").Copy Before:=Sheets(Sheets.Count)
ActiveSheet.Name = Nom
Annee = Right(Nom, 4) 'Année de l'onglet '(exemple pour 4T2007 > 2007)
Trimestre = Left(Nom, 1) 'Trimestre de l'onglet (ex: 4T2007 > 4)
If Trimestre = 1 Then
M1 = Format(CDate("01/" & Annee), "mm/yyyy")
M2 = Format(CDate("02/" & Annee), "mm/yyyy")
M3 = Format(CDate("03/" & Annee), "mm/yyyy")
ElseIf Trimestre = 2 Then
M1 = Format(CDate("04/" & Annee), "mm/yyyy")
M2 = Format(CDate("05/" & Annee), "mm/yyyy")
M3 = Format(CDate("06/" & Annee), "mm/yyyy")
ElseIf Trimestre = 3 Then
M1 = Format(CDate("07/" & Annee), "mm/yyyy")
M2 = Format(CDate("08/" & Annee), "mm/yyyy")
M3 = Format(CDate("09/" & Annee), "mm/yyyy")
Else
M1 = Format(CDate("10/" & Annee), "mm/yyyy")
M2 = Format(CDate("11/" & Annee), "mm/yyyy")
M3 = Format(CDate("12/" & Annee), "mm/yyyy")
End If
....................
Est-il possible que la méthode Copy ne fasse planter l'exécution de ma macro qu'au bout d'un nombre Y de lancement ?
Je m'explique : j'ai une macro qui effectue une copie d'un onglet type (un onglet de modèle en quelque sorte) appelé "Trimestre", autant de fois que cela est nécessaire (généralement 12 onglets, donc 12 trimestres).
Admettons que j'ouvre mon fichier Excel et exécute cette macro. Les 12 onglets supplémentaires, créés à partir de l'onglet modèle "Trimestre", sont générés sans problème.
Ensuite par une autre macro, je décide de supprimer ces trimestres venant d'être créés.
Je relance la macro, tout fonctionne.
Je re-supprime les trimestres....
A chaque fois, au bout de la 5ème fois où j'exécute la macro, celle-ci bug et m'affiche une erreur 1004 : la méthode Copy de la classe Worksheets a échoué.
Est-il possible qu'il s'agisse d'un problème de "lourdeur" ou de mémoire car en effet, les trimestres générés sont assez lourds ? Je précise à toute fins utiles que cette erreur arrive quand cette ligne doit être exécutée :
Worksheets("Trimestre").Copy Before:=Sheets(Sheets.Count)
(vers la fin de l'extrait du code posté ci-dessous)
Je ne puis malheureusement vous envoyer le fichier car celui-ci comporte plus de 20 USF... Mais je vous fait un copier-coller du début du code de création des trimestres, au cas où une erreur m'aurait échappée...
En vous remerciant beaucoup par avance ! 🙂
Option Explicit
Private Sub CommandButton1_Click()
'Bouton OK du USF "TypeContrôle"
'Définition des types de variables utilisés
Dim c As Range
Dim Valeur As Currency
Dim Annee, F, X, Y, Z, MonAnneeDebut, MonAnneeFin As Integer
Dim A, B, G, Decal, Trimestre, Rajout, Col, Boucle, t As Byte
Dim M1, M2, M3, DateDebut, DateFin, DEmb, MaDate, MaDate1, MaDate2 As Date
Dim Msg, TrimDebut, TrimFin, Feuille, Feuilles, Nom, TrimestreEmbauche, TrimestreDebauche, Num, DDeb As Variant
'Test pour vérifier qu'une des deux options de l'USF a bien été sélectionnée
If TypeContrôle.OptionButton1.Value = False And TypeContrôle.OptionButton2.Value = False Then
Msg = MsgBox("Vous n'avez pas sélectionné l'une des deux options !", vbCritical, "Erreur...")
Exit Sub
End If
'Test pour vérifier que la mise en forme des données a été effectué en amont
If Sheets("Données").Range("A20").Value = "EMPNUM" Or Sheets("Données").Range("A20").Value = "" Then
Msg = MsgBox("Vous devez d'abord mettre en forme les données via le bouton ''Mise en forme des données'' du menu ''Données AS/400'' !" _
, vbCritical, "Erreur !")
Exit Sub
End If
'Test pour vérifier que le relevé n'a pas déjà été réalisé
If Worksheets.Count > 4 Then
Msg = MsgBox("Le relevé a déjà été généré !" & _
Chr(10) & "Pour générer un nouveau relevé, supprimez d'abord l'ancien avec le bouton ''Supprimer le relevé'' du menu ''Relevé''." _
, vbCritical, "Erreur...")
Exit Sub
End If
Sheets("BD").Range("T27:T" & Sheets("BD").Range("T65000").End(xlUp).Row).Font.ColorIndex = 0
If Sheets("Données").Range("A20").Value <> "N° Assuré" Then Sheets("BD").Range("Q4:S14").Font.ColorIndex = 0
TypeContrôle.Hide
If Sheets("BD").Range("L2").Value = "N" Then
Attente.Show
Attente.Repaint
End If
'Apparition de l'USF d'attente si l'on n'est pas en mode Administration
TypeContrôle.Hide
Sheets("Trimestre").Visible = True
'La feuille Trimestre doit être visible le temps de l'exécution.
If OptionButton1.Value = True Then
'Si l'utilisateur a sélectionné l'option 1 de l'USF : relevé automatique avec prise en compte de la prescription triennale
Sheets("Menu").Range("A4").Value = ""
If Sheets("BD").Range("L2").Value = "N" Then Application.ScreenUpdating = False
TrimDebut = Sheets("BD").Range("B6").Value 'Premier trimestre contrôlable
DateDebut = Sheets("BD").Range("D6").Value 'Commençant le
TrimFin = Sheets("BD").Range("B7").Value 'Dernier trimestre contrôlable
DateFin = Sheets("BD").Range("F7").Value 'Se terminant le
'1. GENERATION DES TRIMESTRES SOUS CONTROLE
With Sheets("BD").Range("P27😛" & Sheets("BD").Range("P65000").End(xlUp).Row)
Set c = .Find(TrimDebut, LookAt:=xlWhole)
X = c.Row
Set c = .Find(TrimFin, LookAt:=xlWhole)
Y = c.Row
End With
For A = X To Y
Nom = Sheets("BD").Cells(A, 16).Value 'Nom du trimestre (ex: 4T2007)
Worksheets("Trimestre").Copy Before:=Sheets(Sheets.Count)
ActiveSheet.Name = Nom
Annee = Right(Nom, 4) 'Année de l'onglet '(exemple pour 4T2007 > 2007)
Trimestre = Left(Nom, 1) 'Trimestre de l'onglet (ex: 4T2007 > 4)
If Trimestre = 1 Then
M1 = Format(CDate("01/" & Annee), "mm/yyyy")
M2 = Format(CDate("02/" & Annee), "mm/yyyy")
M3 = Format(CDate("03/" & Annee), "mm/yyyy")
ElseIf Trimestre = 2 Then
M1 = Format(CDate("04/" & Annee), "mm/yyyy")
M2 = Format(CDate("05/" & Annee), "mm/yyyy")
M3 = Format(CDate("06/" & Annee), "mm/yyyy")
ElseIf Trimestre = 3 Then
M1 = Format(CDate("07/" & Annee), "mm/yyyy")
M2 = Format(CDate("08/" & Annee), "mm/yyyy")
M3 = Format(CDate("09/" & Annee), "mm/yyyy")
Else
M1 = Format(CDate("10/" & Annee), "mm/yyyy")
M2 = Format(CDate("11/" & Annee), "mm/yyyy")
M3 = Format(CDate("12/" & Annee), "mm/yyyy")
End If
....................
Dernière édition: