Нужна помощь Нужно выводить всплывающее окно-предупреждение, если какое-то слово (фамилия руководителя) будет повторяться за текущую дату больше 12 раз. Важна привязка к дате. Текущая дата и время автоматически будут проставляться в первом столбце
Нужна помощь Нужно выводить всплывающее окно-предупреждение, если какое-то слово (фамилия руководителя) будет повторяться за текущую дату больше 12 раз. Важна привязка к дате. Текущая дата и время автоматически будут проставляться в первом столбцеGalaDoker
- Прочитайте Правила форума - Приложите файл с исходными данными и желаемым результатом (можно вручную) в формате Excel размером до 100кб согласно п.3 Правил форума
- Прочитайте Правила форума - Приложите файл с исходными данными и желаемым результатом (можно вручную) в формате Excel размером до 100кб согласно п.3 Правил форума_Boroda_
Не думаю, что файл поможет, тем не менее он здесь сейчас установлено ограничение по длите текста. Если в ячейке B написать слово более 5 знаков, выйдет предупреждение. Мне нужно такое же предупреждение, но чтобы оно привязывалось к текущей дате. Например, сегодня 12 раз могу написать, следующие 12 только завтра.
Не думаю, что файл поможет, тем не менее он здесь сейчас установлено ограничение по длите текста. Если в ячейке B написать слово более 5 знаков, выйдет предупреждение. Мне нужно такое же предупреждение, но чтобы оно привязывалось к текущей дате. Например, сегодня 12 раз могу написать, следующие 12 только завтра.GalaDoker
Можно уточнить. Даже нужно. Мы с Вами как раз для этого сюда и пришли Можно задать на весь столбец. Но не нужно - все это влияет на память и скорость работы файла. Поэтому протянуть-то вниз можно, но без фанатизма, в разумных пределах
Можно уточнить. Даже нужно. Мы с Вами как раз для этого сюда и пришли Можно задать на весь столбец. Но не нужно - все это влияет на память и скорость работы файла. Поэтому протянуть-то вниз можно, но без фанатизма, в разумных пределах_Boroda_
_Boroda_, если нужно, тогда еще момент правило по проверке данных почему-то не срабатывает, если в ячейке уже прописана формула Например, в ячейку, где должно срабатывать правило, тянется информация по функции ВПР, но на 13 раз сообщение об ошибке не выходит С чем это может быть связано?
_Boroda_, если нужно, тогда еще момент правило по проверке данных почему-то не срабатывает, если в ячейке уже прописана формула Например, в ячейку, где должно срабатывать правило, тянется информация по функции ВПР, но на 13 раз сообщение об ошибке не выходит С чем это может быть связано? GalaDoker
С тем, что проверка данных работает с РУЧНЫМ ВВОДОМ. Она не сработает даже если Вы скопируете откуда-то текст и вставите его значением. Можно использовать Условное форматирование или макросы С Уф см. в файле
С тем, что проверка данных работает с РУЧНЫМ ВВОДОМ. Она не сработает даже если Вы скопируете откуда-то текст и вставите его значением. Можно использовать Условное форматирование или макросы С Уф см. в файле_Boroda_
_Boroda_, спасибо за подсказку, теперь стало понятно, но проблема осталась(( УФ не срабатывает, так как нужно - нужно именно выводить сообщение об ошибке. Попробую через макрос. Сможете помочь с кодом?
_Boroda_, спасибо за подсказку, теперь стало понятно, но проблема осталась(( УФ не срабатывает, так как нужно - нужно именно выводить сообщение об ошибке. Попробую через макрос. Сможете помочь с кодом?GalaDoker
_Boroda_, макрос начала. В принципе срабатывает, но только один раз и в ячейке 12, не привязываясь к дате. Думаю, если его повторять через каждые 12 ячеек столбца, вопрос был бы решен.
[vba]
Код
If Not Intersect(Target, Range("D2:D100")) Is Nothing Then If Application.CountA(Range("D2:D100")) = 13 Then MsgBox "Хватит" ' Call Макрос1 End If End If
[/vba]
_Boroda_, макрос начала. В принципе срабатывает, но только один раз и в ячейке 12, не привязываясь к дате. Думаю, если его повторять через каждые 12 ячеек столбца, вопрос был бы решен.
[vba]
Код
If Not Intersect(Target, Range("D2:D100")) Is Nothing Then If Application.CountA(Range("D2:D100")) = 13 Then MsgBox "Хватит" ' Call Макрос1 End If End If
_Boroda_, в последнем вашем файле все сработало как нужно. только не понимаю, как именно вы сделали, чтобы вставить в итоговый файл. Подскажите, пожалуйста
_Boroda_, в последнем вашем файле все сработало как нужно. только не понимаю, как именно вы сделали, чтобы вставить в итоговый файл. Подскажите, пожалуйстаGalaDoker
If Not Intersect(Target, Range("D2:D100")) Is Nothing Then If Application.CountA(Range("D2:D100")) = 13 Then MsgBox "Хватит" ' Call Макрос1 End If End If
[/vba]
надеюсь, правильно сделала
[vba]
Код
If Not Intersect(Target, Range("D2:D100")) Is Nothing Then If Application.CountA(Range("D2:D100")) = 13 Then MsgBox "Хватит" ' Call Макрос1 End If End If
Выше, в посте 12, код тегами оформите По коду - нужно проверку по дате и почему проверка на количество считается по столбцу D?
Еще вопросы: 1. Дата/время в столбце А должна проставляться при вводе/изменении данных в каком столбце? 2. Если мы сегодня меняем уже введенные вчера данные, то дата должна меняться? 3. Проверку на 12 записей делаем только для столбца Е или будут еще такие столбцы?
Но все это только после того, как оформите нормально пост 12
И неплохо было бы увидеть нормальный, рабочий файл, в котором конф. информацию (если есть) нужно не стереть, а заменить на зайчиков-котеночков-щеночков
Выше, в посте 12, код тегами оформите По коду - нужно проверку по дате и почему проверка на количество считается по столбцу D?
Еще вопросы: 1. Дата/время в столбце А должна проставляться при вводе/изменении данных в каком столбце? 2. Если мы сегодня меняем уже введенные вчера данные, то дата должна меняться? 3. Проверку на 12 записей делаем только для столбца Е или будут еще такие столбцы?
Но все это только после того, как оформите нормально пост 12
И неплохо было бы увидеть нормальный, рабочий файл, в котором конф. информацию (если есть) нужно не стереть, а заменить на зайчиков-котеночков-щеночков_Boroda_
Извините, я новичок на форумах, поэтому косячу на каждом шагу. Все исправила.
Пока смогла наколдовать только такой простенький код, потому что в макросах не сильна. Проверку поставила по D, так как новая информация вводится в него, а в E она подтягивается по формуле ВПР
1. Дата/время в столбце А должна проставляться при вводе/изменении данных в каком столбце? в любом, потому что файл могут начать заполнять с любого столбца.
2. Если мы сегодня меняем уже введенные вчера данные, то дата должна меняться? нет, дата не должна меняться
3. Проверку на 12 записей делаем только для столбца Е или будут еще такие столбцы? Только для E. Это единственный столбец, где будет приписана фамилия руководителя. В идеале нужно сравнить текущую дату и фамилию руководителя и если фамилия в текущей дате встречается на 13-й раз, выводить сообщение об ошибке.
К сожалению, рабочий файл прикрепить не получается - большой вес, поэтому только так сказать черновик
Извините, я новичок на форумах, поэтому косячу на каждом шагу. Все исправила.
Пока смогла наколдовать только такой простенький код, потому что в макросах не сильна. Проверку поставила по D, так как новая информация вводится в него, а в E она подтягивается по формуле ВПР
1. Дата/время в столбце А должна проставляться при вводе/изменении данных в каком столбце? в любом, потому что файл могут начать заполнять с любого столбца.
2. Если мы сегодня меняем уже введенные вчера данные, то дата должна меняться? нет, дата не должна меняться
3. Проверку на 12 записей делаем только для столбца Е или будут еще такие столбцы? Только для E. Это единственный столбец, где будет приписана фамилия руководителя. В идеале нужно сравнить текущую дату и фамилию руководителя и если фамилия в текущей дате встречается на 13-й раз, выводить сообщение об ошибке.
К сожалению, рабочий файл прикрепить не получается - большой вес, поэтому только так сказать черновикGalaDoker
Тогда как-то так Формулу в столбце Е вручную не пишите, макрос ее введет в соответствующую ячейку сам Дату/время ставит по первому вводу какого-то значения в столбец В и правее
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim d As Range, d1 As Range c_ = 4 'столбец сотрудника r1_ = UsedRange.Rows.Count 'последняя строка c1_ = UsedRange.Columns.Count 'последний столбец Set d1 = Intersect(Target, Cells(2, 2).Resize(r1_ - 1, c1_ - 1)) 'присваивание диапазона If Not d1 Is Nothing Then 'если от не пуст Application.ScreenUpdating = 0 'откл обновление экрана Application.Calculation = xlCalculationManual 'откл автопересчет Application.EnableEvents = 0 'откл реакцию на события excel For Each d In d1 'цикл по ячейкам диапазона d1 rd_ = d.Row 'строка ячейки If d.Value <> "" Then 'не пусто With Cells(rd_, 1) 'в первом столбце If Not IsDate(.Value) Then 'не дата .Value = Now - CDate("4:00") 'пишем дату/время End If If d.Column = c_ Then 'в столбце с With d.Offset(, 1) 'для следующего столбца .FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Лист1!R1C[-1]:R500C,2,),"""")" 'пишем формулу .Calculate 'пересчитываем ard = Cells(2, 1).Resize(r1_ - 1) 'массив дат arn = Cells(2, c_ + 1).Resize(r1_ - 1) 'массив начальников Set slov = CreateObject("Scripting.Dictionary") 'создаем словарь With slov 'работаем со словарем For i = 1 To r1_ - 1 'цикл по строкам If arn(i, 1) <> "" And ard(i, 1) <> "" Then 'если не пустые .Item(arn(i, 1) & Int(ard(i, 1))) = .Item(arn(i, 1) & Int(ard(i, 1))) + 1 'ключ словаря=сцепке начальник-дата, 'элемент = кол-ву таких сцепок End If Next i End With kl_ = .Value & Int(Cells(rd_, 1)) 'сцепка начальник-дата If slov.Exists(kl_) Then 'если она есть в словаре If slov.Item(kl_) > 12 Then 'если элемент по этой сцепке >12 MsgBox "тов. " & .Value & " устал(а)" 'сообщение .Offset(, -1).ClearContents 'стираем сотрудника End If End If End With End If End With End If Next d Application.EnableEvents = 1 ' Application.Calculation = xlCalculationAutomatic ' Application.ScreenUpdating = 1 ' End If End Sub
[/vba]
Тогда как-то так Формулу в столбце Е вручную не пишите, макрос ее введет в соответствующую ячейку сам Дату/время ставит по первому вводу какого-то значения в столбец В и правее
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim d As Range, d1 As Range c_ = 4 'столбец сотрудника r1_ = UsedRange.Rows.Count 'последняя строка c1_ = UsedRange.Columns.Count 'последний столбец Set d1 = Intersect(Target, Cells(2, 2).Resize(r1_ - 1, c1_ - 1)) 'присваивание диапазона If Not d1 Is Nothing Then 'если от не пуст Application.ScreenUpdating = 0 'откл обновление экрана Application.Calculation = xlCalculationManual 'откл автопересчет Application.EnableEvents = 0 'откл реакцию на события excel For Each d In d1 'цикл по ячейкам диапазона d1 rd_ = d.Row 'строка ячейки If d.Value <> "" Then 'не пусто With Cells(rd_, 1) 'в первом столбце If Not IsDate(.Value) Then 'не дата .Value = Now - CDate("4:00") 'пишем дату/время End If If d.Column = c_ Then 'в столбце с With d.Offset(, 1) 'для следующего столбца .FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Лист1!R1C[-1]:R500C,2,),"""")" 'пишем формулу .Calculate 'пересчитываем ard = Cells(2, 1).Resize(r1_ - 1) 'массив дат arn = Cells(2, c_ + 1).Resize(r1_ - 1) 'массив начальников Set slov = CreateObject("Scripting.Dictionary") 'создаем словарь With slov 'работаем со словарем For i = 1 To r1_ - 1 'цикл по строкам If arn(i, 1) <> "" And ard(i, 1) <> "" Then 'если не пустые .Item(arn(i, 1) & Int(ard(i, 1))) = .Item(arn(i, 1) & Int(ard(i, 1))) + 1 'ключ словаря=сцепке начальник-дата, 'элемент = кол-ву таких сцепок End If Next i End With kl_ = .Value & Int(Cells(rd_, 1)) 'сцепка начальник-дата If slov.Exists(kl_) Then 'если она есть в словаре If slov.Item(kl_) > 12 Then 'если элемент по этой сцепке >12 MsgBox "тов. " & .Value & " устал(а)" 'сообщение .Offset(, -1).ClearContents 'стираем сотрудника End If End If End With End If End With End If Next d Application.EnableEvents = 1 ' Application.Calculation = xlCalculationAutomatic ' Application.ScreenUpdating = 1 ' End If End Sub
_Boroda_, Да, вроде все работает так, как нужно) Я вам очень благодарна. И прежде всего за желание помочь "+" в репутации уже у вас в копилке)
_Boroda_, Да, вроде все работает так, как нужно) Я вам очень благодарна. И прежде всего за желание помочь "+" в репутации уже у вас в копилке)GalaDoker