Modification couleur de fond et de texte dans une macro d'archivage
Bonjour à tous,
J'ai besoin de votre aide car je suis bloqué sur ma macro d'archivage.
Pour vous mettre dans le contexte, ma macro me permets d'enregistrer le fichier découverte clients dans un dossier à son nom puis de mettre à jour le fichier en réinitialisant toutes les cellules de ce fichier.
Mais en testant mon fichier je me suis rendue compte d'un petit souci. En effet, la cellule E35 me permet de dire si l'adresse des travaux est la même que l'adresse de facturation si c'est le cas alors la cellule E37 renvoie les données de la cellule E14 et la cellule E39 renvoie les données de la cellule E16 grâce à une formule écrite en E37 et en E39. Si ce n'est pas le cas alors je renseigne la nouvelle adresse dans E37 et E39 ce qui à pour résultat d'effacer les formules respectives de ces cellules.
Je vous joins mon code car je n'arrive pas à sortir le fichier.
Merci d'avance pour votre aide.
tissaraz
Sub Archivage()
'Déclaration des variables:
Dim NomDossier As String
Dim CheminDossier As String
On Error GoTo 1
'Je désactive la protection de la feuille:
ActiveSheet.Unprotect
'Je désactive les messages d'alerte:
Application.DisplayAlerts = False
'Je test que le nom du client à bien été saisie ou pas:
If IsEmpty(Range("E10")) = True Then
MsgBox "***Attention*** Vous n'avez pas renseigné le nom du client." & vbCrLf & _
"Merci de faire le necessaire avant de sauvegerder le fichier", vbOKOnly
Range("E10").Select
'Sinon
Else
'création d'un dossier avec le nom de la cellule E10
MkDir "E:\x\y\LE_SERVICE_POSE\DOSSIERS_DE_POSE\" & Range("E10")
With ActiveWorkbook 'fonction activeworkbook ne fonctionne pas en mode protégé.
'Enregistrement du classeur portant le nom de la cellule E10 dans le dossier créé au dessus
Nom = "E:\x\y\LE_SERVICE_POSE\DOSSIERS_DE_POSE\" & Range("E10")
.SaveAs Filename:=Nom & "\" & "FORMULAIRE " & Range("E10"), FileFormat:=xlOpenXMLWorkbookMacroEnabled
End With
'Je selectionne une plage de cellules que je réinitialise:
If Range("E10") <> "" Then
Range("E8,E10,E12,E14,E16,E18,E20,E22,E24,E26,E28,E30").Select
Selection.ClearContents
End If
If Range("E35") <> "" Then
Range("E35,E37,E39,E41,E43,E45,E51,E53,E55,E57,E59,E61").Select
Selection.ClearContents
Range("E36").Copy Range("E37")
Range("E37").Select
'je modifie la couleur du texte et du fond de la cellule E37 en noir et blanc:
Selection.Font.ColorIndex = RGB(0, 0, 0)
Selection.Interior.Color = RGB(255, 255, 255)
'j'ajoute une bordure autour de la cellule E37:
ActiveCell.Borders.Weight = 1
ActiveCell.Borders.Color = RGB(0, 0, 0)
Range("E38").Copy Range("E39")
Range("E39").Select
'je modifie la couleur du texte et du fond de la cellule E39 en noir et blanc:
Selection.Font.ColorIndex = RGB(0, 0, 0)
Selection.Interior.Color = RGB(255, 255, 255)
'j'ajoute une bordure autour de la cellule E39:
ActiveCell.Borders.Weight = 1
ActiveCell.Borders.Color = RGB(0, 0, 0)
End If
If Range("E66") <> "" Then
Range("E66,E68,E70,E72,E74,E76,E78,E80,E92").Select
Selection.ClearContents
End If
If Range("E99") <> "" Then
Range("E99,E101,E119,E121,E123").Select
Selection.ClearContents
End If
'On selectionne la première cellule du fichier
Range("E8").Select
If IsEmpty(Range("E8")) = True Then
With ThisWorkbook 'fonction activeworkbook ne fonctionne pas en mode protégé.
'Enregistrement du classeur vierge.
.SaveAs Filename:="E:\x\y\LE_SERVICE_POSE\" & "FORMULAIRE DECOUVERTE", FileFormat:=xlOpenXMLWorkbookMacroEnabled
End With
'On affiche un message informant que le fichier a bien été sauvegardé.
MsgBox "Le fichier a bien été sauvegardé et le formulaire découverte a été mis a jour."
End If
'Je réactive la gestion des alertes:
Application.DisplayAlerts = True
'Je reprotège la feuille:
ActiveSheet.Protect
1
'Je ferme le fichier:
Application.Quit
End If
End SubBonsoir,
et plutôt que de copier la cellule si vous ne copiez que sa valeur : Range("E37")=Range("E36").Value ? Du coup les lignes de codes pour la modification de format ne sont plus utiles.
Sinon pour info, en VBA on peut "travailler" sur des cellules (ou plage) sans avoir besoin de les sélectionner, ceci accélère le code et c'est plus propre.
Voici une correction possible d'une partie de votre code :
à la place de :
If Range("E10") <> "" Then
Range("E8,E10,E12,E14,E16,E18,E20,E22,E24,E26,E28,E30").Select
Selection.ClearContents
End Ifmettre :
If Range("E10") <> "" Then
Range("E8,E10,E12,E14,E16,E18,E20,E22,E24,E26,E28,E30").ClearContents
End If@ bientôt
LouReeD
Bonjour LouReeD,
J'ai appliqué les modifications que tu m'as suggéré mais cela ne fonctionne pas mon fichier ne réinitialise plus aucune cellules.
Je ne comprends pas pourquoi ce la fonctionne avec le .select mais pas avec la version simplifié.
Du coup je vais remettre la version .select au moins pour vérifier que le .value fonctionne comme il faut.
Aurais-tu une idée de ce qui cloche?
Je reviens vers toi dès que je l'ai testé.
Merci de ton aide
Tissaraz
Bonjour,
Après l'avoir testé ma théorie c'est avéré être fausse, que je mette le .select ou la version simplifié cela ne fonctionne plus
Je ne comprends pas je n'ai pourtant rien changé à mon code d'origine.
avez vous des idées sur ce qui cloche? Je vais continuer de chercher de mon coté.
Tissaraz
rebonjour,
J'ai essayé plusieurs chose pour comprendre mais je reste dans le flou.
En mettant des MsgBox à chaque étape j'ai pu déterminer à partir de où ça coince et il se trouve que c'est sur la deuxième partie de la suppression. Quoique je fasse le MsgBox "2" n'apparaît pas et mon fichier ce ferme.
J'ai essayé de changer l'ordre des lignes, j'ai essayer de retirer les deux premières lignes pour voir si l'effacement des cellules fonctionneraient mais non!
J'avoue être à cours d'idées!!!
HELP ME !!!!!!!
If Range("E10") <> "" Then
Range("E8,E10,E12,E14,E16,E18,E20,E22,E24,E26,E28,E30").ClearContents
End If
MsgBox "1"
If Range("E35") <> "" Then
Range("E37") = Range("E36").Value
Range("E39") = Range("E38").Value
Range("E35,E41,E43,E45,E51,E53,E55,E57,E59,E61").ClearContents
End If
MsgBox "2"Bonjour,
Vous devriez fournir votre fichier afin de comprendre ce qui se passe au niveau du code, mais avant il faut le rendre "anonyme" en fonction des données, voir en créer une copie "plus petite" pour qu'elle puisse "passer" sur le site.
@ bientôt
LouReeD
Bonjour,
Je vous joins mon fichier simplifié en espérant que cela pourra nous aider à résoudre mon problème.
J'ai essayé le .value mais ça ne correspond pas à ce dont j'ai besoin car vu que je réinitialise mes cellules la valeur affiché est 0 sauf que lorsque je veux le remplir à nouveau ma formule n'existe pas puisque ma cellule est égale à 0 et non à ma formule.
Me revoilà au point de départ avec mon .copy et ma modification de couleur du fond et du texte avec l'encadrement en plus qui ne fonctionne pas.
Merci d'avance pour votre aide
Tissaraz
Bonsoir,
un essai de tranformation :
Range("E36").Copy
Range("E37").PasteSpecial Paste:=xlPasteFormulasEn fait on copie, mais on ne colle que la formule
Avec un fichier c'est plus simple pour comprendre. A vous de me dire si cela convient !
@ bientôt
LouReeD
Bonjour,
J'ai testé le code et ça copie effectivement la formule, c'est cool ça avance
Lorsque je lance la macro, celle-ci s'arrête toujours après la copie, elle ne m'affiche pas le msgbox 2 et du coup ne réinitialise pas les cellules.
Aurais-tu une idée de ce qui bloque, parce que cela fonctionnait avant.
Tissaraz
Bonjour,
lors de la phase de développement d'une application il faut éviter de mettre des on Error Resume Next ou Goto, car ceci masque les erreurs et le type d'erreur rencontrées par le code. Ici lors de la copie de e36 ou la deuxième copie ou bien l'initialisation des cellules doit provoquer une erreur mais le code "obéit" à On Error Goto 1 et il va à "1" suite à l'erreur, la procédure est finie...
Mettez en commentaire le on error goto 1 et relancer la procédure, VBA vous indiquera le problème rencontré.
@ bientôt
LouReeD
Bonjour,
Il m'affiche en surbrillance la ligne
Range("E35,E41,E43,E45,E51,E53,E55,E57,E59,E61").ClearContents
Je n'ai pas l'impression d'avoir d'erreur dans cette ligne, est-il possible que la cellule E45 qui représente la fusion des cellules 45,46,47,48,49 pose problème? Dois-je l'écrire autrement?
Tissaraz
Bonsoir
essayez en mettant de 45 à 49 comme vous venez de l'écrire.
Sinon une solution simple c'est de sélectionner vos cellules, et de donner un "Jolinom" à cette sélection en utilisant le champ texte qui se trouve à gauche de la barre de formule.
Une fois ceci fait, dans le code VBA vous inscrivez : Range("Jolinom").ClearContents
A voir si cela passe mieux...
@ bientôt
LouReeD
Bonjour,
Alors si je mets toutes les cellules de E45 à E49 ça ne fonctionne pas, ma ligne reste en erreur.
Si je renomme la plage de cellule fusion1, que je supprime les cellules E45 à E49 et que j'ajoute la ligne Range("fusion1").ClearContents ça ne fonctionne pas non plus
J'ai essayé en défusionnant les cellules et en gardant uniquement la première ligne avec les cellules de E45 à E49. ÇA FONCTIONNE!!!!!!!!!!
J'aurai quand même préférer laisser mes cellules fusionnées pour une utilisation plus fluide.
Aurais-tu une idée?
Tissaraz
Bonjour,
Range("E35,E41,E43,E45:E49,E51,E53,E55,E57,E59,E61").ClearContents
@ bientôt
LouReeD
Bonjour,
Il s'avère que c'était si simple, j'aurai du y penser. Je ne me ferai pas avoir deux fois.
J'ai encore un point qui me chiffonne et je te laisse tranquille. Lorsque je copie ma formule E36 dans la cellule E37 celle ci garde la couleur grise de la cellule E36, comment faire pour la mettre en noir.
J'ai essayé la formule Range("E37").Font.Color=RGB(0,0,0) j'ai trouvé cette ligne de code dans le cours VBA de ce site.
Mais cette ligne ce met en erreur lorsque je lance la macro.Est-ce que je ne l'applique pas comme il faut?
Tissaraz
Bonjour,
Est-il possible que le problème vienne du fait que ce code ne fonctionne qu'avec une cellule pleine? La cellule ayant été réinitialisée elle est vide, s'il n'y a pas de texte dans la cellule le code se met en erreur car il ne trouve rien à modifier, est-ce possible? si c'est le cas, comment contourner ça? en plaçant la ligne de code à un autre endroit?
Tissaraz
Bonsoir,
l'instruction n'a pas besoin de texte pour changer le format de la cellule.
Par contre votre feuille a un code de surveillance événementielle de "Change", donc votre code modifie une cellule, c'est détecté par le code de surveillance qui se déroule plus ou moins, mais cela va au moins jusqu'à la remise en place de la protection de feuille, et là c'est le drame...
Donc soit vous ré enlever la protection de la feuille après chaque modification de cellule soit vous stopper en début de code les surveillance événementielles, pour ce faire il faut "juste" ajouter cette instruction en début de code : Application.EnableEvents = False et il ne faut surtout pas oublier de le remettre à True en fin de code sinon plus aucune activité sur la feuille ne sera détectée : Application.EnableEvents = True.
Quand j'utilise ce genre d'instruction sous Excel je me prépare une petite procédure de "récupération" :
Sub Oups()
Application.EnableEvents = True
End SubComme cela si ça plante avant le "True", sous VBA je le remet en place !
@ bientôt
LouReeD
Bonsoir LouReeD
Je te remercie pour tout ce que tu m'as appris, tout fonctionne comme il faut.
A bientôt
Tissaraz
Bonsoir,
merci de votre retour et de vos remerciements !
@ bientôt
LouReeD