Problème de macros pour couleur cellule
Bonjour le forum,
J'ai un problème avec mes macros, sur les fichiers fourni en exemple, j'ai repris les principales infos du fichier original (copie d'une partie des onglets):
Pourriez-vous me dire pourquoi sur le fichier "problemecolor" lorsque:
Je modifie une cellule E d'une ligne déjà rempli, la cellule E change de nom, J change de nom et la couleur change, mais si' j'insère une ligne, voir le fichier "problemecolor1" lorsque:
-J'insère une ligne et que je remplis la cellule E, la cellule de J ne se rempli pas, ni se colorie, mais on voit que dans la cellule N les 3 lettres apparaissent
-Je modifie une cellule E d'une ligne déjà rempli, la cellule E change de nom, J change de nom mais garde la couleur de la désignation précédente
-Je ferme le "problemecolor1" et que je le réouvre, je peux à nouveau faire des modifications dans les lignes existantes et si je reclique sur la cellule E déjà rempli que je resélectionne , ça fonctionne voir "problemecolor2", mais si j'insère des lignes ça rebugue voir "problemecolor3"
Si quelqu'un à une idée , je suis preneur...
Merci d'avance;
B.A.
Bonjour,
Déjà permet moi de te dire que je n'aimerais pas travailler sur ce genre de fichier
dans lequel on peut pas ce déplacer comme on le souhaite avec les flèches de déplacement.
Perso je préfère interdire la saisie dans certaines colonnes.
Ensuite pour ton problème, lorsque tu crées une nouvelle ligne, tu ne lance pas la mise en couleur de celle-ci
de plus tu as une erreur de frappe à la fin "Truee" au lieu de "True"
'Activer les évenements
Application.EnableEvents = Truee
Bonjour BrunoM45,
Merci de t'être penché sur mon problème...
Je suis toujours preneur de bonnes idées...
Déjà permet moi de te dire que je n'aimerais pas travailler sur ce genre de fichier
dans lequel on peut pas ce déplacer comme on le souhaite avec les flèches de déplacement.
Il faut voir ce fichier comme un registre annuel que l'on rempli une fois pour toute et pour les premières colonnes jusqu'à la colonne "U" ça ne doit pas évoluer, mise à part le rajout de nouveau matériel...
Perso je préfère interdire la saisie dans certaines colonnes.
Pourrais-tu m'en dire plus sur ta façon de voir pour interdire la saisie dans certaines colonnes, peut-être fais-tu allusion au "offset" de certaines cellules, c'est ce que j'ai trouvé en cherchant sur le forum et qui fonctionne, car avec le verrouillage des cellules j'ai calé dessus, je suis novice en VBA, je cherche, j'adapte et quand ça fonctionne que demande le peuple... Tu vois, le fait d'écrire la phrase précédent ça me fait penser qu'il faudrait "verrouiller" ce qui a déjà été saisi pour éviter les modifications "involontaires"!
Ensuite pour ton problème, lorsque tu crées une nouvelle ligne, tu ne lance pas la mise en couleur de celle-ci
de plus tu as une erreur de frappe à la fin "Truee" au lieu de "True"
La couleur de la cellule doit se lancer avec l'appel de la macro du module "ColorCells"!
Bien vu, le "Truee", t'as de bons yeux!
Merci encore de ton aide.
B.A.
Bonjour BrunoM45,
Un petit up, pour les questions posées...
B.A.
Re,
Dans ton bouton NewLine, il faut ajouter une ligne à la fin
Private Sub CommandButton1_Click()
'Avec l'onglet "PORtail"
With Sheets("PORtail")
'Désactiver l'actualisation de l'écran
Application.ScreenUpdating = False
'Désactiver la barre d'état
Application.DisplayStatusBar = False
'détermine la première ligne vide en "A3"
DL = .Range("A3").End(xlDown).Row + 1
'insert une nouvelle ligne à cet endroit
.Rows(DL).Insert Shift:=xlDown
'copie la plage "A:AV de la ligne précédente
.Range(.Cells(DL - 1, 1), .Cells(DL - 1, 48)).Copy
'colle le format de cette plage dans la nouvelle ligne
.Range("A" & DL).PasteSpecial Paste:=xlFormats
'et y colle la plage
ActiveSheet.Paste
'désactive le mode copier/coller
Application.CutCopyMode = False
'Vide les cellules de E à E sur la ligne copiée
.Range(.Cells(DL, 5), .Cells(DL, 5)).ClearContents 'Ok
'Vide les cellules de G à I sur la ligne copiée
.Range(.Cells(DL, 7), .Cells(DL, 9)).ClearContents 'Ok
'Vide les cellules de O à AD sur la ligne copiée
.Range(.Cells(DL, 15), .Cells(DL, 30)).ClearContents 'Ok
'Vide les cellules de AJ à AQ sur la ligne copiée
.Range(.Cells(DL, 36), .Cells(DL, 43)).ClearContents 'Ok
'Sélection de la première cellule vide de la colonne J
Range("J" & Rows.Count).End(xlUp).Offset(1).Select
Dim i As Integer
For i = 3 To 300
If Cells(i, 10) = "" Then 'Si pas de valeur = "" alors
Cells(i, 10).Interior.ColorIndex = -4142 'Pas de couleur
End If
Next i
'Sélection de la première cellule vide de la colonne E
Range("E" & Rows.Count).End(xlUp).Offset(1).Select
' Modification du 22/09
' Il faut activer la couleur de cellule ICI
Call ColorCells
'Activer la barre d'état
Application.DisplayStatusBar = True
'Activer les évenements
Application.EnableEvents = True
End With
End Sub
Pour ce qui est de la protection de la saisie
1) tu désactives le début ton code dans SelectionChange
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Si la plage sélectionnée (Target) se trouve dans la plage, alors
'If Not Intersect(Target, Range("A:A, D:D, F:F, J:N, AE:AI, AR:AV")) Is Nothing Then
'Décaler d'une cellule sur la droite
'Target.Offset(, 1).Activate
'End If
2) Tu modifie le début de ton code sans Change
Private Sub Worksheet_Change(ByVal Target As Range)
'Si la sélection (Target) se trouve dans la plage, alors
If Not Intersect(Target, Range("A:A, D:D, F:F, J:N, AE:AI, AR:AV")) Is Nothing Then
' Désactiver les évènements
Application.EnableEvents = False
Application.Undo
' Eventuellement un petit message
MsgBox "Vous ne pouvez pas modifier cette cellule !", vbCritical, "OUPS..."
' Réactiver les évènements
Application.EnableEvents = True
' Sortir, pas besoin d'aller plus loin
Exit Sub
End If
Voilà ;-)
Je ne sais pas si tu avais d'autres questions ?
@+
Re bonjour,
Merci encore pour ton aide, j'ai un petit problème avec la macro pour la protection dess colonnes, lorsque je crée une nouvelle ligne:
Le debogage met en jaune la ligne: Application.Undo
Private Sub Worksheet_Change(ByVal Target As Range)
'Si la sélection (Target) se trouve dans la plage, alors
If Not Intersect(Target, Range("A:A, D:D, F:F, J:N, AE:AI, AR:AV")) Is Nothing Then
' Désactiver les évènements
Application.EnableEvents = False
Application.Undo
' Eventuellement un petit message
MsgBox "Vous ne pouvez pas modifier cette cellule !", vbCritical, "OUPS..."
' Réactiver les évènements
Application.EnableEvents = True
' Sortir, pas besoin d'aller plus loin
Exit Sub
End If
Si je mets la ligne en commentaire, je referme le fichier et le réouvre et que je relance "nouvelle ligne", le message "Vous ne pouvez pas modifier cette cellule" apparait et il faut cliquer sur "ok" plusieurs fois pour le faire disparaître!
Si tu as une idée...
B.A.
Re,
Il faut modifier le code pour ne pas qu'il s'exécute quand on ajoute une ligne
Private Sub Worksheet_Change(ByVal Target As Range)
'Si la sélection (Target) se trouve dans la plage, alors
If Not Intersect(Target, Range("A:A, D:D, F:F, J:N, AE:AI, AR:AV")) Is Nothing Then
' Ne pas exécuter cette procédure en cas d'ajout d'un ligne
If Target.Columns.Count = ActiveSheet.Columns.Count Then Exit Sub
' Désactiver les évènements
Application.EnableEvents = False
Application.Undo
' Eventuellement un petit message
MsgBox "Vous ne pouvez pas modifier cette cellule !", vbCritical, "OUPS..."
' Réactiver les évènements
Application.EnableEvents = True
' Sortir, pas besoin d'aller plus loin
Exit Sub
End If
Voilà
Re,
J'ai toujours le problème avec Application Undo
Erreur d'exécution '1004'
La méthode 'Undo'_Application' a échoué
Et idem si je mets la ligne en commentaire, je referme le fichier et le réouvre et que je relance "nouvelle ligne", le message "Vous ne pouvez pas modifier cette cellule" apparait et il faut cliquer sur "ok" plusieurs fois pour le faire disparaître!
Par contre en mettant la ligne du message en commentaire, ça fonctionne, donc je ferai sans message!
J'approfondirai demain et te tiendrai au courant...
@+
Bonjour BrunoM45,
Est-ce qu'il y aurait une autre solution, car avec un message ça fait vraiment plus convivial?
B.A.