Excel - Data validering formel

Problem

Jeg har et spredt ark, der sporer tilstedeværelse. Hvad jeg vil gøre er at advare brugeren, når 3 eller flere celler i sekvensen indeholder de samme data . f.eks. Hvis nogen kalder i syge, er en S placeret i cellen, hvis denne person er syg mand, tirsdag, onsdag, jeg vil gerne advare brugeren. (3 dage i rækkefølge med de samme data). Hvis personen også er syg på Thur, vil jeg gerne advare brugeren igen.

Opløsning

  • 1. Tryk ALT + F11 for at åbne VBE
  • 2. Tryk på CTRL + R for at åbne Project Explorer
  • 3. Dobbeltklik på det ark, som du vil have denne meddelelsesboks til
  • 4. Indsæt koden

 Private Sub Worksheet_Change (ByVal Target As Range) Dim vPos Som Variant Dim ICol Som Integer Dim CellValue Som Variant If ((Target.Columns.Count = 1) Og (Target.Rows.Count = 1)) Så hvis Target = "" Så Exit Sub End Hvis vPos = "" Application.EnableEvents = False for hver celle i mål Hvis UCase (Cell) "S" Så Gå til Next_Cell vPos = "" iCol = Cell.Column Hvis iCol> = 3 Så hvis ((Cell = Cell .Offset (0, -2)) Og (Cell.Offset (0, -1) = Cell)) Så vPos = -1 Slut Hvis Slut Hvis If ((vPos = "") Og (iCol> = 2) Og iCol <Columns.Count)) Så Hvis ((Cell = Cell.Offset (0, -1)) Og (Cell.Offset (0, 1) = Cell)) Så vPos = 0 Slut Hvis Slut Hvis If ((vPos = "") Og (iCol <Columns.Count - 1)) Så Hvis ((Cell = Cell.Offset (0, 1)) Og (Cell.Offset (0, 2) = Cell)) Så vPos = 1 Slut Hvis End Hvis If (vPos "") Så Gå til End_Sub End Hvis Next_Cell: Næste End_Sub: Application.EnableEvents = True If (vPos "") Så MsgBox "Tre i træk" Afslut hvis End Sub 

Hvis du advarslerne kun skal aktiveres for hverdage (mandag til fredag).

 Privat Sub Worksheet_Change (ByVal Target As Range) Dim vPos Som Variant Dim ICol Som Integer Dim CellValue Som Variant Dim IOffsetL2 Som Integer Dim IOffsetL1 Som Integer Dim IOffsetR1 Som Integer Dim IOffset2 Som Integer Dim CellL2 Som Variant Dim CellL1 Som Variant Dim Cell0 Som Variant Dim CellR1 Som Variant Dim CellR2 Som Variant If ((Target.Columns.Count = 1) Og (Target.Rows.Count = 1)) Så hvis Target = "" Afslut derefter Sub End Hvis vPos = "" 'Afslut Sub på Fejl GoTo End_Sub Application.EnableEvents = False for hver celle i Target Cell0 = UCase (Cell.Value) 'Hvis Cell0' S 'Så Gå til Next_Cell vPos = "" iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 0 iCol = Cell.Column If CellL2 = "Garbage Value" CellL1 = "Affaldsværdi" CellR1 = "Affaldsværdi" CellR2 = "Affaldsværdi" Vælg sag (Ugedag (Celler (1, iCol), vbMonday) ) Case er = 1 iOffsetL2 = -2 iOffsetL1 = -2 iOffsetR1 = 0 iOffsetR2 = 0 Case er = 2 iOffsetL2 = -2 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 0 Case er = 4 iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 2 Case er = 5 iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 2 iOffsetR2 = 2 End Vælg End Hvis Fejl Genoptag Næste CellL2 = Cell.Offset (0, (-2 + iOffsetL2 Value CellL1 = Cell.Offset (0, (-1 + iOffsetL1)). Værdi CellR1 = Cell.Offset (0, (1 + iOffsetR1)). Værdi CellR2 = Cell.Offset (0, (2 + iOffsetR2) ) .Value på fejl GoTo End_Sub CellL2 = UCase (CellL2) CellL1 = UCase (CellL1) CellR1 = UCase (CellR1) CellR2 = UCase (CellR2) Hvis (iCol + iOffsetL2> 2) Then '? ? X Hvis ((CellL2 = Cell0) Og (CellL1 = Cell0)) Så vPos = -1 Gå til End_Sub End Hvis End Hvis If ((iCol + iOffsetL1> 0) Og ((iCol - iOffsetR1) <Columns.Count)) Så ' ? X ? Hvis ((CellL1 = Cell0) Og (Cell0 = CellR1)) Så vPos = 0 Gå til End_Sub End Hvis End Hvis If (iCol <Columns.Count - 1) Then 'X? ? Hvis ((Cell0 = CellR1) Og (Cell0 = CellR2)) Så vPos = 1 Gå til End_Sub End Hvis End Hvis Next_Cell: Næste End_Sub: Application.EnableEvents = True If (vPos "") Så MsgBox "Tre i træk" Slutdel 

Takket være rizvisa1 for dette tip.

Forrige Artikel Næste Artikel

Top Tips