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 Subj'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 FunctionCela 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 SubMerci 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 SubVoici 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