Я выполняю один и тот же код для каждого из 15 статических диапазонов в (текущем) событии Worksheet_Change. Каждый диапазон оценивается сам по себе.
Я проверяю дубликаты, но не по диапазонам, только в каждом отдельном диапазоне. Но все диапазоны должны быть проверены (или вплоть до действия) до завершения процедуры.
Ячейки заполняются по выбору пользователя из динамических раскрывающихся списков для всех ячеек.
Код, который я публикую, работает так, как мне нужно. Как сделать цикл для запуска одного и того же кода 15 раз, используя список переменных диапазона, которые я определил?
Я хочу упростить код, чтобы при внесении изменений в код мне не приходилось менять его в 15 местах.
Я пробовал несколько версий исследуемого кода, чтобы сделать код зацикливания функциональным, но множественные операторы If затрудняют мне поиск правильной структуры для цикла.
Я, наконец, сдался и скопировал код 15 раз в операторе If - ElseIf, который работает.
Private Sub Worksheet_Change(ByVal Target As Range)
'Define your variables.
Dim Sun1AM As Range, Sun1PM As Range, Wed1PM As Range
Dim Sun2AM As Range, Sun2PM As Range, Wed2PM As Range
Dim Sun3AM As Range, Sun3PM As Range, Wed3PM As Range
Dim Sun4AM As Range, Sun4PM As Range, Wed4PM As Range
Dim Sun5AM As Range, Sun5PM As Range, Wed5PM As Range
'Set the ranges where you want to prevent duplicate entries.
Set Sun1AM = Range("C4:C14")
Set Sun1PM = Range("C17:C21")
Set Wed1PM = Range("C24:C28")
Set Sun2AM = Range("E4:E14")
Set Sun2PM = Range("E17:E21")
Set Wed2PM = Range("E24:E28")
Set Sun3AM = Range("G4:G14")
Set Sun3PM = Range("G17:G21")
Set Wed3PM = Range("G24:G28")
Set Sun4AM = Range("I4:I14")
Set Sun4PM = Range("I17:I21")
Set Wed4PM = Range("I24:I28")
Set Sun5AM = Range("K4:K14")
Set Sun5PM = Range("K17:K21")
Set Wed5PM = Range("K24:K28")
'See if target is in any of the ranges defined above and check for
'duplicates range by range.
If Not Intersect(Target, Sun1AM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun1AM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun1PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun1PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Wed1PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Wed1PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun2AM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun2AM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun2PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun2PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Wed2PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Wed2PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun3AM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun3AM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun3PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun3PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Wed3PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Wed3PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun4AM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun4AM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun4PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun4PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Wed4PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Wed4PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun5AM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun5AM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Sun5PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Sun5PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
ElseIf Not Intersect(Target, Wed5PM) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Wed5PM, Target.Value) > 1 Then _
MsgBox Target.Value & " is already used.", vbInformation, _
"Duplicate Entry!"
Else
Exit Sub
End If
End Sub
Это работает, но очень сложно управлять. Кто-нибудь, пожалуйста, просветите меня в хороший простой цикл. Я буду копировать этот лист, создавая новую копию каждый месяц, поэтому код должен оставаться «текущим листом» и работать с любым листом, над которым работает пользователь.
Большое спасибо !!!