Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2010, 17:01   #1
Cluster
 
Регистрация: 23.07.2010
Сообщений: 4
По умолчанию Сделать ячейку активной / неактивной по условию

Подскажите, плиз, чайнику, можно ли запретить править ячейку при выполнении условия в другой ячейке? Т.е. к примеру, чтобы в B1 можно было что-то вводить руками, если A1=1, и нельзя, если A1<>1.
Cluster вне форума Ответить с цитированием
Старый 02.08.2010, 17:58   #2
аналитика
Форумчанин
 
Регистрация: 14.05.2009
Сообщений: 311
По умолчанию

правой кнопкой по ярлыку листа - Исходный текст, сюда вставляешь это
Код:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim Не_трогать As Range
   
   If Range("A1") = 1 Then Exit Sub
   
   Set Не_трогать = Range("B1") 'здесь можно область задать

   If Not Intersect(Target, Не_трогать) Is Nothing Then
      MsgBox "Ай-яй-яй!!!" & vbCrLf & "В ячейку A1 поставь 1", vbCritical, "Не хулиганить!"
      
      Application.EnableEvents = False
      CommandBars("Standard").Controls("Отменить").Execute
      Application.EnableEvents = True
   End If
End Sub
аналитика вне форума Ответить с цитированием
Старый 10.08.2010, 13:46   #3
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Встроенными инструментами.
Меню Данные-Проверка-Тип_данных-Другой-Формула
=A1=1
vikttur вне форума Ответить с цитированием
Старый 29.07.2015, 12:33   #4
Ofigetmojno
Новичок
Джуниор
 
Регистрация: 28.07.2015
Сообщений: 5
По умолчанию

Добрый день!
Подскажите пожалуйста, использовал код, предложенный выше, Подточил под свои нужды, все работатет:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Не_трогать As Range
If Range("G9") = "Почасовая" Then Exit Sub
Set Не_трогать = Range("D9:F9")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"

Application.EnableEvents = False
CommandBars("Standard").Controls("О тменить").Execute
Application.EnableEvents = True
End If
End Sub

НО. Мне нужно ввести второе условие. Попробовал сделать так:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Не_трогать As Range
If Range("G9") = "Почасовая" Then Exit Sub
Set Не_трогать = Range("D9:F9")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"
ElseIf Range("G9") = "По километражу" Then Exit Sub
Set Не_трогать = Range("D10:F10")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: По километражу", vbCritical, "Тупим))))"
Application.EnableEvents = False
CommandBars("Standard").Controls("О тменить").Execute
Application.EnableEvents = True
End If
End Sub


Выскакивает ошибка: Block If without End If.

Подскажите, что можно придумать.
Вложения
Тип файла: zip Такси.zip (23.1 Кб, 21 просмотров)
Ofigetmojno вне форума Ответить с цитированием
Старый 29.07.2015, 14:01   #5
Кардаган
Форумчанин
 
Регистрация: 07.07.2015
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Ofigetmojno Посмотреть сообщение
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"
ElseIf Range("G9") = "По километражу" Then Exit Sub
[/FONT]
У Вас этот If не закрыт. Нужно так:
Код:
 If Not Intersect(Target, Не_трогать) Is Nothing Then
      MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"
  ElseIf Range("G9") = "По километражу" Then Exit Sub
   End If
То есть вместе будет:
Код:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Не_трогать As Range
If Range("G9") = "Почасовая" Then Exit Sub
Set Не_трогать = Range("D9:F9")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"
ElseIf Range("G9") = "По километражу" Then Exit Sub
End If
Set Не_трогать = Range("D10:F10")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: По километражу", vbCritical, "Тупим))))"
Application.EnableEvents = False
CommandBars("Standard").Controls("О тменить").Execute
Application.EnableEvents = True
End If
End Sub
Кардаган вне форума Ответить с цитированием
Старый 29.07.2015, 14:46   #6
Ofigetmojno
Новичок
Джуниор
 
Регистрация: 28.07.2015
Сообщений: 5
По умолчанию

Огромное спасибо!

Ошибка пропала, но теперь новая беда: код не работает.
Вернее верхняя половина работает, а нижняя - нет.

Если выбираю в ячейке G9 "По километражу" и пытаюсь изменить значения в диапазоне D9:F9 - все прекрасно работает (выскакивает окошко).

Если же в ячейке G9 ставлю "Почасовая" и пытаюсь в диапазоне D10:F10 поменять значения, то все меняется, несмотря на условие...
Вложения
Тип файла: zip Такси.zip (23.6 Кб, 25 просмотров)
Ofigetmojno вне форума Ответить с цитированием
Старый 29.07.2015, 15:32   #7
Кардаган
Форумчанин
 
Регистрация: 07.07.2015
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Ofigetmojno Посмотреть сообщение
Если же в ячейке G9 ставлю "Почасовая" и пытаюсь в диапазоне D10:F10 поменять значения, то все меняется, несмотря на условие...
Тогда так:
Код:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Не_трогать As Range
If Range("G9") = "Почасовая" Then Exit Sub
Set Не_трогать = Range("D9:F9")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"
ElseIf Range("G9") = "По километражу" Then GoTo Далее
End If
Далее:
If Range("G9") = "По километражу" Then Exit Sub
Set Не_трогать = Range("D10:F10")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: По километражу", vbCritical, "Тупим))))"
Application.EnableEvents = False
CommandBars("Standard").Controls("О тменить").Execute
Application.EnableEvents = True
End If
End Sub
Кардаган вне форума Ответить с цитированием
Старый 29.07.2015, 19:27   #8
Ofigetmojno
Новичок
Джуниор
 
Регистрация: 28.07.2015
Сообщений: 5
По умолчанию

Неа.. Код, как и раньше, работает наполовину.
Ofigetmojno вне форума Ответить с цитированием
Старый 30.07.2015, 09:49   #9
Ofigetmojno
Новичок
Джуниор
 
Регистрация: 28.07.2015
Сообщений: 5
По умолчанию

Может быть эту задачу можно решить другим способом?
Ofigetmojno вне форума Ответить с цитированием
Старый 30.07.2015, 16:20   #10
Кардаган
Форумчанин
 
Регистрация: 07.07.2015
Сообщений: 121
По умолчанию

А попробуйте так:
Код:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Не_трогать As Range
If Range("G9") = "Почасовая" Then Exit Sub
Set Не_трогать = Range("D9:F9")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: Почасовая", vbCritical, "Тупим))))"
Else
If Range("G9") = "По километражу" Then Exit Sub
Set Не_трогать = Range("D10:F10")
If Not Intersect(Target, Не_трогать) Is Nothing Then
MsgBox "Выбери тип оплаты: По километражу", vbCritical, "Тупим))))"
Application.EnableEvents = False
CommandBars("Standard").Controls("О тменить").Execute
Application.EnableEvents = True
End If
End If
End Sub
Кардаган вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы модальное окно закрылось по условию? DrMcSheen Общие вопросы C/C++ 2 24.08.2009 15:54
Как обозначить ячейку на одну правее от активной ячейки? ru3000 Microsoft Office Excel 4 28.07.2009 08:03
Извлечь в одну ячейку несколько значений из строки которые удовлетворяют заданному условию. Dorvir Microsoft Office Excel 5 08.04.2008 16:12
Как сделать форму всегда активной? londoner Общие вопросы Delphi 3 04.03.2007 14:44
как сделать так чтобы при открытии второй формы олько она была активной doncova1 Общие вопросы Delphi 2 03.02.2007 19:34