макрос на запрет ввода повторяющихся значений
Добавлено: 27 фев 2013, 10:32
Помогите , пожалуйста, составить макрос на запрет ввода повторяющихся значений в диапазоне В10:В20. В строках данного диапазона раскрывающийся список.
форум программистов
https://www.developing.ru/
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
Dim wsh As Worksheet
списокЛистов$ = "/Лист1/Лист2/Лист3"
For Each wsh In ActiveWorkbook.Worksheets
If InStr(списокЛистов, "/" & wsh.Name & "/") Then
Dim iSource As Range
Set iSource = Intersect(Range("B10:B20"), Target)
ElseIf Not iSource Is Nothing Then
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.EnableEvents = False
End With
Dim Trow As Integer
If Target.Count > 1 Then Target.Delete: GoTo Pass
If Target.Value = "" Then GoTo Pass
On Error Resume Next
Trow = Range(Cells(1, 1), Target.Offset(-1, 0)).Find(Target.Value).Row
If Target.Row > 1 Then
If Trow <> 0 Then
If Trow <> Target.Row Then
MsgBox ("значение введено ранее на " & Trow & " строке")
Target.Value = ""
End If
End If
End If
End If
Pass:
With Application
.DisplayAlerts = True
.ScreenUpdating = True
.EnableEvents = True
End With
Next wsh
End Sub
Код: Выделить всё
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim iSource As Range
Select Case Sh.Name
Case "Лист1", "Лист2", "Лист3"
Set iSource = Intersect(Range("C10:C20"), Target)
Case Else
Exit Sub
End Select
If Not iSource Is Nothing Then
Application.EnableEvents = False
Range("B10:C20").Sort _
Key1:=Range("C10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Select Case Sh.Name
Case "Лист1", "Лист2", "Лист3"
Set iSource = Intersect(Range("B10:B20"), Target)
Case Else
Exit Sub
End Select
If Not iSource Is Nothing Then
Dim Trow As Integer
If Target.Count > 1 Or Target.Value = "" Then Exit Sub
On Error Resume Next
Trow = Range(Cells(1, 1), Target.Offset(-1, 0)).Find(Target.Value).Row
If Target.Row > 1 Then
If Trow <> 0 Then
If Trow <> Target.Row Then
MsgBox ("значение введено ранее на " & Trow & " строке")
Target.Value = ""
Application.EnableEvents = True
End If
End If
End If
End If
End If
End Sub
Код: Выделить всё
списокЛистов = array("Лист1","Лист2","Лист3")
Код: Выделить всё
Range("$D$4:$D$12").RemoveDuplicates Columns:=1, Header:=xlNo
Код: Выделить всё
списокЛистов$ = "/Лист1/Лист2/Лист3"
Код: Выделить всё
списокЛистов$ = "/Лист1/Лист2/Лист3/"
Код: Выделить всё
InStr(1, списокЛистов, "/" & wsh.Name & "/", vbTextCompare)
Код: Выделить всё
If Not IsError(Application.Match(Me.Name, Array("Лист1", "Лист2", "Лист3"), 0)) Then
MsgBox "Лист найден", , ""
Else
MsgBox "Лист, соответственно, не найден", , ""
End If
Код: Выделить всё
If Not IsError(Application.Match(Sh.Name, Array("Лист1", "Лист2", "Лист3"), 0)) Then
MsgBox "Лист найден", , ""
Else
MsgBox "Лист, соответственно, не найден", , ""
End If
Код: Выделить всё
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'Excel 2007 (и старше)
Select Case LCase(Sh.Name)
Case "лист1", "лист2", "лист3"
If Not Intersect(Sh.Range("C10:C20"), Target) Is Nothing Then
Application.EnableEvents = False
Sh.Range("B10:C20").Sort _
Key1:=Sh.Range("C10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sh.Range("B10:B20").RemoveDuplicates Columns:=1, Header:=xlNo
'странно, что сортируем мы диапазон B10:C20,
'а удаляем дубликаты только в B10:B20
Application.EnableEvents = True
End If
End Select
End Sub
Именно так всё и задумывалось, смотрите свой собственный пост#5, но ежели такой подход Вам не устраивает, то посмотрите следующий вариант, где повтор ввести/выбрать/скопировать также возможно, но такое действие будет сразу отменено.clar писал(а):...но повторы ввести можно (удаляет их только после очередного введения значения в столбец С...
Код: Выделить всё
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'Excel 2000 (и старше)
Select Case LCase(Sh.Name)
Case "лист1", "лист2", "лист3"
If Not Intersect(Sh.Range("B10:C20"), Target) Is Nothing Then
With Application
.EnableEvents = False
If .Max(.CountIf(Sh.Range("B10:B20"), Target)) > 1 Then
.Undo
Else
Sh.Range("B10:C20").Sort _
Key1:=Sh.Range("C10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End If
.EnableEvents = True
End With
End If
End Select
End Sub