Excel - формула проверки данных

вопрос

У меня есть электронная таблица, которая отслеживает посещаемость. Что я хочу сделать, это предупредить пользователя всякий раз, когда 3 или более ячеек в последовательности содержат те же данные . например. Если кто-то вызывает больных, в ячейку помещается буква S, если этот человек болен. Пн, вт, ср, я хотел бы предупредить пользователя. (3 дня подряд с теми же данными). Если человек болеет за Тейра, я хочу снова предупредить пользователя.

Решение

  • 1. Нажмите ALT + F11, чтобы открыть VBE
  • 2. Нажмите CTRL + R, чтобы открыть Project Explorer
  • 3. Дважды щелкните на листе, в котором вы хотите это окно сообщения
  • 4. Вставьте код

 Private Sub Worksheet_Change (ByVal Target As Range) Dim vPos как вариант Dim iCol как целое число Dim CellValue как вариант If ((Target.Columns.Count = 1) и (Target.Rows.Count = 1)) Then If Target = "" Then Выход из Sub End If vPos = "" Application.EnableEvents = False Для каждой ячейки в целевом объекте, если UCase (Cell) "S", то GoTo Next_Cell vPos = "" iCol = Cell.Column If iCol> = 3 Тогда If ((Cell = Cell .Offset (0, -2)) And (Cell.Offset (0, -1) = Cell)) Тогда vPos = -1 End If End If If ((vPos = "") И (iCol> = 2) И ( iCol <Columns.Count)) Тогда If ((Cell = Cell.Offset (0, -1)) And (Cell.Offset (0, 1) = Cell)) Тогда vPos = 0 End If End If If ((vPos = "") И (iCol <Columns.Count - 1)) Тогда If ((Cell = Cell.Offset (0, 1)) И (Cell.Offset (0, 2) = Cell)) Тогда vPos = 1 End If End If If (vPos "") Тогда GoTo End_Sub End If Next_Cell: Next End_Sub: Application.EnableEvents = True If (vPos "") Тогда MsgBox "Три в ряд" End If End Sub 

Если вы оповещения должны быть включены только для рабочих дней (с понедельника по пятницу).

 Private Sub Worksheet_Change (ByVal Target As Range) Dim VPOS As Variant Dim iCol As Integer Dim CellValue As Variant Dim iOffsetL2 As Integer Dim iOffsetL1 As Integer Dim iOffsetR1 As Integer Dim iOffset2 As Integer Dim CellL2 как вариант Тусклое CellL1 как вариант Тусклое Cell0 как вариант Dim CellR1 в качестве варианта Dim CellR2 в качестве варианта If ((Target.Columns.Count = 1) и (Target.Rows.Count = 1)) Тогда If Target = "" Тогда выход из Sub End If vPos = "" "Выход из Sub On Error GoTo End_Sub Application.EnableEvents = False для каждой ячейки в целевой ячейке0 = UCase (Cell.Value) 'Если Cell0 "S", то GoTo Next_Cell vPos = "" iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 0 iCol = Cell.Col. (IsDate (Cells (1, iCol))) Тогда CellL2 = "Значение мусора" CellL1 = "Значение мусора" CellR1 = "Значение мусора" CellR2 = "Выбор значения мусора" (случай недели (Cells (1, iCol), vbMonday)) ) Case Is = 1 iOffsetL2 = -2 iOffsetL1 = -2 iOffsetR1 = 0 iOffsetR2 = 0 Case Is = 2 iOffsetL2 = -2 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 0 Case Is = 4 iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 0 iOffsetR2 = 2 Case Is = 5 iOffsetL2 = 0 iOffsetL1 = 0 iOffsetR1 = 2 iOffsetR2 = 2 End Выберите End, если при возникновении ошибки возобновить Next CellL2 = Cell.Offset (0, (+2 + iOset) )). Значение CellL1 = Cell.Offset (0, (-1 + iOffsetL1)). Значение CellR1 = Cell.Offset (0, (1 + iOffsetR1)). Значение CellR2 = Cell.Offset (0, (2 + iOffsetR2) ). Значение при ошибке GoTo End_Sub CellL2 = UCase (CellL2) CellL1 = UCase (CellL1) CellR1 = UCase (CellR1) CellR2 = UCase (CellR2) If (iCol + iOffsetL2> 2) Тогда '? ? X If ((CellL2 = Cell0) И (CellL1 = Cell0)) Тогда vPos = -1 GoTo End_Sub End If End If (((iCol + iOffsetL1> 0) И ((iCol - iOffsetR1) <Columns.Count)) Then ' ? ИКС ? If ((CellL1 = Cell0) И (Cell0 = CellR1)) Тогда vPos = 0 GoTo End_Sub End If End If If (iCol <Columns.Count - 1) Тогда 'X? ? If ((Cell0 = CellR1) И (Cell0 = CellR2)) Тогда vPos = 1 GoTo End_Sub End If End If Next_Cell: Next End_Sub: Application.EnableEvents = True If (vPos "") Тогда MsgBox "Три в ряд" End If End Sub 

Спасибо rizvisa1 за этот совет.

Предыдущая статья Следующая статья

Лучшие советы