Rapport de message :*
 

Re: Bug avec code VBA lors d'une copie

Titre du sujet : Re: Bug avec code VBA lors d'une copie
par myDearFriend! le 30/05/2008 20:12:01

Bonjour ascal44,

Je viens d'analyser rapidement ton fichier. L'ensemble donne un traitement relativement complexe et je t'avoue que je n'ai ni le temps, ni l'envie de me plonger à fond dans ce projet. Cela dit, j'y vois déjà plusieurs erreurs de débutant qu'il conviendrait de rectifier si tu souhaites aller plus avant dans ton projet...

On va essayer d'y aller en douceur....

En premier lieu, tu rencontres l'erreur d'exécution 13 "type incompatible" sur la ligne de code suivante :
If Target.Value <> "" And Target.Font.Color <> 8421504 Then
Pourquoi ?
Tout simplement parce qu'à ce moment du déroulement de ton programme, Target n'est pas une cellule isolée mais une plage de cellules ("C6:C26") et qu'un test du type If Target.Value <> "" Then... ne veut rien dire dans ce cas ! Tu ne peux pas comparer la valeur de plusieurs cellules en même temps (dans cette plage, certaines cellules peuvent être vides, d'autres non).

Ensuite, on ne le répètera jamais assez dans les forums, en VBA tu n'as pas besoin de faire de Select de feuilles, plages ou cellules pour pouvoir agir dessus.
Plutôt que :
Sheets("ROSE").Select
    Range
("C6:C26").Select
    Selection
.Copy
    Sheets
("VERT").Select
    Range
("C6").Select
    Selection
.PasteSpecial Paste:=xlPasteValuesOperation:=xlNoneSkipBlanks _
        
:=FalseTranspose:=False
Il conviendrait d'écrire simplement :
Sheets("ROSE").Range("C6:C26").Copy
    Sheets
("VERT").Range("C6").PasteSpecial Paste:=xlPasteValuesOperation:=xlNoneSkipBlanks _
        
:=FalseTranspose:=False
Quels avantages à faire comme ça ?
Eh bien, en t'affranchissant des Select :
[list]
[*]tu gagnes en rapidité d'exécution puisque VBA n'a plus besoin de gérer l'affichage de la sélection (ce qui évite aussi le clignotement désagréable de l'écran quand ton programme s'exécute).
[*]tu évites que des procédures évènementielles comme Worksheet_SelectionChange() se déclenchent inopinément et sèment le bazar dans ton programme (c'est d'ailleurs ce qui t'arrive là !)
[*]tu optimises ton code et le rends plus léger et plus fluide.
[/list]
Dans le cas présent, tu fais des copier-coller des valeurs de cellule seulement... L'enregistreur de macro te propose effectivement le fameux PasteSpecial Paste:=xlPasteValues comme indiqué plus haut :
Sheets("ROSE").Range("C6:C26").Copy
    Sheets
("VERT").Range("C6").PasteSpecial Paste:=xlPasteValuesOperation:=xlNoneSkipBlanks _
        
:=FalseTranspose:=False
En fait, tu auras gros avantage à te passer du Copy-Paste dans ce cas et à affecter directement les valeurs dans la plage réceptrice, comme ça :
Sheets("VERT").Range("H6:30").Value Sheets("ROSE").Range("H6:30").Value
Une seule ligne de code suffit cette fois !

Il y a encore d'autres choses à te dire sur le code de ton classeur (et notamment concernant les protect-unprotect), mais je pense que tu vas déjà avoir pas mal à faire pour comprendre, tester, assimiler et mettre en oeuvre dans ton projet (j'espère) ce que je t'indique ci-dessus...

Image redimensionnée

Cordialement,