Страницы: 1
RSS
Проверка значений не работает при копировании-вставке данных
 
Имеются защищенные целочисленные поля и списки (защищал так: Данные -> проверка)  
И все работает отлично, пока я просто ввожу данные из клавиатуры. Но как только я использую Copy/Paste, то проверка таким образом вставленных значений не производится.  
 
В чем здесь может быть проблема?  
 
Заранее благодарен!
 
так задуманно :(
 
{quote}{login=Михаил}{date=21.12.2009 07:41}{thema=}{post}так задуманно :({/post}{/quote}  
 
И что, никак?
 
Подскажите пожалуйста, как быть?
 
Макросами это дело вроде бы решается, недавно на форуме было про это что-то... но что и где - не подскажу, не помню (советую поиском попробовать)... и сам макросы писать не умею...
 
А никто не подскажет, как можно докопаться к событиям вставки и редактирования, а там дальше я уже разберусь, лишь бы там было чтото вроде параметра Cancel. Из всех событий листа  worksheet_Change(ByVal Target As Range) вроде самое подходящее, но оно только констатирует факт изменения, и не позволяет отменить действие.
 
Попробуйте что-нибудь скопировать в A1:A10,B2,C3,D4  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
 If Intersect(Target, Range("A1:A10,B2,C3,D4")) Is Nothing Then Exit Sub  
 With Application  
   If .CutCopyMode Then  
     .EnableEvents = False  
     .Undo  
     .EnableEvents = True  
   End If  
 End With  
End Sub
 
{quote}{login=ZVI}{date=22.12.2009 04:03}{thema=}{post}Попробуйте что-нибудь скопировать в A1:A10,B2,C3,D4  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
 If Intersect(Target, Range("A1:A10,B2,C3,D4")) Is Nothing Then Exit Sub  
 With Application  
   If .CutCopyMode Then  
     .EnableEvents = False  
     .Undo  
     .EnableEvents = True  
   End If  
 End With  
End Sub{/post}{/quote}  
Приведенный выше код защищает от копирования/вставки мышкой, спецвставкой, по Ctrl-C/Ctrl-V. Но не защищает от копирования другой ячейки по Enter поверх ячейки с проверкой. Вообще не понятно, что у Вас означает Copy/Paste.    
 
Проверку можно было сделать полностью в VBA перед Undo:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
 If Intersect(Target, Range("A1:A10,B2,C3,D4")) Is Nothing Then Exit Sub  
 With Application  
     .EnableEvents = False  
       
     If Target.Count > 1 Then  
       .Undo  
       MsgBox "Так копировать запрещено"  
     Else  
       ' Вместо validation  
       If Target.Value > 1 Then  
         .Undo  
         MsgBox "Значение не должно быть > 1"  
       End If  
     End If  
       
     .EnableEvents = True  
 End With  
End Sub
Страницы: 1
Читают тему
Наверх