Excel - Formule de validation des données

Problème

J'ai une feuille de calcul qui suit la fréquentation. Ce que je veux faire, c'est alerter l'utilisateur chaque fois que trois ou plusieurs cellules en séquence contiennent les mêmes données . par exemple. Si quelqu'un appelle malade, un S est placé dans la cellule, si cette personne est malade lundi, mardi, mercredi, je voudrais alerter l'utilisateur. (3 jours consécutifs avec les mêmes données). Si la personne est également malade le jeudi, je souhaite avertir de nouveau l’utilisateur.

Solution

  • 1. Appuyez sur ALT + F11 pour ouvrir VBE.
  • 2. Appuyez sur CTRL + R pour ouvrir l'Explorateur de projets.
  • 3. Double-cliquez sur la feuille dans laquelle vous voulez cette boîte de message
  • 4. Collez le code

 Private Sub Worksheet_Change (Valeur cible ByVal) Dim vPos As Variant Dim iCol As Entier Dim CellValue As Variant If ((Target.Columns.Count = 1) Et (Target.Rows.Count = 1)) Then If Target = "" Exit Sub End If vPos = "" Application.EnableEvents = False pour chaque cellule de la cible si UCase (Cell) "S", puis passez à Next_Cell vPos = "" iCol = Cell.Column Si iCol> = 3 Alors si ((Cell = Cell .Offset (0, -2)) And (Cell.Offset (0, -1) = Cell)) Alors vPos = -1 End If End If ((vPos = "") Et (iCol> = 2) Et ( iCol <Columns.Count)) Alors si ((Cell = Cell.Offset (0, -1)) Et (Cell.Offset (0, 1) = Cell)) Alors vPos = 0 End If Si If ((vPos = "") Et (iCol <Columns.Count - 1)) Alors Si ((Cell = Cell.Offset (0, 1)) Et (Cell.Offset (0, 2) = Cell)) Alors vPos = 1 End If End If If If (vPos "") puis GoTo End_Sub End If Next_Cell: Next End_Sub: Application.EnableEvents = True If (vPos "") Then MsgBox "Trois de suite" End If End Sub 

Si vous les alertes à activer uniquement pour les jours de semaine (du lundi au vendredi).

 Particulier Sub Worksheet_Change (cible ByVal en tant que gamme) Dim vPos As Variant Dim iCol As Entier Dim CellValue As Variant Dim iOffsetL2 As Entier Dim iOffsetL1 As Entier Dim iOffsetR1 As Entier Dim iOffsetL2 As Entier Dim iOffsetL1 As Entier Dim Cellule Variable CellR1 As Variant Dim CellR2 As Variant If ((Target.Columns.Count = 1) Et (Target.Rows.Count = 1)) Then If Target = "" Puis quittez End End si vPos = "" 'Quittez Sous Sur Erreur GoTo End_Sub Application.EnableEvents = False pour chaque cellule de la cible Cell0 = UCase (Cell.Value) 'Si Cell0 "S", passez à Next_Cell vPos = "" iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 0 iOffsetR2 = 0 iOffsetR2 = 0 iOffsetR2 = 0 iOffsetR2 = 0 (IsDate (Cells (1, iCol))) Alors CellL2 = "Valeur résiduelle" CellL1 = "Valeur résiduelle" CellR1 = "Valeur résiduelle" CellR2 = "Valeur résiduelle" Sélectionnez le cas (Jour de la semaine (Cellules (1, iCol), vbMonday) ) Cas Is = 1 iOffsetL2 = -2 iOffsetL1 = -2 iOffsetR1 = 0 iOffsetR2 = 0 Cas Is = 2 iOffsetL2 = -2 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 0 iOffsetR2 = 0 iOffsetR2 = 0 CaseO 4 iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 2 Cas Is = 5 iOffsetL2 = 0 iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR2 = 2 Fin Sélectionnez cette fin si sur erreur Reprenez Next CellL2 = Cell.Offlet (0, (+) )). Valeur CellL1 = Cell.Offset (0, (-1 + iOffsetL1)). Valeur CellR1 = Cell.Offset (0, (1 + iOffsetR1)). Valeur CellR2 = Cell.Offset (0, (2 + iOffsetR2) ) .Value On Error GoTo End_Sub CellL2 = UCase (CellL2) CellL1 = UCase (CellL1) CellR1 = UCase (CellR1) CellR2 = UCase (CellR2) Si (iCol + iOffsetL2> 2) Alors '? ? X If ((CellL2 = Cell0) et (CellL1 = Cell0)) Alors vPos = -1 GoTo End_Sub End If If If ((iCol + iOffsetL1> 0) Et ((iCol - iOffsetR1) <Columns.Count)) Alors ' ? X ? Si ((CellL1 = Cell0) Et (Cell0 = CellR1)) Alors vPos = 0 GoTo End_Sub End If End If If (iCol <Columns.Count - 1) Alors, 'X? ? Si ((Cell0 = CellR1) Et (Cell0 = CellR2)) Alors vPos = 1 GoTo End_Sub End End End Si Next_Cell: Next End_Sub: Application.EnableEvents = True If (vPos "") Then MsgBox "Trois sur une ligne" End If End Sub 

Merci à rizvisa1 pour cette astuce.

Article Précédent Article Suivant

Les Meilleurs Conseils