Страницы: 1
RSS
-=Валидация макросом=-
 
Как создать проверку вводимых данных макросом?  
Должно быть ограничение на ввод дублей. Точнее полный запрет на их ввод. Книга любая, столбец любой.  
 
Спасибо.
 
Рыба. Код в модуль листа:  
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   If Application.WorksheetFunction.CountIf(ActiveSheet.UsedRange, Target.Value) > 1 Then  
       Application.EnableEvents = False  
       Target = ""  
   End If  
   Application.EnableEvents = True  
End Sub
 
Юр, спасибо, то что надо!  
Как добавить msgBox "Ты охренел? Такое уже вводилось!"  
И только на один столбец? Любой, на твой выбор...
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Cells.Count > 1 Then Exit Sub  
If Application.WorksheetFunction.CountIf(ActiveSheet.UsedRange, Target.Value) > 1 Then  
Application.EnableEvents = False  
msgbox "Ну ты вааще, в натуре! Ведь есть уже такое на листе", 48, " Ашыпка!"  
Target = ""  
End If  
Application.EnableEvents = True  
End Sub
 
Про столбец не прочитал... Проверять ТОЛЬКО один столбец?
 
Ну да...  
Любой.
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   If Not Intersect(Target, Range("D:D")) Is Nothing Then  
       If Application.WorksheetFunction.CountIf(Range("D:D"), Target.Value) > 1 Then  
           Application.EnableEvents = False  
           MsgBox "Ну ты вааще, в натуре! Ведь есть уже такое на листе", 48, " Ашыпка!"  
           Target = ""  
       End If  
   End If  
   Application.EnableEvents = True  
End Sub
 
Снимаю шляпу :)  
Спасибо!
 
Да Юра вообще супер-перец! Я у него учусь )  
Кстати, по задаче: есть ли смысл считать все, если нужно проверить наличие только первого совпадения?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=01.05.2012 01:12}{thema=Re: }{post}....есть ли смысл считать все, если нужно проверить наличие только первого совпадения?{/post}{/quote}Не первого, а любого
 
На случай копи-паст нескольких значений:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   Dim Rng As Range, Arr(), ArrItem, Txt As String, DObj As Object  
   '  
   If Intersect(Target, [B:B]) Is Nothing Then Exit Sub
   If WorksheetFunction.CountA([B:B]) = 0 Then Exit Sub
   If IsEmpty([B1]) Then
       Set Rng = Range([B1].End(xlDown), [B65536].End(xlUp))
   Else  
       Set Rng = Range([B1], [B65536].End(xlUp))
   End If  
   If Rng.Cells.Count = 1 Then Exit Sub  
   Arr = Rng.Value  
   Set DObj = CreateObject("Scripting.Dictionary")  
   DObj.CompareMode = 1  
   For Each ArrItem In Arr  
       If Not IsEmpty(ArrItem) Then  
           Txt = ArrItem  
           If Not DObj.Exists(Txt) Then  
               DObj.Add Txt, ""  
           Else  
               MsgBox "Äåæàâþ.             ", vbExclamation, "Îøèáêà:"  
               With Application  
                   .EnableEvents = False  
                   .Undo  
                   If .CutCopyMode Then .CutCopyMode = 0  
                   .EnableEvents = True  
               End With  
               Exit For  
           End If  
       End If  
   Next  
   Set DObj = Nothing  
End Sub
 
Сорь,  
 
MsgBox "Дежавю.             ", vbExclamation, "Ошибка:"
 
{quote}{login=Serge 007}{date=01.05.2012 01:17}{thema=Re: Re: }{post}{quote}{login=nerv}{date=01.05.2012 01:12}{thema=Re: }{post}....есть ли смысл считать все, если нужно проверить наличие только первого совпадения?{/post}{/quote}Не первого, а любого{/post}{/quote}чаво? Не самый хороший пример, но тем не менее:  
у тебя есть пачка сигарет (кстати, сам не курю и не кому не советую), ты суешь в нее руку, достаешь сигарету. Вывод: в пачке есть сигареты. Что вы делаете макросом: Function.CountA(). Допустим, нашли одно совпадение. И что? Продолжаем считать дальше. Зачем?  
 
С.М., привет тезке : )  
А словарь там зачем? Думаю, будет достаточно StrComp() и цикла For Each Variant In Array. IsEmpty() зачем? <> "" не? ) Еще можно накрутить проверку > 1 области ввода. Только надо ли оно?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
С.М., еще, если интересно, я делал финт ушами, чтобы кода меньше писать  
 
Dim elem As Variant  
 
With Rng.Cells  
   For Each elem In IIf(.Count = 1, Array(.Value), .Value)  
       ' code  
   Next  
End With
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
nerv, тёзка, привет.  
"Ну что Вы расшумелись, как паром, Я не прошусь к Вам на закорки через реку." ©  
:-)
 
To nerv:  
Саша, ну так что ли ?  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   Dim Col As Range, Rng As Range, Cell As Range  
   '  
   Set Col = [B:B]
   Set Rng = Intersect(Target, Col)  
   If Rng Is Nothing Then Exit Sub  
   For Each Cell In Rng.Cells  
       If WorksheetFunction.CountIf(Col, Cell) > 1 Then  
           MsgBox "Дежавю." & Space(12), vbExclamation, "Ошибка:"  
           With Application  
               .EnableEvents = False  
               .Undo  
               If .CutCopyMode Then .CutCopyMode = 0  
               .EnableEvents = True  
           End With  
           Exit For  
       End If  
   Next  
End Sub
 
>> есть ли смысл считать все, если нужно проверить наличие только первого совпадения?  
Саш, я же явно не перебираю циклом (For...) весь диапазон :-)  
И потом,- первое совпадение может оказаться на предпоследней строке :-)
Страницы: 1
Наверх