Méthode Copy qui plante... au bout de la 5ème exécution ??!

Law

XLDnaute Junior
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:p" & 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:

PascalXLD

XLDnaute Barbatruc
Modérateur
Re : Méthode Copy qui plante... au bout de la 5ème exécution ??!

RE

Oui c'est un bug qu'on avait remarqué. En plus c'est aléatoire. Par moment il plante au bout de 5 fois mais si tu fermes excel cela sera peut-être à la réouverture au bout de 10 fois

Je retrouve un fil où on en parlait
 

wilfried_42

XLDnaute Barbatruc
Re : Méthode Copy qui plante... au bout de la 5ème exécution ??!

Bonjour law, pascal :)

je viens de faire un essai, avec une procedure que j'ai ecrite pour quelqu'un

Creation de 110 feuille avec un copier coller d'une feuille type pas un seul plantage

Code:
    a = InputBox("Attention : " & vbCrLf & "Aucune semaine de paramétrée" & vbcrfl & vbCrLf & _
                 "Combien de semaine voulez-vous ?", "INITIALISATION")
    If Val(a) = 0 Or Val(a) > 110 Then MsgBox "Pas de saisie ou saisie invalide": Exit Sub
    Dim i As Integer
    For i = 1 To Val(a)
        Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Sem" & Format(i, "00")
        Sheets("Sem00").Cells.Copy Destination:=Sheets(Sheets.Count).Range("A1")
        Sheets(Sheets.Count).Range("F1") = i
        Sheets("Recap").Cells(i + 1, 1) = "Sem" & Format(i, "00")
    Next i

je suis sur excel 2002
 

Law

XLDnaute Junior
Re : Méthode Copy qui plante... au bout de la 5ème exécution ??!

Bonjour Pascal, Wilfried, Michel,
Merci pour votre aide.
Michel, j'ai jeté un coup d'oeil sur le lien, déjà ce qui me rassure, c'est que cela ne vient pas d'un bug dans mon code. Je vais essayer de modifier mon code de telle sorte qu'expliqué sur la page de Microsoft ! :)
Je vous tiens au courant !
Bonne journée à vous !

bonjour

j'espère que ce lien pourra t'aider

Copying worksheet programmatically causes run-time error 1004 in Excel


bonne journée
michel
 

Law

XLDnaute Junior
Re : Méthode Copy qui plante... au bout de la 5ème exécution ??!

Bonjour Pascal, Wilfried, Michel,
Merci pour votre aide.
Michel, j'ai jeté un coup d'oeil sur le lien, déjà ce qui me rassure, c'est que cela ne vient pas d'un bug dans mon code. Je vais essayer de modifier mon code de telle sorte qu'expliqué sur la page de Microsoft ! :)
Je vous tiens au courant !
Bonne journée à vous !

Bonjour le forum,
Bon, j'ai implémenté le code fourni par Microsoft (et posté par Michel), et tout semble fonctionner.
Merci à vous trois pour votre collaboration ! :)
 

Discussions similaires

Réponses
5
Affichages
397
Réponses
17
Affichages
926
Réponses
16
Affichages
582

Statistiques des forums

Discussions
312 082
Messages
2 085 169
Membres
102 804
dernier inscrit
edaguo