Critique
Bonjour
J'ai réussit (avec l'aide de certains d'entre vous) à créer le code suivant et je voulais savoir si vous pensiez qu'il est correct ou qu'on peut l'améliorer.
Voici mon code :
Private Sub Worksheet_Change(ByVal Target As Range)
'Quand les cellules de la colonne B change.
'Que le texte de la cellule contient "rifier" alors :
'On met la numérotation de la colonne A à jour et
'On formate les cellule avec bordures.
Dern_ligne = Range("B" & Rows.Count).End(xlUp).Row
If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then
Application.ScreenUpdating = False
Set Page = Worksheets("Page2")
Numero = 1
With Page
For i = 2 To Dern_ligne
If .Cells(i, 2).Value Like "*rifie*" Or .Cells(i, 2).Value Like "*rifié*" Then
.Cells(i, 1) = Numero
Numero = Numero + 1
.Cells(i, 1).Borders.Weight = 2
'.Cells(i, 1).Borders.Color = 1
.Cells(i, 1).Font.Name = "Arial"
.Cells(i, 1).Font.Size = 9
.Cells(i, 1).Font.Bold = True
.Cells(i, 1).HorizontalAlignment = xlCenter
.Cells(i, 1).VerticalAlignment = xlCenter
.Cells(i, 2).Borders.Weight = 2
'.Cells(i, 2).Borders.Color = 1
.Cells(i, 2).Font.Name = "Arial"
.Cells(i, 2).Font.Size = 9
.Cells(i, 2).Font.Bold = False
.Cells(i, 2).WrapText = True
.Cells(i, 2).HorizontalAlignment = xlLeft
.Cells(i, 2).VerticalAlignment = xlCenter
.Cells(i, 2).Offset(0, 1).Borders.Weight = 2
'.Cells(i, 2).Offset(0, 1).Borders.Color = 1
.Cells(i, 2).Offset(0, 1).Font.Name = "Arial"
.Cells(i, 2).Offset(0, 1).Font.Size = 9
.Cells(i, 2).Offset(0, 1).Font.Bold = True
.Cells(i, 2).Offset(0, 1).HorizontalAlignment = xlCenter
.Cells(i, 2).Offset(0, 1).VerticalAlignment = xlCenter
End If
'Si le numéro dans la colonne A est pair et ne contient pas Ctrl on colorie le fond en gris
If Numero Mod 2 = 1 = True And .Cells(i, 1).Value <> "#Ctrl" Then
'.Cells(i, 2).Offset(0, -1).Font.Color = RGB(0, 0, 0)
.Cells(i, 2).Offset(0, -1).Interior.Color = RGB(217, 217, 217)
.Cells(i, 2).Font.Color = RGB(0, 0, 0)
.Cells(i, 2).Interior.Color = RGB(217, 217, 217)
.Cells(i, 2).Offset(0, 1).Font.Color = RGB(0, 0, 0)
.Cells(i, 2).Offset(0, 1).Interior.Color = RGB(217, 217, 217)
'Sinon on supprime le fond
Else:
'.Cells(i, 2).Offset(0, -1).Font.Color = RGB(0, 0, 0)
.Cells(i, 2).Offset(0, -1).Interior.Color = xlColorIndexNone
End If
'Si la cellule dans la colonne A contient Ctrl on applique une couleur de fond et de police
If .Cells(i, 1).Value = "#Ctrl" Then
.Cells(i, 2).Font.Color = RGB(255, 255, 255)
.Cells(i, 2).Interior.Color = RGB(0, 32, 96)
.Cells(i, 2).Offset(0, -1).Font.Color = RGB(255, 255, 255)
.Cells(i, 2).Offset(0, -1).Interior.Color = RGB(0, 32, 96)
.Cells(i, 2).Offset(0, 1).Font.Color = RGB(255, 255, 255)
.Cells(i, 2).Offset(0, 1).Interior.Color = RGB(0, 32, 96)
End If
Next
End With
End If
End SubMerci d'avance pour vos critiques constructives.
re bonjour, pour reprendre ce que je disais sur l'autre post :
Private Sub Worksheet_Change(ByVal Target As Range)
'Quand les cellules de la colonne B change.
'Que le texte de la cellule contient "rifier" alors :
'On met la numérotation de la colonne A à jour et
'On formate les cellule avec bordures.
[barrer]Dern_ligne = Range("B" & Rows.Count).End(xlUp).Row[/barrer]
If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then
Application.ScreenUpdating = False ' c'est bien
Application.EnableEvent = False ' je dirais IMPORTANT car c'est une procédure qui détecte les changements sur la feuille **** ne pas oublier avant la fin du sub à le remettre sur true !!! ****
' donc le mieux tant qu'on travail dessus on arrête la surveillance événementielle qui détecte ces changements
Dern_ligne = Range("B" & Rows.Count).End(xlUp).Row ' uniquement si on a besoin de le calculer
Set Page = Worksheets("Page2")
Numero = 1
With Page
For i = 2 To Dern_ligneAprès suite à un test, en remplissant une ligne sur deux en colonne B, au "premier passage" les couleurs sont bien alternées sur les trois colonnes, mais il suffit de combler un des trous entre deux lignes, la numérotation colonne A se met bien à jour mais il y a des bugs sur les couleurs...
Perso je n'ai pas compris les #CTRL en colonne A vu que c'est VBA qui numérote...
pourquoi ne pas utiliser les MFC d'Excel pour cette mise en couleur et bordure ?
Voilà pour le premier coup d'œil, non pas d'un expert mais bon...
@ bientôt
LouReeD
Merci LouReeD
Je vous joint mon fichier afin de vous montrer ce que je veux obtenir peut être que ma démarche sera plus claire.
Bonjour,
J'ai modifié quelque truc...
En fait j'ai supprimé les offset, vu que l'on connaît les colonnes, visuellement c'est plus simple.
Ensuite j'ai changé l'ordre des tests :
SI en A on a #Ctrl, AORS mise en forme "titre" SINON on met un chiffre si "rifi" trouvé
cette deuxième partie est en deux temps :
SI "rifi" trouvé on met un chiffre, avec une mise en forme "texte"
on test aussitôt la valeur de numéro (pair ou impair) et on modifie les couleurs des cellules.
SI pair alors gris, sinon transparent et ce sur les trois colonnes !
Seulement maintenant on incrémente numéro...
Car dans votre procédure vous incrémentiez numéro dés le début, du coup votre test pair impair se faisait sur numéro"inscrit" +1, ce qui pouvait faire un décalage, non ?
Bref à vous de voir
@ bientôt
LouReeD
Une fois de plus LouReed c'est parfait.
Il est vrai que je m'étais compliqué la tache. "Pourquoi faire simple...."
Pour la gestion des couleurs j'ai juste passé le code
If numero Mod 2 = 1 = Trueà
If numero Mod 2 = 1 = Falsecomme ça les lignes paires sont grises.
Sinon juste une petite question car je suis en train de regarder ce qui concerne les variables :
Si j'utilise plusieurs fois la même donnée (exemple un chemin d'enregistrement) pensez vous qu'il soit préférable de le déclarer dans une variable globale ou public ?
Je sais que je sors de mon sujet initial mais c'est toujours dans le but d'optimiser mon code final.
Encore une fois merci de votre aide .
A mon sens et je peux me tromper global ou public c'est la même chose...
en règle générale les variables définies dans une SUB ou fonction voir même dans les codes des feuilles ou userform sont des variables locales, utilise si on a l'habitude de définir i comme compteur, on le défini comme long dans la sub et ce compteur est "détruit" à la sortie du SUB.
Pour déclarer une variable en globale ou public il faut qu'elle soit déclarée hors d'un SUB dans un module du classeur. Clic droit sur "thisworkbook" insertion "module"
En suite :
Public Compteur as Long
Si vous utilisez cette variable dans un sub quelconque, sa dernière valeur sera conservée à la sortie de ce sub, donc attention.
Dans votre cas ce sera plutôt :
Public Le_Chemin As String
Mais il faudra tôt ou tard lui assigner une valeur, si cette valeur ne bouge pas de toute l'utilisation de l'application le plus simple est de mettre dans le module "open" de thisworkbook :
Le_Chemin = "C:\Users\Default\Docuents\"
Il n'y aura pas d'erreur car la définition des variables est "lancée" avant les procédure "Open" comme la variable est public (globale) elle est bien accessible de "partout" dans le projet.
Enfin je pense
@ bientôt
LouReeD
Merci pour ce complément d'informations
@+