Доброго времени суток.
вопрос: реально-ли организовать в EXCEL "напоминание" на определенное событие?
в одной ячейке событие, в другой - дата. реально-ли что б по дате выскакивало окошко с напоминанием данного события?
спасибо
Цитата: Cartman от 30.01.2009, 14:58
реально-ли организовать в EXCEL "напоминание" на определенное событие?
Реально. Вот инструкция:
- A1: =СЕГОДНЯ()
- A8: =<требуемая дата>
- B8: =ЕСЛИ(A8=A1;ШСООБЩЕНИЕ("Настало время познакомиться с VBA поближе.");"Осталось "&A8-A1&" дней.")
В модуле приложения (
Insert -> Module) размещаем код пользовательской функции:
Function ШСООБЩЕНИЕ(Текст As String) As String
Application.Volatile
MsgBox Текст
ШСООБЩЕНИЕ = Текст
End Function
Цитата: Шпец Докапыч от 30.01.2009, 21:03
Цитата: Cartman от 30.01.2009, 14:58
реально-ли организовать в EXCEL "напоминание" на определенное событие?
Реально. Вот инструкция:
- A1: =СЕГОДНЯ()
- A8: =<требуемая дата>
- B8: =ЕСЛИ(A8=A1;ШСООБЩЕНИЕ("Настало время познакомиться с VBA поближе.");"Осталось "&A8-A1&" дней.")
В модуле приложения (Insert -> Module) размещаем код пользовательской функции:
Function ШСООБЩЕНИЕ(Текст As String) As String
Application.Volatile
MsgBox Текст
ШСООБЩЕНИЕ = Текст
End Function
спасибо
есть пару вопросов:
окошко выпрыгивает при любых действиях с любой ячейкой.
1) можно-ли сделать что б EXCEL сам ставил правильную дату в ячейчку СЕГОДНЯ ()?
2) можно-ли сделать что б напоминания выскакивали один раз при загрузке EXCEL?
спасибо
Цитата: Cartman от 03.02.2009, 12:36
можно-ли сделать что б напоминания выскакивали один раз при загрузке EXCEL?
Давайте рассмотрим и такой вариант...
В модуль книги (Alt+F11 -> дважды по ЭтаКнига), размещаем там:
Private Sub Workbook_Open()
For Each i In Sheets("Лист1").[A1:A29]
If Format(i, "dd.mm.yy") = Format(Now(), "dd.mm.yy") Then
MsgBox i.Offset(0, 1).Value
End If
Next
End Sub
Теперь, найдя в диапазоне "A1:A29" сегодняшнюю дату, выскочит сообщение из смежной ячейки в "B1:B29".
PS: Возможно, Вам также будет интересна тема: "Музыкальное сообщение по условию" (https://forum.msexcel.ru/microsoft_excel/muzykalnoe_soobschenie_po_usloviyu-t843.0.html).
еще вопрос:
рельно-ли сделать что б макрос брал дату и текст напоминания из одной ячейки?
(например [03.02.09 "Настало время познакомиться с VBA поближе."]
и еще: можно-ли как-то сделать что б когда выскакивает окошко с сообщением сам EXEL продолжал работать? (т.е. что б можно было вносить изменения в таблицы не закрывая окошко с сообщением)
спасибо
Цитата: Cartman от 03.02.2009, 20:03
рельно-ли сделать что б макрос брал дату и текст напоминания из одной ячейки?
и еще: можно-ли как-то сделать что б когда выскакивает окошко с сообщением сам EXEL продолжал работать?
Реально, но вместо сообщения надо будет задействовать UserForm. Итак, инструкция...
В модуле книги ЭтаКнига:
Private Sub Workbook_Open()
For Each i In Sheets("Лист1").[A1:A29]
If InStr(1, i, Format(Now(), "dd.mm.yy")) Then
msgText = Mid(i, InStr(1, i, """") + 1, InStrRev(i, """") - InStr(1, i, """") - 1)
UserForm1.Show 0
End If
Next
End Sub
В обычном модуле (
Insert -> Module):
Public msgText As String
Создаём пользовательскую форму (
Insert -> UserForm), размещаем на ней Надпись (
Label) и модуле формы (
F7) прописываем:
Private Sub UserForm_Initialize()
Me.Label1.Caption = msgText
End Sub
не получается что...
run-time error '5':
invalid procedure call or argument
пальцем показывает на строчку
msgText = Mid(i, InStr(1, i, """") + 1, InStrRev(i, """") - InStr(1, i, """") - 1)
на всякий случай подопытный файл во вложении.
Цитата: Cartman от 06.02.2009, 16:40
не получается что...
Это у Вас бета-тестинг такой: записать все возможные форматы даты-текста? :) Вроде как мы ориентировались на такой:
dd.mm.yy "текст"Давайте определимся: Вы сейчас нарисовали событий 8 разными вариантами. Т.е. планируете записывать их как ни попадя или же стилизуете под один вышеуказанный? И второй момент: может ли быть несколько записей за одно число? Если да, то как это будет выглядеть: в той же ячейке в новой строке (через Alt+Enter) или несколькими записями, которые надо собрать в одно напоминание?
это не бета-тестинг, это я пытался подобрать возможные варианты формата записи в ячейке :)
стилизировать надпись лучше так:
7.02.09 Какая-то надпись
т.е. дата в таком формате и надпись без ковычек
было бы замечательно если б напоминание срабатывало как на одну и ту-же ячейку с разными датами, так и на разные ячейки. совместить это в одном окошке было бы отлично.
спасибо
Цитата: Cartman от 07.02.2009, 20:17
стилизировать надпись лучше так:
7.02.09 Какая-то надпись
т.е. дата в таком формате и надпись без ковычек
Как заказывали ;):
в обычный модуль приложения:
Public msgText As String
в модуль книги (ЭтаКнига):
Private Sub Workbook_Open()
msgText = ""
For Each i In Sheets("Лист1").[A1:A29]
If InStr(1, i, Format(Now(), "d.mm.yy")) Then
If Len(msgText) > 0 Then msgText = msgText & Chr(10)
msgText = msgText & Replace(i, Format(Now(), "d.mm.yy"), "")
End If
Next
UserForm1.Show 0
End Sub
Цитироватьбыло бы замечательно если б напоминание срабатывало как на одну и ту же ячейку с разными датами...
С разными датами это как? Так?:
7.02.09, 10.02.09, 13.02.09-15.02.09 втыкать в исходники
СУПЕР! заработало!!! спасибо!!!
предлагаю усложнить задачу
примитивно описал в форме макроса.
(основное - разделитель разных событий)
остальное во вложении
p.s.
если реализация сложна - ну значит надо самому знакомится с ВБА ))
спасибо
Цитата: Cartman от 07.02.2009, 23:30
предлагаю усложнить задачу
примитивно описал в форме макроса.
(основное - разделитель разных событий)
остальное во вложении
Давайте поправим одну строчку:
'msgText = msgText & Replace(i, Format(Now(), "d.mm.yy"), "") 'было
msgText = msgText & i.Offset(0, -1) & Chr(10) & _
Replace(i, Format(Now(), "d.mm.yy"), "") & Chr(10) & _
"------------------------------------------" 'стало
И подрисуем заголовок для первой закладки:
Private Sub UserForm_Initialize()
Me.Label1.Caption = msgText
Me.MultiPage1.Pages(0).Caption = Format(Now(), "d.mm.yy")
End Sub
А что с остальными закладками? Вы хотите знать события на два дня (два события) вперёд что ли?
Цитата: Шпец Докапыч от 08.02.2009, 00:13
А что с остальными закладками? Вы хотите знать события на два дня (два события) вперёд что ли?
да. закладок много.. что-то я переборщил...
а как на счет что б в одном окне (как первоначальный вариант) собрать все события в таком формате:
дата
номер из столбца А текст из столбца В
напоминание из столбца D (т.е. столбцы идут не подряд, хотелось бы иметь возможность прописывать "нужный" диапазон)
---------------------------------------------------------- \\разделитель
дата
номер из столбца А текст из столбца В
напоминание из столбца D
---------------------------------------------------------- \\разделитель
и еще б что б само окно имело вертикальную прокрутку )
и реально-ли задать диапазон напоминаний не в один столбец, а в несколько (например D1-D29 , F1-F29 и H1-H29) с такой-же структурой отображения как и первый ?
Цитата: Cartman от 08.02.2009, 00:57
а как на счет что б в одном окне (как первоначальный вариант) собрать все события в таком формате:...
Да хоть в каком. Чувствуется, на этом не ограничится. ;)
'...
msgText = msgText & Format(Now(), "d.mm.yy") & Chr(10) & _
Cells(i.Row, 1) & " " & Cells(i.Row, 2) & Chr(10) & _
Replace(i, Format(Now(), "d.mm.yy"), "") & Chr(10) & _
"------------------------------------------"
With i.Offset(0, 1) 'плюс ещё один столбец
If Len(.Value) > 0 Then
msgText = msgText & Chr(10) & Left(.Value, InStr(1, .Value, " ")) & Chr(10) & _
Cells(i.Row, 1) & " " & Cells(i.Row, 2) & Chr(10) & _
Mid(.Value, InStr(1, .Value, " ") + 1, 999) & Chr(10) & _
"------------------------------------------"
End If
End With
End If
Next
UserForm1.Show 0
End Sub
Цитироватьи еще б что б само окно имело вертикальную прокрутку )
Оно само, вернее Label, не имеет прокрутки. Вам надо либо размещать события в ListBox, либо прикручивать элемент ScrollBar, но это отдельная история, выходящая за рамки темы.
не работает (
показывает только "сегодняшние" события, следующие дни не показывает...
не могу понять как прописаны диапазоны ячеек, в которых ведется поиск напоминаний. например поиск должен происходить столбцах от D до G и M а заголовок к напоминанию в столбцах A и В тех же строках, где есть напоминание.
можно чуть подробнее про описание диапазонов поиска? (ну так что б от А1 до А100 + от В1 до В100 +... ну или как-то так... или так нельзя?)
спасибо
Цитата: Cartman от 08.02.2009, 02:18
не работает (
показывает только "сегодняшние" события, следующие дни не показывает...
А я и не подцеплял следующие. ;)
См. вложение - там в коде указано где менять диапазон и как выглядит несмежный.
Плюс прикрутил ListBox.
***Файл временно удален из-за подозрения на вирусы.***
Цитата: Шпец Докапыч от 08.02.2009, 12:08
Цитата: Cartman от 08.02.2009, 02:18
не работает (
показывает только "сегодняшние" события, следующие дни не показывает...
А я и не подцеплял следующие. ;)
См. вложение - там в коде указано где менять диапазон и как выглядит несмежный.
Плюс прикрутил ListBox.
что-то не так.. ругается на слово format в шестой строке. говорит "Compile error: Can't find project or library"
что делать?
Цитата: Cartman от 08.02.2009, 20:33
говорит "Compile error: Can't find project or library"
что делать?
Первое, что следует проверить, когда не найдена библиотека:
Tools -> References на наличие строки:
MISSING: <название библиотеки>И если такая есть, то переподключить эту библиотему через кн. "Brawse..."
А ещё можно уточнить на чём именно затык, если строку:
If InStr(1, i, Format(Now(), "d.mm.yy")) Then Call Text(i)
разложить на след. конструкцию:
vr = Now()
vrF = Format(vr, "d.mm.yy")
If InStr(1, i, vrF) Then
Call Text(i)
End If
странно как-то.. опция References не активна..
переместил все коды в старый файл - ЗАРАБОТАЛО!! :)
спасибо!
Несколько вопросов:
1) каким образом можно задать диапазоны поиска для разных листов книги (в формате "Лист1" - С1:O100, "Лист2" - В1:В100 и т.д..)
2) можно-ли организовать обратную связь из окошка напоминания к ячейке, которая вызвала напоминание (к примеру для изменения даты или содержания напоминания) либо выделение этой ячейки.
3) как организовать поиск дат к примеру на 14 дней вперед? 14 раз прописать этот код добавляя каждый раз +1?
For Each i In myRange 'ищем сегодня
If InStr(1, i, Format(Now(), "d.mm.yy")) Then Call Text(i)
Next
4) как организовать перенос по строкам напоминаний, которые не вмещается в выделенную область в ListBox'е
спасибо
как организовать закрытие формы по нажатию Esc ?
Цитата: Cartman от 28.02.2009, 12:11
как организовать закрытие формы по нажатию Esc ?
Надо написать реакцию на событие KeyDown, KeyUp или KeyPress.
Допустим на отжатие "Esc" будет так:
Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then Unload Me
End Sub
не получается (
я так понимаю код вставлять в свойства формы? но не закрывает окошко
Цитата: Cartman от 28.02.2009, 13:16
я так понимаю код вставлять в свойства формы?
Создайте это событие для тех элементов, расположенных на форме, в которых может находиться фокус, когда возникнет желание нажать на "Esc". ;)
элементов вроде и не густо, а не получается...
Private Sub ListBox1_Click()
End Sub
Private Sub ListBox_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then Unload Me
End Sub
Private Sub UserForm_Initialize()
Me.ListBox1.List = Split(msgText, Chr(10))
End Sub
Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then Unload Me
End Sub
что не так?
p.s.
еще вопросик: как добавить еще один диапазон на другом листе книги? пробовал уже по всякому но так и не получилось (
Set myRange = Sheets("Лист1").Range("C6:P500")
спасибо
Я конечно мало чего тут понимаю, но не могли бы вы мне помочь?!
С этим все понятно, все получилось.
Цитата: Шпец Докапыч от 30.01.2009, 21:03
Цитата: Cartman от 30.01.2009, 14:58
реально-ли организовать в EXCEL "напоминание" на определенное событие?
Реально. Вот инструкция:
- A1: =СЕГОДНЯ()
- A8: =<требуемая дата>
- B8: =ЕСЛИ(A8=A1;ШСООБЩЕНИЕ("Настало время познакомиться с VBA поближе.");"Осталось "&A8-A1&" дней.")
В модуле приложения (Insert -> Module) размещаем код пользовательской функции:
Function ШСООБЩЕНИЕ(Текст As String) As String
Application.Volatile
MsgBox Текст
ШСООБЩЕНИЕ = Текст
End Function
Мне нужно сделать так, что бы это сообщение появлялось только 1 раз (у меня появляется 4 раза, т.к. у меня 4 даты? а будет больше) в самом начале и больше меня не беспокоило до следующего открытия файла, т.е. что бы я смог в нем работать и вносить изменения.
Не подскажите как такое провернуть?
Цитата: Шпец Докапыч от 08.02.2009, 12:08
А я и не подцеплял следующие. ;)
См. вложение - там в коде указано где менять диапазон и как выглядит несмежный.
Плюс прикрутил ListBox.
Уважаемый Шпец Докапыч! Файлик загружается с ТРОЯНОМ!!!!!!
Цитата: Wasilic от 19.02.2010, 17:57
Уважаемый Шпец Докапыч! Файлик загружается с ТРОЯНОМ!!!!!!
Да нет. Вроде нормальный файлик. Проверил NOD32 со свежими базами. Спасибо за бдительность, но, видимо, Вам нужно проверить свою машину. Зараза могла прицепиться уже после скачивания.
На нет и суда нет.
Но, в таком случае, эта зараза цеплялась бы ко всем открываемым файлам Экселя. Однако - только к этому.
У меня лицензионный Vba32 c ежедневным обновлением
Здесь http://www.virusblokada.ru/ и здесь http://anti-virus.by/
есть проверка в ОН-ЛАЙН.
Да, действительно, пишет, что файл инфицирован.
Хорошо, спасибо. Файл пока с форума удаляю и передаю на анализ в NOD32
поправочка, цели изменились.
как исправить этот код
ЦитироватьPrivate Sub Workbook_Open()
msgText = ""
For Each i In Sheets("лист1").[C1:C350]
If InStr(1, i, Format(Now(), "dd.mm.yy")) Then
If Len(msgText) > 0 Then msgText = msgText & Chr(10)
msgText = msgText & Replace(i, Format(Now(), "d.mm.yy"), "")
End If
Next
UserForm1.Show 0
End Sub
чтобы сообщение выводил на дату, которая меньше или равна текущей минус 30 дней?
Т.е. если сегодня 24.02.2010, то он выводил сообщение, на дату равной или менее 23.03.2010.
Или на определенное выражение, если с датой невозможно.
Никто не знает как решить проблему?
ИМХО проблема в вопросе.
u menea excel 2007, hotelasi zdelati dokument s napominaniem, kto mojit pomo4i??? plizz
Что не устраивает в представленном напоминании?
kak naiti eti functii (
(добавлено)
nasol, sorii
4to nado zdelati 4tobi etot dokument kakto napomnil o sebe kogda deni napomenanie nastupil?
- B8: =ЕСЛИ(A8=A1;ШСООБЩЕНИЕ("Настало время познакомиться с VBA поближе.");"Осталось "&A8-A1&" дней.")
kak budet vangliskom variante?
ЕСЛИ = IF. См. весь перечень соответствий в теме "список формул на рус и англ языках" (https://forum.msexcel.ru/empty-t3101.0.html)
Вместо [;], разделителем аргументов по умолчанию в англ. версии служит [,]. Если русское название пользовательской функции не прокатит, то в формуле и коде надо прописать тоже латинскими: ШООБЩЕНИЕ = SHMSG
Function SHMSG(txt As String) As String
Application.Volatile
MsgBox txt
SHMSG = txt
End Function
nat takovo SHMSG
(добавлено)
gde mojno po4itati, kak eto mojno zdelati ot А до Я???
Можешь посмотреть здесь: "Как создавать свои функции" (http://www.vertex42.com/ExcelArticles/user-defined-functions.html) (en.)
nu tipa 4islo ia zdelal stobi fihadilo mne kogda nujen deni, no hotelasi sprositi kak zdelati 4tobi failik sam prokri4al ili dal o sebe znati, 4to sevodnia deni kotorii nujen?
Подскажите пожалуйста. Я в ВБА не в зуб ногой, но очень надо сделать нечто подобное вашей напоминалке в Экселе.
Есть даты в столбце A, кроме того номера договора (B), фамилия исполнителя (С), регион и телефон контакта(D).
Пытаюсь писать код как у вас, но после открытия файла, выдаётся только пустое окошко. В каких-то командах начал разбираться, но глубоко вникнуть не получается.
Получается вывести только значение одной ячейки с помощью offset, а уже более сложное - не осиливаю.
Мне хотелось бы, чтобы окошко выдавало все данные из строк с совпадающим значением даты. То есть:
25.05.2011 №... ФИО исполнителя и телефон. И так все совпадающие.
В идеале бы ещё и на ближайшие пару дней.
Надеюсь ветка ещё жива и помощь придёт)
Заранее спасибо.
Private Sub Workbook_Open()
msgText = ""
For Each i In Sheets("Лист1").[A2:A100]
If InStr(2, i, Format(Now(), "dd.mm.yy")) Then
If Len(msgText) > 0 Then msgText = msgText & Chr(10)
msgText = msgText & Format(Now(), "dd.mm.yy") & Chr(10) & _
Cells(i.Row, 1) & " " & Cells(i.Row, 2) & Chr(10) & _
Replace(i, Format(Now(), "dd.mm.yy"), "") & Chr(10) & _
"------------------------------------------"
With i.Offset(0, 1) '???? ??? ???? ???????
If Len(.Value) > 0 Then
msgText = msgText & Chr(10) & Left(.Value, InStr(1, .Value, " ")) & Chr(10) & _
Cells(i.Row, 1) & " " & Cells(i.Row, 2) & Chr(10) & _
Mid(.Value, InStr(1, .Value, " ") + 1, 999) & Chr(10) & _
"------------------------------------------"
End If
End With
End If
Next
UserForm1.Show 0
End Sub
P.S. Кстати, при отладке кода, заметил, что выполнение не входит в основной цикл.
то есть программа доходит до:
For Each i In Sheets("Лист1").[A2:A100]
If InStr(1, i, Format(Now(), "dd.mm.yy")) Then
Условие не выполняется и он уходит в конец цикла, после чего история повторяется.
Спасибо, всё сделал сам)) Книжка по VBA и ваш код в помощь)
Всем привет.
Очень актуальная тема для меня.
Подскажите как получить последние файлы с реализованными решениями? (если нет возможности, помогите с решением. Я в ВБА полный ноль).
У меня такая же необходимость в напоминалке.
Есть список Клиентов (название листа, порядок и расположение столбцов реальное) с:
1 названием компании
2 контактная инфа
3 дата созвона
4 дата тендера
Что хотелось бы:
напоминалку с закладками на 7 дней (на 1 дату (столбец K) одна закладка, в ней перечень компаний с короткой инфой. Друг от друга данные можно отделить как-то).
Короткая инфа по компании:
1 название компании (столбец D)
2 контактная инфа (столбец F)
3 дата тендера (столбец M)
Также было бы удобно вызывать напоминалку кнопкой на листе или сочетанием клавиш после обновления данных на листе.
Что сейчас имеется:
В модуле книги ЭтаКнига:
Private Sub Workbook_Open()
msgText = ""
For Each i In Sheets("Лист1").[D1:D29]
If InStr(1, i, Format(Now(), "d.mm.yy")) Then
If Len(msgText) > 0 Then msgText = msgText & Chr(10)
msgText = msgText & Format(Now(), "d.mm.yy") & Chr(10) & _
Cells(i.Row, 1) & " " & Cells(i.Row, 2) & Chr(10) & _
Replace(i, Format(Now(), "d.mm.yy"), "") & Chr(10) & _
"------------------------------------------"
With i.Offset(0, 1) 'плюс ещё один столбец
If Len(.Value) > 0 Then
msgText = msgText & Chr(10) & Left(.Value, InStr(1, .Value, " ")) & Chr(10) & _
Cells(i.Row, 1) & " " & Cells(i.Row, 2) & Chr(10) & _
Mid(.Value, InStr(1, .Value, " ") + 1, 999) & Chr(10) & _
"------------------------------------------"
End If
End With
End If
Next
UserForm1.Show 0
End Sub
В обычном модуле (Insert -> Module):
Public msgText As String
Создаём пользовательскую форму (Insert -> UserForm), размещаем на ней Надпись (Label) и модуле формы (F7) прописываем:
Private Sub MultiPage1_Change()
End Sub
Private Sub UserForm_Initialize()
Me.Label1.Caption = msgText
Me.MultiPage1.Pages(0).Caption = Format(Now(), "d.mm.yy")
End Sub
В результате:
Дата и текст напоминания берутся из одной ячейки – у меня дата в одной ячейке, данные в других ячейках.
В примере, дата в столбике D – у меня в столбике К
В примере данные берутся из столбиков «В», «А», «D» - у меня должны браться из столбиков «D», «F», «М»
Учитывая большое количество событий, нужна полоса прокрутки – не все помещается на экране.
После обновления данных в экселе для запуска напоминалки нужна кнопка – закрывать, а потом открывать файлик долго.