Страницы: 1
RSS
Заблокировать вставку и ввод данных. Открыть доступ только выбору значений из выпадающего списка
 
Ребят, подскажите, пожалуйста, как сделать так, чтобы пользователь не смог ни ввести данные ни вставить в диапазон O:P, (полностью столбцы) только смог выбрать из выпадающего списка значения?

Пример во вложении.
Зеленым выделила то, что необходимо заблокировать для вставки и ввода.
 
хотела просто блокировку поставить макросом..но после ввода макрос падает и все всеравно вставляется..не выход это..и еще сломался выпадающий список в ячейке...он не работает-нет его.. сломала я все..эх
Изменено: Lilo_255 - 09.11.2017 13:36:24
 
ребят я нашла пример на сайте http://www.excelworld.ru/forum/2-22969-1 написала Manyasha..но не пойму как он работает..хотяяяя

Код
Sub Merge_Cell_With_Format()
Dim rRange As Range, rMrgRange As Range, wsTempSh As Worksheet, wsActSh As Worksheet
Application.ScreenUpdating = False: Application.DisplayAlerts = False
Set wsActSh = ActiveSheet: Set wsTempSh = Sheets.Add(, Sheets(Sheets.Count)): wsTempSh.Name = "Áðàêîçÿáóëà_âîò_òàê_ñàì_â_øîêå"
wsActSh.Activate
Set rRange = Selection: rRange.Copy wsTempSh.Range(rRange.Address)
Set rMrgRange = wsTempSh.Range(rRange.Address)
rMrgRange.Merge: rMrgRange.Copy: rRange.PasteSpecial xlPasteFormats: wsTempSh.Delete
Set wsActSh = Nothing: Set wsTempSh = Nothing: Set rMrgRange = Nothing: Set rRange = Nothing
Application.ScreenUpdating = True: Application.DisplayAlerts = True
End Sub
Изменено: Lilo_255 - 09.11.2017 14:04:12
 
минутку, в прикрепленном файле и в О, и в Р - списки допустимых значений, которые работают по принципу, который обсуждался и был реализован вчера
пишете об О и Р, пишете выделено зеленым, а зеленым выделено еще и Q, R, S, T?
что не так с колонками O, P? что вообще не так в файле?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,прошу прощения, все же полный диапазон, который выделен зеленым:  Q, R, S, T.
Наверное, надо было написать Range("O:R") :)
В файле все так. Но нужно сделать так, чтобы у пользователя не было возможности вставить и ввести свои какие-то значения, а только выбрать их из выпадающего списка.
Изменено: Lilo_255 - 09.11.2017 16:47:02
 
так выпадающий список - это и есть ограничение на вводимые значения только из списка и ничего более
что нужно-то?

в процедуру  Private Sub Worksheet_Change
есть смысл добавить 2 строки
Код
Private Sub Worksheet_Change(ByVal rg As Range)
  Dim Nv, Ov, Lv
  If Intersect(rg, Range("O:R")) Is Nothing Or rg.Count > 1 Then Exit Sub
  If Len(rg) = 0 Then Exit Sub
  On Error Resume Next
  Application.EnableEvents = False:  Nv = rg:  Application.Undo:  Ov = rg
  If Err Then Application.EnableEvents = True:  Exit Sub
  If Ov = Nv Then rg = "": Application.EnableEvents = True: Exit Sub
  If Len(Ov) = 0 Then
    rg = Nv
  Else
    Lv = NvInOv(CStr(Nv), Ov): If Lv = False Then rg = rg & ";" & Nv Else rg = Lv
  End If
  Application.EnableEvents = True
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, так ввести нельзя... а копи паст можно))
 
Ігор Гончаренко, если использовать этот макрос, то не работает накопление в ячейке. можно выбрать только одно значение в выпадающем списке.
А возможность "множественного" выбора отсутствует.
Изменено: Lilo_255 - 09.11.2017 14:32:42
 
Может я не понятно объясняю, попробую еще раз:
на данный момент в предложенном примере в файле, вписать данные нельзя, но вставить по средствам копирования и вставки можно.
нужно как-то сделать так, чтобы вставить значения в указанные  ячейки было нельзя.
Изменено: Lilo_255 - 09.11.2017 16:47:17
 
а) возможность выбирать по одному с накопление (удалением) - есть
б) если в ячейку скопировать другую ячейку то из ячейки источника копируется ВСЕ, в том числе копируется проверка данных, и если в исходной ячейке проверки не было, то из в ячейки, в которую скопировали данные, "жившее" там условие проверки данных сносится. новая ячейка становится копией ячейки-источника (копируются данные, форматы, проверки и пр.)

вопрос у Вас в другом: как запретить копирование данных в определенный диапазон
Изменено: Ігор Гончаренко - 09.11.2017 14:56:17
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, что-то про это не знала:
Цитата
б) если в ячейку скопировать другую ячейку то из ячейки источника копируется ВСЕ, в том числе копируется проверка данных для, и если в исходной проверки не было, то из в ячейки, в которую скопировали данные, "жившее" там условие проверки данных сносится. новая ячейка становится копией ячейки-источника (копируются данные, форматы, проверки и пр.)
но конечно надо было подумать.

все верно..вопрос в этом
Цитата
как запретить копирование данных в определенный диапазон
 
Доброе время суток
Цитата
Lilo_255 написал:
как запретить копирование данных в определенный диапазон
И что это столь уникальная, возникшая только у вас проблема? Ещё :)
Изменено: Андрей VG - 09.11.2017 15:12:40
 
Андрей VG, да я использовала Ваш пример...я не понимаю почему не работает..он же простецкий..((

Можете посмотреть пример((
 
поправила..но он все равно не блокирует вставку
 
Цитата
Lilo_255 написал:
а я использовала Ваш пример
Который? Я всего лишь дал ссылки, где рассматривались подобные проблемы. В простейшем случае используется обработка события листа SelectionChange с кодом
Код
Application.CutCopyMode = False
 
Андрей VG, так дело то в диапазоне..а не в листе..как мне диапазон задать?
 
Цитата
Который? Я всего лишь дал ссылки, где рассматривались подобные проблемы. В простейшем случае используется обработка события листа SelectionChange с кодом
я вас перепутала ..вы просто участвовали в переписке..пример был такой
 
сама справилась..

может кому нужно будет:
https://www.extendoffice.com/documents/excel/4289-excel-disable-cut-copy-paste.html
 
нет...все же актуально
 
справилась:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim myRange As Range
 Set myRange = Worksheets("Çàÿâêà íà ïîäêëþ÷åíèå").Range("O:R")

 If Application.Intersect(Target, myRange) Is Nothing Then
  Application.CellDragAndDrop = True
  
 Else
  Application.CellDragAndDrop = False
  
 End If
 
 End Sub
 
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("O:R")) Is Nothing Then Cancel = True

End Sub
 
Цитата
Lilo_255 написал:
справилась:
Умница! Так и становятся программистами, когда начинают самостоятельно изучать :)
 
Присоединяюсь к выводам в сообщении #21, "но истина дороже". Проблема актуальна, так как фантазия пользователей при заполнении регламентированных форм  безгранична.
Код из сообщения #20 проблему не решает. Доказательство  - в условиях сообщения #1 записываем в модуль текущего листа рабочей книги указанный код и выполняем следующую (типичную) последовательность действий:
1. Выделяем на текущем листе ячейку N1
2. Переходим на другой лист, выделяем две (или более) непустые последовательные ячейки в одной строке и набираем Ctrl+Ins
3. Возвращаемся на исходный лист и набираем Shift+Ins. Информация попадает в "охраняемый" столбец "O".

Хотелось бы верить, что нижеуказанный код решает проблему лучше (вставлять в модуль листа):



Код
Option Explicit

Dim c As Range   ' выделенная ячейка в контролируемом диапазоне ячеек

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim r As Range, nerr As Long
   
   Set r = GetIS(Target)
   If r Is Nothing Then  ' изменения не касаются контролируемого диапазона
     Exit Sub
   End If
   
   If c Is Nothing Then
     nerr = 1 ' ранее не была выделена ячейка контролируемого диапазона
   ElseIf Target.Count > 1 Then
     nerr = 2 ' в контролируемом диапазоне можно менять строго по одной ячейке
   ElseIf Target.Validation.Value = False Then
     nerr = 3 ' занесено значение, противоречащее условиям проверки
   ElseIf Target.HasFormula Then
     nerr = 4 ' занесена формула
   End If
   
   If nerr > 0 Then
      MsgBox "Диапазон ячеек " & Target.Address & " изменен недопустимым образом", vbExclamation
      With Application
        .EnableEvents = False
        On Error Resume Next: .Undo: On Error GoTo 0
        .EnableEvents = True
      End With
   End If
   
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Set c = Nothing
  If Not GetIS(Target) Is Nothing Then
    If Target.Count = 1 Then Set c = Target: Application.CutCopyMode = False
  End If
End Sub

' Возвращает пересечение target и контролируемого диапазона
Private Function GetIS(Target As Range) As Range
  Set GetIS = Intersect(Target, Me.Columns("O:R"))  ' контролируемый диапазон задавать здесь
End Function

Изменено: sokol92 - 10.11.2017 17:24:19
Владимир
Страницы: 1
Наверх