Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Erreur Copy de la classe rectangle (ou ligne)

Michel_ja

XLDnaute Occasionnel
Bonjour, j'ai écrit un code VBA et je fais face à l'"Erreur d'execution "1004" puis au message La méthode copy de la classe Rectangle a échoué.
Un message identique est apparu aussi pour une ligne.
Cela me bloque la macro, puis lorsque j'appuie sur debug et continue la macro cela fonctionne à nouveau jusqu'à un nouveau message identique (situé au même endroit avant la copie d'une shape).
J'ai cherché sur le forum et trouvé un message pour un message proche mais ce n'était pas une shape que c'était la mise à jour d'un TCD. Dans le cas présent j'ai aussi un TCD que je rafraichi en début de macro (pensant éviter cette erreur).
Je joins la copie d'écran et vous remercie par avance de l'intérêt que vous porter à mon bug.
MERCI
 

Pièces jointes

  • issue copy rectangle.jpg
    234.1 KB · Affichages: 37

Michel_ja

XLDnaute Occasionnel
re
bonsoir
met un doevents entre copy et paste
c'est simplement la latence du clipboard qui a empiré depuis 2016
Merci Beaucoup Patrick, ça fonctionne assez bien. Bien sûr ça bloque encore de temps en temps mais beaucoup moins souvent. J'ai placé ici et la des Cutcopymode = false ici et là pour voir si la combinaison fonctionnait encore mieux.
Je me permets de te demander, vu que lorsqu'on appuie sur débug et qu'on continue la macro ça fonctionne bien, est-ce qu'il y aurait la possibilité d'ajouter un bou de code ou une macro différente pour qu'une personne ne connaissant rien à VBA force cette macro à continuer (comme lorsque moi j'appuie sur débug dans vba). Je ne sais pas si je suis clair. Merci
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
tu fait simplement une gestion d'erreur
mais il me faut le code pour savoir ou mettre les commandes
cela dit je suis certain que l'on peut palier à ça en allégeant la procédure
en aménageant les commandes
 

Michel_ja

XLDnaute Occasionnel
re
Bonjour
tu fait simplement une gestion d'erreur
mais il me faut le code pour savoir ou mettre les commandes
cela dit je suis certain que l'on peut palier à ça en allégeant la procédure
en aménageant les commandes
Bonjour Patrick. je t'envoie une partie du code, et notamment la partie où le message apparait souvent (après un copy et avant un paste ---> Code en bleu ci-bat). Tu verrais j'ai mis des Do Events et Application.CutCopyMode = False, à plusieurs endroits pour essayer de résoudre ça.
Merci beaucoup.

Sub TEST_Calendrier()

Application.EnableEvents = False
Sheets("Tab Dyn").PivotTables("Tableau croisé dynamique1").RefreshTable
Application.EnableEvents = True

Worksheets("Tab Dyn").Range("K2:M80").ClearContents

SupprimeShape 'Lance les macros pour obtenir le nb de valeurs Uniques
UniquesSegment 'Lance les macros pour obtenir le nb de valeurs Uniques
UniquesBody
UniquesNameplate


Dim n As Long
n = Worksheets("Tab Dyn").Cells(4, 9)
If n > 50 Then
MsgBox ("Please shorten your selection, too many models are selected")
Exit Sub
End If


taillex = Worksheets("Tab Dyn").Cells(91, 26) 'Worksheets("Tab Dyn").Cells(17, 78) / Cells(6, 9).Value
tailley = Worksheets("Tab Dyn").Cells(11, 7) 'Cells(18, 78)
Dim Unit As Integer
Dim Liste As Integer
Dim Nameplate As String
Dim Body As String
Dim PrevBody As String
Dim PrevSegment As String
Dim PrevNameplate As String
Dim Segment As String
Dim Propulsion As String
Dim Hauteur As Long
Dim Prog As String

DerLigne = Worksheets("Tab Dyn").Range("G1048576").End(xlUp).Row

Worksheets("Tab Dyn").Activate
Hauteur = Worksheets("Tab Dyn").Cells(11, 7).Value

Positionx = 480 'X est la Position Verticale axe des ordonnées, hauteur

For i = 101 To DerLigne
Positionx = Worksheets("Tab Dyn").Cells(i, 15)
Positiony = Worksheets("Tab Dyn").Cells(i, 21) '311 Y est la position horizontale axe des absisses
'For j = 15 To 15
Application.CutCopyMode = False

'On Error Resume Next

If Worksheets("Tab Dyn").Cells(i, 15).Value <> 0 And Worksheets("Tab Dyn").Cells(i, 16).Value <> "" Then
Nameplate = Worksheets("Tab Dyn").Cells(i, 10).Text 'Col Nameplate

Propulsion = Worksheets("Tab Dyn").Cells(i, 14).Value
Prog = Worksheets("Tab Dyn").Cells(i, 12).Value

Worksheets("Planning").Activate
'ActiveSheet.Shapes("Hachurage" & (j - 22)).Select

If Propulsion = "ICE" Then ActiveSheet.Shapes("ICE").Select
If Propulsion = "ICE & Electric" Then ActiveSheet.Shapes("ICEElec").Select
If Propulsion = "ICE & Electric & Hybrid" Then ActiveSheet.Shapes("ICEElecHybr").Select
If Propulsion = "ICE & Hybrid" Then ActiveSheet.Shapes("ICEHybr").Select
If Propulsion = "Electric & Hybrid" Then ActiveSheet.Shapes("ElecHybr").Select
If Propulsion = "Electric" Then ActiveSheet.Shapes("Elec").Select
If Propulsion = "Hybride" Then ActiveSheet.Shapes("Hybr").Select
If Propulsion = "Check" Then ActiveSheet.Shapes("Model").Select
End If

Application.CutCopyMode = False
DoEvents
'Application.CutCopyMode = False

Selection.Copy
DoEvents
ActiveSheet.Paste
Selection.ShapeRange.Name = "Nameplate" & i
Selection.ShapeRange.Left = Positiony
Selection.ShapeRange.Top = Positionx
Selection.ShapeRange.Width = Worksheets("Tab Dyn").Cells(i, 20).Value 'Longueur du rectangle
Selection.ShapeRange.Height = Worksheets("Tab Dyn").Cells(11, 7).Value
With Selection.ShapeRange.TextFrame
.Characters.Text = Nameplate & " (" & Prog & ")"
.Characters.Font.Bold = True
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With


Application.CutCopyMode = False

Next i
 

Michel_ja

XLDnaute Occasionnel
re
Bonjour
tu fait simplement une gestion d'erreur
mais il me faut le code pour savoir ou mettre les commandes
cela dit je suis certain que l'on peut palier à ça en allégeant la procédure
en aménageant les commandes
Bonjour Patrick,
en fouillant un peu sur Internet, j'ai lu via ce lien qu'il est déconseillé d'utiliser .Select ou .Activate. Ils donnent des exemples pour sélectionner une range sans passer par select avec Set.... mais il n'y a pas d'exemple pour sélectionner une shape (sans Select ou Activate). Aurais-tu une piste ? Merci
 

patricktoulon

XLDnaute Barbatruc
Bonjour
heu...
ben de la même manière que les ranges

set mashape=activesheet.shapes("toto")
ou même si la shapes n'est pas sur la feuille active
set mashape=sheets("Feuil1").shapes("toto")
ou avec le codename de la feuille
set mashape=Feuil3.shapes("toto")

tu peux mettre l'index a la place du nom aussi
set mashape=activesheet.shapes(2)'la 2d shape de la feuille active
tu fait ce que tu veux avec après
mashape.copy
mashape.delete
mashape.left=mashape.parent.[A1].left
etc...etc...blablabla
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…