Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Ограничение по содержанию ячейки для определённого диапазона - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ограничение по содержанию ячейки для определённого диапазона (Макросы/Sub)
Ограничение по содержанию ячейки для определённого диапазона
KIMVSR Дата: Четверг, 25.06.2015, 10:10 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 118
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Здравствуйте,

Скажите, пожалуйста, возможно ли написать какой-то маленький скриптик, который бы устанавливал ограничение по вводу данных на конкретный диапазон ячеек?

Например: у меня есть лист с ячейками, в который я хочу вводить лишь даты или букву "х".
Другие значения должна быть запрещены для ввода.

Я могу сделать через "Data validation", чтобы можно было вводить лишь даты.
Но тогда нет возможности ввести "x".

Можно ли как-то сделать такой макрос, который выполнял бы оба требования одновременно?
Либо дата, либо "х".

Спасибо!
К сообщению приложен файл: VSR_book_1.xlsx (8.4 Kb)
 
Ответить
СообщениеЗдравствуйте,

Скажите, пожалуйста, возможно ли написать какой-то маленький скриптик, который бы устанавливал ограничение по вводу данных на конкретный диапазон ячеек?

Например: у меня есть лист с ячейками, в который я хочу вводить лишь даты или букву "х".
Другие значения должна быть запрещены для ввода.

Я могу сделать через "Data validation", чтобы можно было вводить лишь даты.
Но тогда нет возможности ввести "x".

Можно ли как-то сделать такой макрос, который выполнял бы оба требования одновременно?
Либо дата, либо "х".

Спасибо!

Автор - KIMVSR
Дата добавления - 25.06.2015 в 10:10
Manyasha Дата: Четверг, 25.06.2015, 10:30 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
KIMVSR, здравствуйте. Можно сделать проверку при изменении листа:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Count > 1 Then Exit Sub
     If Not Intersect(Target, Range("a1:g13")) Is Nothing Then
         If Target.Value <> "" And Target.Value <> "x" And Not IsDate(Target.Value) Then
             Application.EnableEvents = False
             MsgBox "Вы можете вводить только дату или символ х", vbCritical
             Target.ClearContents
             Application.EnableEvents = True
         End If
     End If
End Sub
[/vba]
К сообщению приложен файл: VSR_book_2.xlsm (14.2 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеKIMVSR, здравствуйте. Можно сделать проверку при изменении листа:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Count > 1 Then Exit Sub
     If Not Intersect(Target, Range("a1:g13")) Is Nothing Then
         If Target.Value <> "" And Target.Value <> "x" And Not IsDate(Target.Value) Then
             Application.EnableEvents = False
             MsgBox "Вы можете вводить только дату или символ х", vbCritical
             Target.ClearContents
             Application.EnableEvents = True
         End If
     End If
End Sub
[/vba]

Автор - Manyasha
Дата добавления - 25.06.2015 в 10:30
KSV Дата: Четверг, 25.06.2015, 10:31 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
можно так (см. вложенный файл)
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
      If Intersect(Target, Range("A1:G13")) Is Nothing Then Exit Sub
      If Len(Target) And Not IsDate(Target) And Target <> "x" Then MsgBox "В этой ячейке разрешен ввод даты, либо ""x""": _
      Application.EnableEvents = False: Target = Empty: Target.Select: Application.EnableEvents = True
End Sub
[/vba]
К сообщению приложен файл: VSR_book_1.xlsm (14.4 Kb)


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333


Сообщение отредактировал KSV - Четверг, 25.06.2015, 10:50
 
Ответить
Сообщениеможно так (см. вложенный файл)
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
      If Intersect(Target, Range("A1:G13")) Is Nothing Then Exit Sub
      If Len(Target) And Not IsDate(Target) And Target <> "x" Then MsgBox "В этой ячейке разрешен ввод даты, либо ""x""": _
      Application.EnableEvents = False: Target = Empty: Target.Select: Application.EnableEvents = True
End Sub
[/vba]

Автор - KSV
Дата добавления - 25.06.2015 в 10:31
KIMVSR Дата: Четверг, 25.06.2015, 11:39 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 118
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Manyasha, KSV, ребят, просто супер!

А можно ещё как-то сделать так, чтобы даты вводились только в формате 25.06.2015
Т.е. исключительно через точку.
Просто сейчас можно ввести 25,06,2015.
А с такими датами (через запятую) не работает conditional formatting.

Т.е. мне просто нужно исключить все возможные варианты опечаток и ошибок при вводе.


Сообщение отредактировал KIMVSR - Четверг, 25.06.2015, 12:01
 
Ответить
СообщениеManyasha, KSV, ребят, просто супер!

А можно ещё как-то сделать так, чтобы даты вводились только в формате 25.06.2015
Т.е. исключительно через точку.
Просто сейчас можно ввести 25,06,2015.
А с такими датами (через запятую) не работает conditional formatting.

Т.е. мне просто нужно исключить все возможные варианты опечаток и ошибок при вводе.

Автор - KIMVSR
Дата добавления - 25.06.2015 в 11:39
Manyasha Дата: Четверг, 25.06.2015, 12:03 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
KIMVSR, в конец допишите (в мой макрос или в макрос Сергея (KSV) - все равно)[vba]
Код
            Application.EnableEvents = True 'После этой строчки
          ElseIf IsDate(Target.Value) Then
              Target.NumberFormat = "dd.mm.yyyy"
[/vba]
Хотя странно, через запятую я не могу ввести, т.к. это не дата. Да и УФ, если оно построено не на текстовом сравнении, должно понимать все форматы даты (если у Вас конечно действительно дата вводится через запятую)

UPD
Проверка на дату не обязательна, можно и без нее[vba]
Код
            Application.EnableEvents = True 'После этой строчки
          Else
              Target.NumberFormat = "dd.mm.yyyy"
[/vba]
[p.s.]Если будете использовать макрос KSV, не забудьте закрыть If и msgbox на новую строку перенести.[/p.s.]


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Четверг, 25.06.2015, 12:11
 
Ответить
СообщениеKIMVSR, в конец допишите (в мой макрос или в макрос Сергея (KSV) - все равно)[vba]
Код
            Application.EnableEvents = True 'После этой строчки
          ElseIf IsDate(Target.Value) Then
              Target.NumberFormat = "dd.mm.yyyy"
[/vba]
Хотя странно, через запятую я не могу ввести, т.к. это не дата. Да и УФ, если оно построено не на текстовом сравнении, должно понимать все форматы даты (если у Вас конечно действительно дата вводится через запятую)

UPD
Проверка на дату не обязательна, можно и без нее[vba]
Код
            Application.EnableEvents = True 'После этой строчки
          Else
              Target.NumberFormat = "dd.mm.yyyy"
[/vba]
[p.s.]Если будете использовать макрос KSV, не забудьте закрыть If и msgbox на новую строку перенести.[/p.s.]

Автор - Manyasha
Дата добавления - 25.06.2015 в 12:03
KIMVSR Дата: Четверг, 25.06.2015, 12:06 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 118
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Manyasha, сейчас попробую.

Увы, но всё равно даёт вводить через запятую:



[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Count > 1 Then Exit Sub
     If Not Intersect(Target, Range("A1:G13")) Is Nothing Then
         If Target.Value <> "" And Target.Value <> "x" And Not IsDate(Target.Value) Then
             Application.EnableEvents = False
             MsgBox "Only date or 'x' value is allowed to input!", vbCritical
             Target.ClearContents
             Application.EnableEvents = True
             Else
             Target.NumberFormat = "dd.mm.yyyy"
         End If
     End If
End Sub
[/vba]


Сообщение отредактировал KIMVSR - Четверг, 25.06.2015, 12:21
 
Ответить
СообщениеManyasha, сейчас попробую.

Увы, но всё равно даёт вводить через запятую:



[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Count > 1 Then Exit Sub
     If Not Intersect(Target, Range("A1:G13")) Is Nothing Then
         If Target.Value <> "" And Target.Value <> "x" And Not IsDate(Target.Value) Then
             Application.EnableEvents = False
             MsgBox "Only date or 'x' value is allowed to input!", vbCritical
             Target.ClearContents
             Application.EnableEvents = True
             Else
             Target.NumberFormat = "dd.mm.yyyy"
         End If
     End If
End Sub
[/vba]

Автор - KIMVSR
Дата добавления - 25.06.2015 в 12:06
KSV Дата: Четверг, 25.06.2015, 12:32 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
сделайте вот так и не заморачивайтесь с проверками
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Count > 1 Then Exit Sub
      If Not Intersect(Target, Range("A1:G13")) Is Nothing Then
          Application.EnableEvents = False
          If Target.Value <> "" And Target.Value <> "x" And Not IsDate(Target.Value) Then
              MsgBox "Only date or 'x' value is allowed to input!", vbCritical
              Target.ClearContents
          Else
              Target = Format(Target, "dd.mm.yyyy")
          End If
          Application.EnableEvents = True
      End If
End Sub
[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333


Сообщение отредактировал KSV - Четверг, 25.06.2015, 12:41
 
Ответить
Сообщениесделайте вот так и не заморачивайтесь с проверками
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Count > 1 Then Exit Sub
      If Not Intersect(Target, Range("A1:G13")) Is Nothing Then
          Application.EnableEvents = False
          If Target.Value <> "" And Target.Value <> "x" And Not IsDate(Target.Value) Then
              MsgBox "Only date or 'x' value is allowed to input!", vbCritical
              Target.ClearContents
          Else
              Target = Format(Target, "dd.mm.yyyy")
          End If
          Application.EnableEvents = True
      End If
End Sub
[/vba]

Автор - KSV
Дата добавления - 25.06.2015 в 12:32
KIMVSR Дата: Четверг, 25.06.2015, 13:42 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 118
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
KSV, просто восхитительно!

А можно ещё один, но очень маленький вопросик? :-)

Как сделать так, чтобы после ввода значения оно автоматической выравнивалось по правому краю ячейки?
Align Right

[vba]
Код
Range("A1").HorizontalAlignment = xlRight
[/vba]
Куда мне это вставить? %)

И щеё раз Manyasha, KSV, огромное вам спасибо за помощь!
Браузер глючит, не могу плюсануть. Дома обязательно сделаю! :-P

UPD 14:03

Всё, разобрался с выравниванием! Огромное всем спасибо! yes


Сообщение отредактировал KIMVSR - Четверг, 25.06.2015, 14:03
 
Ответить
СообщениеKSV, просто восхитительно!

А можно ещё один, но очень маленький вопросик? :-)

Как сделать так, чтобы после ввода значения оно автоматической выравнивалось по правому краю ячейки?
Align Right

[vba]
Код
Range("A1").HorizontalAlignment = xlRight
[/vba]
Куда мне это вставить? %)

И щеё раз Manyasha, KSV, огромное вам спасибо за помощь!
Браузер глючит, не могу плюсануть. Дома обязательно сделаю! :-P

UPD 14:03

Всё, разобрался с выравниванием! Огромное всем спасибо! yes

Автор - KIMVSR
Дата добавления - 25.06.2015 в 13:42
KSV Дата: Четверг, 25.06.2015, 14:08 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Куда мне это вставить?

можно так
[vba]
Код
Else
     Target = CDate(Replace(Target, ",", ".")) ' чтобы была честная дата, а не текст )
     Target.HorizontalAlignment = xlRight
End If
[/vba]
но проще один раз поставить формат ячеек этого диапазона "* ДД.ММ.ГГГГ" и забыть про него


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333


Сообщение отредактировал KSV - Четверг, 25.06.2015, 14:10
 
Ответить
Сообщение
Куда мне это вставить?

можно так
[vba]
Код
Else
     Target = CDate(Replace(Target, ",", ".")) ' чтобы была честная дата, а не текст )
     Target.HorizontalAlignment = xlRight
End If
[/vba]
но проще один раз поставить формат ячеек этого диапазона "* ДД.ММ.ГГГГ" и забыть про него

Автор - KSV
Дата добавления - 25.06.2015 в 14:08
KIMVSR Дата: Вторник, 07.07.2015, 10:15 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 118
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Обнаружил, что с данным макросом перестаёт работать conditional formatting.

Сделал такое правило:



Т.е. если событие было больше, чем год назад, система должна выделять её красным цветом.
Но этого не происходит. Причём текст вводится красным цветом, а потом резко превращается в чёрный.

Без макроса эта функция у меня работает без проблем.

Может кто-то смог бы помочь разобраться? pray

UPD: вернее сказать, conditional formatting работает, если применить его уже на введённые даты.
Но если вводить даты уже после после - не срабатывает.
[moder]УФ к данной теме не относиться, создайте новую.
Если работа файла зависит от наличия кода, прикладывайте свой пример с макросом.[/moder]
К сообщению приложен файл: 4483066.xlsx (8.7 Kb)


Сообщение отредактировал Manyasha - Вторник, 07.07.2015, 12:20
 
Ответить
СообщениеОбнаружил, что с данным макросом перестаёт работать conditional formatting.

Сделал такое правило:



Т.е. если событие было больше, чем год назад, система должна выделять её красным цветом.
Но этого не происходит. Причём текст вводится красным цветом, а потом резко превращается в чёрный.

Без макроса эта функция у меня работает без проблем.

Может кто-то смог бы помочь разобраться? pray

UPD: вернее сказать, conditional formatting работает, если применить его уже на введённые даты.
Но если вводить даты уже после после - не срабатывает.
[moder]УФ к данной теме не относиться, создайте новую.
Если работа файла зависит от наличия кода, прикладывайте свой пример с макросом.[/moder]

Автор - KIMVSR
Дата добавления - 07.07.2015 в 10:15
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ограничение по содержанию ячейки для определённого диапазона (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!