la méthode range de l'objet worksheet a echoué

michaelexcel

XLDnaute Nouveau
Bonjour à tous,

J'ai un bug dans ma programmation que je ne comprends pas. Je n'arrive pas à faire un fichier à mettre dans le forum, je vais essayer de vous donner les infos dans le message.

Voici la page sur laquelle je travaille. Il s'agit de mettre une priorité sur chaque projet en cliquant sur l'étoile.
upload_2017-6-12_11-31-5.png


Quand on clique sur une étoile, on lance les macros suivantes (jusque là tout fonctionne...) :

Sub EtoileA1()
Application.ScreenUpdating = False
If [C4] <> "" Then
Sheets("Todolist").[H2] = 1
Call ImportanceA1
End If
End Sub

Sub ImportanceA1()
Sheets("PRIORITE").Shapes.Range(Array("5-Point Star 14")).Select
With Selection.ShapeRange.Fill
.ForeColor.RGB = RGB(255, 0, 0)
End With
With Selection.ShapeRange.Line
.ForeColor.ObjectThemeColor = msoThemeColorAccent1
.ForeColor.Brightness = -0.25
End With

Sheets("PRIORITE").Shapes.Range(Array("5-Point Star 17", "5-Point Star 18")). _
Select
With Selection.ShapeRange.Fill
.ForeColor.ObjectThemeColor = msoThemeColorAccent1
.ForeColor.Brightness = -0.25
End With
With Selection.ShapeRange.Line
.ForeColor.ObjectThemeColor = msoThemeColorAccent1
.ForeColor.Brightness = -0.25
End With
Range("B1").Select
End Sub


J'ai également réalisé une macro quand on ouvre la page ou quand on la modifie et qui permet de sauver les choix. Je ne met que la programmation pour le premier projet.

Private Sub Worksheet_Activate()
If Sheets("Todolist").[G2] = 0 Then
Call ImportanceA0
End If
If Sheets("Todolist").[G2] = 1 Then
Call ImportanceA1
End If
If Sheets("Todolist").[G2] = 2 Then
Call ImportanceA2
End If
If Sheets("Todolist").[G2] = 3 Then
Call ImportanceA3
End If
End Sub

Les projets pouvant changer, j'ai besoin de copier coller deux colonnes dans ("Todolist") afin de sauver tous les changements. J'ajoute donc au début de la Private Sub Worksheet_Activate() :

Sheets("Todolist").Range("I2:I13").Copy
Sheets("Todolist").Range("E2:E13").PasteSpecial Paste:=xlPasteValues

Ces deux lignes fonctionnent toutes seules mais, quand elles se font dans Private Sub Worksheet_Activate(), alors ça bug et excel m'indique "la méthode range de l'objet worksheet a echoué" sur la ligne que j'ai mis en gras. Pour info, il s'avère que la colonne a bien été copiée pourtant..

Je ne sais même pas où chercher l'erreur... Je me demande s'il ne fait pas une boucle infini de qqch.

D'avance merci si vous trouvez...
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Michael, bonjour le forum,

Pas vraiment lu tout ton laïus... Il faut que le classeur (si c'est dans un autre classeur) et l'onglet soit actifs avant de copier :

VB:
Worksbooks(Ton_Classeur.xlsx").Activate
ActiveWorbook.Sheets("Todolist").Activate
ActiveWorbook.Sheets("Todolist").Range("I2:I13").Copy
 

michaelexcel

XLDnaute Nouveau
Bonjou Robert,

Merci beaucoup. Hélas ça ne débloque pas.

Quand j'active la page le bug se déplace dans le code qui change les étoiles de couleurs. Mais si je réactive la première page après le copier-coller et le bug initiale recommence.

Sheets("Todolist").Activate
Sheets("Todolist").Range("I2:I13").Copy
Sheets("Todolist").Range("E2:E13").PasteSpecial Paste:=xlPasteValues
Sheets("PRIORITE").Activate
...
 

michaelexcel

XLDnaute Nouveau
Bonjour,

En continuant à chercher, j'ai davantage isolé le problème. La sub se coince uniquement dans Private Sub Worksheet_Activate(). J'ai l'impression que, pendant la macro, la page est activée ce qui la relance en boucle..
Comment puis-je dans une Private Sub Worksheet_Activate(), agir sur une autre page, revenir sur la page d'origine sans redéclencher la sub?
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Déja en évitant tous les Select inutiles tu risques de résoudre le problème. Sinon pour empêcher de boucler il faut annuler les macro événementielles au début de la macro avec :

VB:
Application.EnableEvents = False
Qui ne faut surtout pas publier de rétablir à la fin avec :
VB:
Application.EnableEvents = True
Si ta macro plante en cours avant le rétablissement, les macros événementielles seront désactivées. pense à créer une macro nommé Retab (par exemple) :
VB:
Sun Retab()
Application.EnableEvents = True
End Sub
Que tu pourras lancer dans ce cas t'évitant de fermer et rouvrir le classeur...

Mais, sans fichier impossible de dire plus...
 

michaelexcel

XLDnaute Nouveau
Génial, c'est exactement ça. Merci beaucoup!!! Tout fonctionne parfaitement...

Je retiens le réflexe de retirer les select inutiles pour la suite. Dans ce cas présent, j'ai ajouté Range("B1").Select en fin de macro pour qu'Excel déselectionne les images modifiées. Y a-t-il un autre moyen?
 

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 341
Membres
111 107
dernier inscrit
cdel