Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Nombre de copie de feuille important bloque la macro (debogage)

7 réponses
Avatar
T59
Bonjour,

J'ai une macro qui fait une boucle (avec While .... Wend) pour créer un
classeur avec une feuille par classeur : La macro prend un onglet, le copie,
colle en valeur les formules et déplace l'onglet copié, le renomme et
l'enregistre avec un nom pour chaque classeur.
La boucle fonctionne 30 fois et alors qu'il reste encore au moins 5 boucle à
faire, j'ai le message suivant : "Erreur d’exécution 1004; La méthode Copy de
la classe Worksheet a échoué"
Le code où la macro bloque est le suivant : Sheets("Feuil2").Copy
Before:=Sheets(3)

Comment faire pour que la boucle aille jusqu'au bout sachant que le nombre
de fois où la bucle se fait est aléatoire (en général au moins 20 et au plus
50)

Merci de votre aide

Cdt,

Thomas

7 réponses

Avatar
MichDenis
Bonjour T59,

Si ta procédure bloque sur cette ligne :
Sheets("Feuil2").Copy Before:=Sheets(3)

La ligne de code est correcte. Sauf, est-il possible
que dans ta boucle l'un des objets cités n'existe pas ?

Est-ce que tu as une feuille de calcul appelée "Feuil2"
dans chaque classeur ?
Est-ce que tu as au moins 3 feuilles dans le classeur juste
avant la copie de la feuille pour respecter la position de
la feuille : Before:=Sheets(3) ? Moi, d'après le message
d'erreur reçu, j'opterais pour tester cette option en premier.




"T59" a écrit dans le message de groupe de discussion :

Bonjour,

J'ai une macro qui fait une boucle (avec While .... Wend) pour créer un
classeur avec une feuille par classeur : La macro prend un onglet, le copie,
colle en valeur les formules et déplace l'onglet copié, le renomme et
l'enregistre avec un nom pour chaque classeur.
La boucle fonctionne 30 fois et alors qu'il reste encore au moins 5 boucle à
faire, j'ai le message suivant : "Erreur d’exécution 1004; La méthode Copy de
la classe Worksheet a échoué"
Le code où la macro bloque est le suivant : Sheets("Feuil2").Copy
Before:=Sheets(3)

Comment faire pour que la boucle aille jusqu'au bout sachant que le nombre
de fois où la bucle se fait est aléatoire (en général au moins 20 et au plus
50)

Merci de votre aide

Cdt,

Thomas
Avatar
Michel Angelosanto
C'est un problème connu et résolu semble-t-il dans les dernières versions.
Quand tu dupliques une feuille, il ajoute un 1 dans le nom de la feuille
(celui qu'on voit dans la fenêtre VBA)
Or le nom de la feuille n'accepte que 32 caractères, d'ou le plantage après
une trentaine d'opérations.
la solution, soit renommer les feuilles (pas celui que l'onglet affiche),
soit dupliquer ou insérer à des endroits différents.
A+


"T59" a écrit dans le message de
news:
Bonjour,

J'ai une macro qui fait une boucle (avec While .... Wend) pour créer un
classeur avec une feuille par classeur : La macro prend un onglet, le
copie,
colle en valeur les formules et déplace l'onglet copié, le renomme et
l'enregistre avec un nom pour chaque classeur.
La boucle fonctionne 30 fois et alors qu'il reste encore au moins 5 boucle
à
faire, j'ai le message suivant : "Erreur d’exécution 1004; La méthode Copy
de
la classe Worksheet a échoué"
Le code où la macro bloque est le suivant : Sheets("Feuil2").Copy
Before:=Sheets(3)

Comment faire pour que la boucle aille jusqu'au bout sachant que le nombre
de fois où la bucle se fait est aléatoire (en général au moins 20 et au
plus
50)

Merci de votre aide

Cdt,

Thomas


Michel Angelosanto, Bordeaux, France
Avatar
T59
Bonjour,

Merci pour la piste de reflexion. Par contre, je n'arrive pas à résoudre mon
pb. En utilisant le code suivant "MsgBox Worksheets("TdB Commerce
(2)").CodeName", ça me répond à chaque fois "Feuil15", donc je n'ai pas de pb
de longueur dans CodeName.

Par contre ma macro bloque toujour au classeur 29 quand je copie l'onglet
"TdB Commerce"

Donc pendant 28 fois la macro a bien copié l'onglet, l'a déplacé dans un
nouveau classeur, a enregistré ce classeur et l'a fermé.

Y-a-t-il une solution

"Michel Angelosanto" a écrit :

C'est un problème connu et résolu semble-t-il dans les dernières versions.
Quand tu dupliques une feuille, il ajoute un 1 dans le nom de la feuille
(celui qu'on voit dans la fenêtre VBA)
Or le nom de la feuille n'accepte que 32 caractères, d'ou le plantage après
une trentaine d'opérations.
la solution, soit renommer les feuilles (pas celui que l'onglet affiche),
soit dupliquer ou insérer à des endroits différents.
A+


"T59" a écrit dans le message de
news:
> Bonjour,
>
> J'ai une macro qui fait une boucle (avec While .... Wend) pour créer un
> classeur avec une feuille par classeur : La macro prend un onglet, le
> copie,
> colle en valeur les formules et déplace l'onglet copié, le renomme et
> l'enregistre avec un nom pour chaque classeur.
> La boucle fonctionne 30 fois et alors qu'il reste encore au moins 5 boucle
> à
> faire, j'ai le message suivant : "Erreur d’exécution 1004; La méthode Copy
> de
> la classe Worksheet a échoué"
> Le code où la macro bloque est le suivant : Sheets("Feuil2").Copy
> Before:=Sheets(3)
>
> Comment faire pour que la boucle aille jusqu'au bout sachant que le nombre
> de fois où la bucle se fait est aléatoire (en général au moins 20 et au
> plus
> 50)
>
> Merci de votre aide
>
> Cdt,
>
> Thomas
Michel Angelosanto, Bordeaux, France




Avatar
MichDenis
A ) quand ta macro se plante, as-tu vérifié si le classeur
qui fait usage de cette ligne de code contient au moins 3 feuilles ?

Sheets("Feuil2").Copy Before:=Sheets(3)

Pourquoi ne pas publier la procédure complète
que tu utilises en mentionnant la ligne de code problème ?
Avatar
T59
Bonjour,

Oui j'ai bien vérifier qu'il y avait au moins 3 feuilles.

Voici le code de la boucle qui bug au 29ème classeur. Dans cette boucle,
j'ai 3 variables REG, AGENCE et AAAAMM qui sont définies au début de la macro
"as string"

Sheets("Liste Ag_Régions Macro").Select
Range("A2").Select
i = 2
While Cells(i, 1).Value <> ""
Cells(i, 1).Select
If REG = Cells(i, 1).Value Then
AGENCE = Cells(i, 4).Value
Sheets("TdB Commerce").Select
Range("G1").Value = AGENCE
Calculate
'Copie le TdB Gestion avec les formules
Sheets("TdB Commerce").Select
' C'est ici que ça bloque :
Sheets("TdB Commerce").Copy Before:=Sheets(3)
Sheets("TdB Commerce (2)").Select
'Copie les Formules pour les coller en valeurs
Range("A1:J34").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("AE4:AS24").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("A94:J95").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("A1").Select
Sheets("TdB Commerce (2)").Move
Sheets("TdB Commerce (2)").Name = "TdB Commerce " & AGENCE
ChDir "D:Transfert"
ActiveWorkbook.SaveAs Filename:="D:TransfertTdB Commerce_" &
AGENCE & "_" & AAAAMM, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:úlse, CreateBackup:úlse
ActiveWindow.Close
Windows("Prop TdB").Activate
Sheets("Liste Ag_Régions Macro").Select
i = i + 1
Cells(i, 1).Select
Else
i = i + 1
Cells(i, 1).Select
End If
Wend

Cdt,

Merci

"MichDenis" a écrit :

A ) quand ta macro se plante, as-tu vérifié si le classeur
qui fait usage de cette ligne de code contient au moins 3 feuilles ?

Sheets("Feuil2").Copy Before:=Sheets(3)

Pourquoi ne pas publier la procédure complète
que tu utilises en mentionnant la ligne de code problème ?




Avatar
MichDenis
Bonjour T59,

Je me suis permis de réécrire ta macro.
(évidemment je n'ai pas testé le code...)

Tu te sers de la colonne D:D pour définir ta
variable "AGENCE" qui elle-même sera utile
pour renommer le nom de la feuille créée et
pour identifier le nouveau classeur.

Vérifie que tu n'as pas de cellules vides dans la
Colonne D:D .

Le nom d'une feuille ne peut pas avoir plus de 31
caractères. Est-ce possible que cela arrive quand la
macro plante ?

'-----------------------------------------
Sub test()
Dim Rg As Range, C As Range
Dim ShCommerce As Worksheet
Dim ShCopie As Worksheet

'Utilisation d'une variable objet pour cette feuille
Set ShCommerce = Worksheets("TdB Commerce")

Application.ScreenUpdating = False
With Sheets("Liste Ag_Régions Macro")
Set Rg = .Range("A2:A" & .Range("A65536").End(xlUp).Row)
End With
For Each C In Rg
If UCase(C.Value) = UCase(REG) Then
AGENCE = C.Offset(, 3)
With ShCommerce
.Range("G1") = AGENCE
.Calculate
'Crée un nouveau classeur avec une feuille
.Copy
End With
'Initialise la variable ShCopie
Set ShCopie = ActiveSheet
'Renomme la nouvelle feuille
ShCopie.Name = "TdB Commerce " & AGENCE
'Copie les Formules pour les coller en valeurs
With ShCopie
With .Range("A1:J34")
.Value = .Value
End With
With .Range("AE4:AS24")
.Value = .Value
End With
With .Range("A94:J95")
.Value = .Value
End With
End With
'Sauvegarde du classeur,
'ShCopie.Parent.Name = Nom du Classeur où est la nouvelle feuille
With Workbooks(ShCopie.Parent.Name)
.SaveAs "D:TransfertTdB Commerce_" & AGENCE & "_" & AAAAMM
.Close False
End With
End If
Next
Application.ScreenUpdating = True
End Sub
'-----------------------------------------



"T59" a écrit dans le message de groupe de discussion :

Bonjour,

Oui j'ai bien vérifier qu'il y avait au moins 3 feuilles.

Voici le code de la boucle qui bug au 29ème classeur. Dans cette boucle,
j'ai 3 variables REG, AGENCE et AAAAMM qui sont définies au début de la macro
"as string"

Sheets("Liste Ag_Régions Macro").Select
Range("A2").Select
i = 2
While Cells(i, 1).Value <> ""
Cells(i, 1).Select
If REG = Cells(i, 1).Value Then
AGENCE = Cells(i, 4).Value
Sheets("TdB Commerce").Select
Range("G1").Value = AGENCE
Calculate
'Copie le TdB Gestion avec les formules
Sheets("TdB Commerce").Select
' C'est ici que ça bloque :
Sheets("TdB Commerce").Copy Before:=Sheets(3)
Sheets("TdB Commerce (2)").Select
'Copie les Formules pour les coller en valeurs
Range("A1:J34").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("AE4:AS24").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("A94:J95").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("A1").Select
Sheets("TdB Commerce (2)").Move
Sheets("TdB Commerce (2)").Name = "TdB Commerce " & AGENCE
ChDir "D:Transfert"
ActiveWorkbook.SaveAs Filename:="D:TransfertTdB Commerce_" &
AGENCE & "_" & AAAAMM, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:úlse, CreateBackup:úlse
ActiveWindow.Close
Windows("Prop TdB").Activate
Sheets("Liste Ag_Régions Macro").Select
i = i + 1
Cells(i, 1).Select
Else
i = i + 1
Cells(i, 1).Select
End If
Wend

Cdt,

Merci

"MichDenis" a écrit :

A ) quand ta macro se plante, as-tu vérifié si le classeur
qui fait usage de cette ligne de code contient au moins 3 feuilles ?

Sheets("Feuil2").Copy Before:=Sheets(3)

Pourquoi ne pas publier la procédure complète
que tu utilises en mentionnant la ligne de code problème ?




Avatar
T59
Un grand grand merci car ça fonctionne, mon problème est résolu.

Cdt,

Thomas

"MichDenis" a écrit :

Bonjour T59,

Je me suis permis de réécrire ta macro.
(évidemment je n'ai pas testé le code...)

Tu te sers de la colonne D:D pour définir ta
variable "AGENCE" qui elle-même sera utile
pour renommer le nom de la feuille créée et
pour identifier le nouveau classeur.

Vérifie que tu n'as pas de cellules vides dans la
Colonne D:D .

Le nom d'une feuille ne peut pas avoir plus de 31
caractères. Est-ce possible que cela arrive quand la
macro plante ?

'-----------------------------------------
Sub test()
Dim Rg As Range, C As Range
Dim ShCommerce As Worksheet
Dim ShCopie As Worksheet

'Utilisation d'une variable objet pour cette feuille
Set ShCommerce = Worksheets("TdB Commerce")

Application.ScreenUpdating = False
With Sheets("Liste Ag_Régions Macro")
Set Rg = .Range("A2:A" & .Range("A65536").End(xlUp).Row)
End With
For Each C In Rg
If UCase(C.Value) = UCase(REG) Then
AGENCE = C.Offset(, 3)
With ShCommerce
.Range("G1") = AGENCE
.Calculate
'Crée un nouveau classeur avec une feuille
.Copy
End With
'Initialise la variable ShCopie
Set ShCopie = ActiveSheet
'Renomme la nouvelle feuille
ShCopie.Name = "TdB Commerce " & AGENCE
'Copie les Formules pour les coller en valeurs
With ShCopie
With .Range("A1:J34")
.Value = .Value
End With
With .Range("AE4:AS24")
.Value = .Value
End With
With .Range("A94:J95")
.Value = .Value
End With
End With
'Sauvegarde du classeur,
'ShCopie.Parent.Name = Nom du Classeur où est la nouvelle feuille
With Workbooks(ShCopie.Parent.Name)
.SaveAs "D:TransfertTdB Commerce_" & AGENCE & "_" & AAAAMM
.Close False
End With
End If
Next
Application.ScreenUpdating = True
End Sub
'-----------------------------------------



"T59" a écrit dans le message de groupe de discussion :

Bonjour,

Oui j'ai bien vérifier qu'il y avait au moins 3 feuilles.

Voici le code de la boucle qui bug au 29ème classeur. Dans cette boucle,
j'ai 3 variables REG, AGENCE et AAAAMM qui sont définies au début de la macro
"as string"

Sheets("Liste Ag_Régions Macro").Select
Range("A2").Select
i = 2
While Cells(i, 1).Value <> ""
Cells(i, 1).Select
If REG = Cells(i, 1).Value Then
AGENCE = Cells(i, 4).Value
Sheets("TdB Commerce").Select
Range("G1").Value = AGENCE
Calculate
'Copie le TdB Gestion avec les formules
Sheets("TdB Commerce").Select
' C'est ici que ça bloque :
Sheets("TdB Commerce").Copy Before:=Sheets(3)
Sheets("TdB Commerce (2)").Select
'Copie les Formules pour les coller en valeurs
Range("A1:J34").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("AE4:AS24").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("A94:J95").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Range("A1").Select
Sheets("TdB Commerce (2)").Move
Sheets("TdB Commerce (2)").Name = "TdB Commerce " & AGENCE
ChDir "D:Transfert"
ActiveWorkbook.SaveAs Filename:="D:TransfertTdB Commerce_" &
AGENCE & "_" & AAAAMM, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:úlse, CreateBackup:úlse
ActiveWindow.Close
Windows("Prop TdB").Activate
Sheets("Liste Ag_Régions Macro").Select
i = i + 1
Cells(i, 1).Select
Else
i = i + 1
Cells(i, 1).Select
End If
Wend

Cdt,

Merci

"MichDenis" a écrit :

> A ) quand ta macro se plante, as-tu vérifié si le classeur
> qui fait usage de cette ligne de code contient au moins 3 feuilles ?
>
> Sheets("Feuil2").Copy Before:=Sheets(3)
>
> Pourquoi ne pas publier la procédure complète
> que tu utilises en mentionnant la ligne de code problème ?
>
>