Vérification de plusieurs nom dans la même colonne d'un tableau

Bonjour à tous

Je suis en trai d'améliorer un tablea excel existant sur la gestion du planning des techniciens.
J'ai une colonne par jour à partir de la colonne I de mon tableau.

Je vais vérifier que le même technicien n'est pas utilisé sur deux interventions de la même journée par Worksheet_Change(ByVal Target As Range)

Public Flag As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
If Flag Then Exit Sub
If InStr(1, Target, "-", vbTextCompare) Then MsgBox "Vérifiez bien q'aucun des techniciens n'est pas déja occupé sur cette journée", vbInformation, "Attention !"
Dim mColFinal As String
Dim mCol As Integer
' on prends le numéro de la colonne active
mCol = ActiveCell.Column
' on determine la lettre de la colonne par la fonction NomDeColonneGeneral
mColFinal = NomDeColonneGeneral(mCol)
' on utilise la lettre de la colonne pour vérifier si les données rentrées n'ont pas été déja utilisées
If mCol < 9 Then Exit Sub
    If Not Application.Intersect(Target, Columns(mColFinal)) Is Nothing Then
        If Target.Count > 1 Then Exit Sub
            If Application.CountIf(Range(mColFinal & ":" & mColFinal), Target) > 1 Then
                Flag = True
                    MsgBox (Target & " existe déjà sur cette journée !"), vbOKOnly
                    Target.ClearContents
                Flag = False
        End If
    End If
End Sub

j'utilise ma fonction NomDeColonneGeneral

Public Function NomDeColonneGeneral(NumeroDeColonne As Integer) As String
On Error GoTo NomDeColonneGeneralErreur
    Dim i As Integer
    Dim m As Integer
    Dim NomTemporaire As String
    i = NumeroDeColonne
    NomTemporaire = ""
    Do While (i > 0)
        m = (i - 1) Mod 26
        NomTemporaire = Chr(65 + m) + NomTemporaire
        i = Int((i - m) / 26)
    Loop
    NomDeColonneGeneral = NomTemporaire
Exit Function
NomDeColonneGeneralErreur:
    NomDeColonneGeneral = CVErr(xlErrNA)
End Function

Cela fonctionne très bien. Mon souci vient qu'ils ont la possibilité de mettre 2 techniciens sur la même intervention sous la forme "Pierre-Paul"

j'ai trouvé une solution pour récupérer mes deux nom, mais pas pour les tester après et empècher la saisie.

Sub extractionMots1()
    Dim Tableau() As String
    Dim i As Integer

Tableau = Split(ActiveCell.Value, "-")
   For i = 0 To UBound(Tableau)
        MsgBox Tableau(i)
   Next i
End Sub

Merci pour votre aide

Bruno

Salut bndurand,

Sans fichier, difficile d'aider, ne crois-tu pas ?
Mais, il semblerait que tu aies trouvé !?


A+

Bonjour,

Voici le fichier, c'est un fichier de test, j'ai plusieurs essais à l'intérieur.

Bien cordialement

Bruno

Salut bndurand,

perso, je préfère créer les listes de validation à la demande, histoire d'alléger le classeur, et, tant qu'à faire, n'autoriser que les valeurs autorisées en fonction du contexte.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim tData, tBDD, iOK%, iCol%, sItem$, sCol$
'
Cells.Validation.Delete
iCol = Target.Column
If iCol > 8 Then
    Target = ""
    With Worksheets("BDD")
        For x = 1 To .Range("A" & Rows.Count).End(xlUp).Row
            iOK = 0
            tBDD = Split(.Range("A" & x).Value, " & ")
            sCol = fctCol(iCol)
            For y = 1 To Range(sCol & Rows.Count).End(xlUp).Row
                If Range(sCol & y).Value <> "" Then
                    tData = Split(Range(sCol & y).Value, " & ")
                    For Z = 0 To UBound(tBDD)
                        For k = 0 To UBound(tData)
                            If tBDD(Z) = tData(k) Then iOK = 1
                        Next
                    Next
                End If
            Next
            If iOK = 0 Then sItem = sItem & IIf(sItem = "", .Range("A" & x).Value, "," & .Range("A" & x).Value)
        Next
    End With
    If sItem <> "" Then Target.Validation.Add Type:=xlValidateList, Formula1:=sItem
End If
'
End Sub

Voici une fonction plus courte pour le calcul de la lettre correspondant à une colonne donnée.

Public Function fctCol(ByVal iCol%) As String
'
fctCol = Split(Columns(iCol).Address(ColumnAbsolute:=False), ":")(1)
'
End Function

Á l'inverse, découverte récemment, une fonction sympa pour calculer le n° d'une colonne en connaissant sa lettre.

fctNCol = Columns("A:" & sCol).Count


A+

Merci beaucoup ça va compléter ma solution.

A bientôt

Rechercher des sujets similaires à "verification nom meme colonne tableau"