Doublon en ligne et colonne sélective

La Vouivre

XLDnaute Occasionnel
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
 

Pièces jointes

  • doublon ligne.xlsx
    85.3 KB · Affichages: 40

La Vouivre

XLDnaute Occasionnel
Re : Doublon en ligne et colonne sélective

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
 

Modeste

XLDnaute Barbatruc
Re : Doublon en ligne et colonne sélective

Bonsoir La Vouivre,

S'il s'agit de colorer, pourquoi pas une MFC :confused:

Par ailleurs, au moment où je pensais avoir compris ta demande, je lis
Range( _ "D4,G4,J4,M4,P4,S4,V4,Y4,AB4,AE4,AH4,AK4,AN4,AQ4,A T4,AW4,AZ4,BC4,BF4,BI4,BL4,BO4,BR4,BU4,BX4,CA4" _
).Select
Et là ... je ne vois plus du tout le rapport avec ton fichier!? Tu nous parlais de D, G, J et M :confused:
 

La Vouivre

XLDnaute Occasionnel
Re : Doublon en ligne et colonne sélective

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
 

Modeste

XLDnaute Barbatruc
Re : Doublon en ligne et colonne sélective

Re,

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??
 

La Vouivre

XLDnaute Occasionnel
Re : Doublon en ligne et colonne sélective

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
 

Modeste

XLDnaute Barbatruc
Re : Doublon en ligne et colonne sélective

Re,

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??
 

Modeste

XLDnaute Barbatruc
Re : Doublon en ligne et colonne sélective

Allez, avant d'aller au lit ...

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
 

La Vouivre

XLDnaute Occasionnel
Re : Doublon en ligne et colonne sélective

le code fonctionne parfaitement sur le fichier

Merci beaucoup pour votre précieuse aide, ce code m'apprend un peu le langage VBA
Je vais pouvoir adapter cette macro à d'autre fichier grâce à vous

encore un très gros merci pour votre précieuse aide
 

Discussions similaires

Réponses
10
Affichages
403

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 678
dernier inscrit
arno12345678