Bonjour amis du forum
Je viens encore vous demander de l'aide , à vous les maitres de l'Excel , sur un sujet déjà très souvent traité , mais je n'arrive pas à faire un tri des doublons en ligne avec sélection de colonnes.
je suis sur un fichier Excel 2003 ,et je bloque sur les doublons en zone sélective
Je m'explique ,sur un planning ,en ligne le jour ,en colonne les prestations ,je ne dois pas avoir deux personnes sur un même poste tenu .par exemple en ligne 4 et 5 j'ai volontairement mis en double deux personnes pour le poste tenu "rondier" et "bungalow" je ne dois pas avoir 2 rondiers au même poste tenu et ceci pour tous les postes , mais je peu avoir plusieurs fois le même poste .
Par journée j'ai plusieurs rondiers , un le matin , un l'après-midi, un le soir ,mais un seul à la fois
Les postes sont sur les colonnes C ; F ; I ; L
les postes tenus sont sur les colonnes D ; G ; J ; M
Je voudrais faire apparaitre un message du genre " Poste déjà tenu par personnel 1 "
Je vous met un morceau de fichier en espérant avoir été azzer claire dans ma demande
Bon weekend à tous
Merci beaucoup pour votre aide
Bonsoir les amis
après de multiples recherches ce code pourrais me convenir ,mais je ne sais pas adapter la plage de données pour les lignes
voila la plage total pour une ligne:
Range( _ "D4,G4,J4,M4,P4,S4,V4,Y4,AB4,AE4,AH4,AK4,AN4,AQ4,AT4,AW4,AZ4,BC4,BF4,BI4,BL4,BO4,BR4,BU4,BX4,CA4" _
).Select
de plus le code couleur jaune je voudrais si possible le passer en noir avec le texte en blanc
'sur la feuille
Private Sub CmdOK_Click()
ColorerDoublons
End Sub
'dans un module
Option Explicit
Sub ColorerDoublons()
Dim plage As Range
Dim Cel As Range
Dim L As Integer, lig As Integer, i As Byte
Application.ScreenUpdating = False
L = Sheets("Exemple").Range("B10000").End(xlUp).Row
'Coloration des doublons
Set plage = Sheets("Exemple").Range("B11:B" & L)
For Each Cel In plage
lig = Cel.Row - 1
If Application.CountIf(Sheets("Exemple").Range("B10:B" & lig), Cel) > 0 Then Cel.Interior.ColorIndex = 6
Next Cel
Range("A1").Select
Application.ScreenUpdating = True
End Sub
bonsoir mon ami Modeste
Merci beaucoup de vous intéresser à mon projet
j'ai énormément simplifier le fichier pour pouvoir le mettre sur le forum d'où le peu de colonne sur l'exemple.
Oui bien sur une MFC conviendrais parfaitement ,mais comment sélectionner les cellules décrite ci-dessus à chaque lignes du calendrier, car je n'ai mis qu'une ligne du fichier sachant qu'il y en a 31 ,une par jour
c'est pourquoi j'ai pensé à une solution par VBA ,mais la je n'en suis pas capable tout seul
Un essai avec le code ci-dessous, à coller dans la feuille de code de Feuil2:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Cells(3, Target.Column) <> "poste tenu" Then Exit Sub
If Target.Count > 1 Then Exit Sub
premier = 0
trouve = False
If Target <> "" Then
For col = 4 To 79 Step 3
If Cells(Target.Row, col) = Target Then
cpt = cpt + 1
If Not trouve Then premier = col: trouve = True
If cpt > 1 Then MsgBox "Poste déjà tenu par " & IIf(premier < Target.Column, Cells(2, premier), Cells(2, col)): Exit Sub
End If
Next col
End If
End Sub
C'est le changement de valeur dans une colonne où "poste tenu" figure en ligne 3 qui déclenche la macro.
J'ai choisi la version où un message est affiché. Si on colore la cellule, il faudra prévoir que la couleur soit supprimée quand on modifiera le contenu d'une des cellules ... le mieux ne serait-il pas d'effacer le contenu, si la même valeur figure déjà dans la ligne??
Merci beaucoup mon ami
c'est pile poil ce que je cherchais , vous êtes formidable , je vous envie de la maitrise que vous avez
juste si possible d'abuser de votre bonté pouvez-vous me mettre quelque ligne d'explication dans le code
et si possible un bouton recommencer annuler qui si j'ai un peu compris les MsBox le code doit être "vbRetryCancel"
Merci pour votre aide
bonne soirée
Commenter le code, ça je peux faire ... mais ... que feraient ces deux boutons "Recommencer" et "Annuler"??
Recommencer, c'est essayer une autre valeur? Et annuler, c'est effacer le contenu?
Pour recommencer, il faut effacer aussi, préalablement ... non? D'où ma proposition d'effacer le contenu, en cas de doublon ... ou y a-t-il quelque chose que je n'ai pas compris??
J'ai commenté et ajouté l'instruction pour effacer la cellule ... à tester "grandeur nature"
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
'si, en ligne 3 de la colonne où on modifie, ne figure pas 'poste tenu', on sort
If Cells(3, Target.Column) <> "poste tenu" Then Exit Sub
'si plus d'une cellule modifiée, on sort
If Target.Count > 1 Then Exit Sub
premier = 0
trouve = False
'pour autant que la cellule ne soit pas vide
If Target <> "" Then
'pour les colonnes de 4 à 79 avec un pas de 4
For col = 4 To 79 Step 3
'si sur la ligne modifiée, pour la colonne scrutée la valeur est identique à celle de la cellule modifiée
If Cells(Target.Row, col) = Target Then
'on incrémente un compteur
cpt = cpt + 1
'si le 'flag' est faux on le bascule à vrai et premier prend le n° de la colonne scrutée
If Not trouve Then premier = col: trouve = True
'si cpt est > 1 (ou = à 2) c'est qu'on a déjà trouvé la valeur
If cpt > 1 Then
MsgBox "Poste déjà tenu par " & IIf(premier < Target.Column, Cells(2, premier), Cells(2, col))
Target = ""
Exit Sub
End If
End If
Next col
End If
End Sub