Давно хотел сваять процедуру выпадающего календаря не зависящего от библиотек сторонних производитей. По желанию Вы можете скопировать четыре части процедуры (DateClass, DateForm, DateFunction, DateYearClass) и календарь будет частью Вашего проекта.
Давно хотел сваять процедуру выпадающего календаря не зависящего от библиотек сторонних производитей. По желанию Вы можете скопировать четыре части процедуры (DateClass, DateForm, DateFunction, DateYearClass) и календарь будет частью Вашего проекта.VovaK
Хорошая вещь! По-моему на "Планете Ексель" Николая Павлова что-то подобное видел. Только там первый день - воскресенье, неудобно. И еще: почему свойство формы ShowModal стоит в True? Это не позволяет когда фору с календарем вызвал, выделить нужную ячейку. Или я что-то не понял?
Хорошая вещь! По-моему на "Планете Ексель" Николая Павлова что-то подобное видел. Только там первый день - воскресенье, неудобно. И еще: почему свойство формы ShowModal стоит в True? Это не позволяет когда фору с календарем вызвал, выделить нужную ячейку. Или я что-то не понял?alpalmar
alpalmar, Замысел прост - Вы вызываете форму из ячейки, в которую необходимо вставить дату. Если у вас задача расставить даты по листу ставьте DateForm.Show 0, ни каких сложностей.
alpalmar, Замысел прост - Вы вызываете форму из ячейки, в которую необходимо вставить дату. Если у вас задача расставить даты по листу ставьте DateForm.Show 0, ни каких сложностей.VovaK
Всем удачи. У нас все получится. С уважением, Владимир.
Дата: Воскресенье, 07.08.2011, 07:12 |
Сообщение № 5
Группа: Гости
Не силен в vba. Прошу строго не судить.
Подскажите, пожалуйста, например я хочу запускать календарь из формы по клику на кнопке. Соответственно, на кнопку я вешаю:
[vba]
Код
Private Sub CommandButton1_Click() DateForm.Show End Sub
[/vba]
Вопрос. Что необходимо изменить в коде календаря, чтобы результат (выбранная дата) прописывался не в ячейку на листе, а передавался в определенную переменную? Указанную переменную я потом успешно смог бы использовать в выводе где угодно: хоть в Label, хоть TextBox, хоть в любой нужной мне ячейке на листе.
Не силен в vba. Прошу строго не судить.
Подскажите, пожалуйста, например я хочу запускать календарь из формы по клику на кнопке. Соответственно, на кнопку я вешаю:
[vba]
Код
Private Sub CommandButton1_Click() DateForm.Show End Sub
[/vba]
Вопрос. Что необходимо изменить в коде календаря, чтобы результат (выбранная дата) прописывался не в ячейку на листе, а передавался в определенную переменную? Указанную переменную я потом успешно смог бы использовать в выводе где угодно: хоть в Label, хоть TextBox, хоть в любой нужной мне ячейке на листе.Гость
Дата: Воскресенье, 07.08.2011, 20:47 |
Сообщение № 7
Группа: Гости
C переменной получилось. Спасибо большое.
В процессе работы с календарем возник еще один вопрос. Когда кликаю на кнопку, вызываю DateForm.Show, всплывает календарь. Выбираю нужную дату, дата успешно прописывается в Label. Но чтобы закрыть календарь, необходимо еще раз кликнуть на выбранную дату. Т.е. календарь закрывается только при повторном клике на выбранной дате.
Можно ли как-то настроить, чтобы календарь закрывался при одном клике на выбранной дате?
C переменной получилось. Спасибо большое.
В процессе работы с календарем возник еще один вопрос. Когда кликаю на кнопку, вызываю DateForm.Show, всплывает календарь. Выбираю нужную дату, дата успешно прописывается в Label. Но чтобы закрыть календарь, необходимо еще раз кликнуть на выбранную дату. Т.е. календарь закрывается только при повторном клике на выбранной дате.
Можно ли как-то настроить, чтобы календарь закрывался при одном клике на выбранной дате?Гость
Вот как должна выглядеть процедура на клик мыша в модуле класса DateClass:
[vba]
Код
Private Sub DateButton_MouseDown(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call DateForm.ChangeYear If DateButton.ForeColor <> RGB(175, 175, 175) Then Call DateForm.Refresh(CInt(DateButton.Caption), Mon, CLng(CurrentYear)) End If If Err = 0 Then ActiveCell.Value = DateSerial(CInt(CurrentYear), Mon, CurrentDay) Else ActiveCell.Value = CurrentDay & "." & Format(Mon, "00") & "." & Trim(CurrentYear) '(отображение дат ранее 1900 года) End If Unload DateForm End Sub
[/vba]
В Вашей версии ActiveCell.Value заменено на глобальную переменную. Строка Unload DateForm в конце процедуры удаляет календарь.
Вот как должна выглядеть процедура на клик мыша в модуле класса DateClass:
[vba]
Код
Private Sub DateButton_MouseDown(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call DateForm.ChangeYear If DateButton.ForeColor <> RGB(175, 175, 175) Then Call DateForm.Refresh(CInt(DateButton.Caption), Mon, CLng(CurrentYear)) End If If Err = 0 Then ActiveCell.Value = DateSerial(CInt(CurrentYear), Mon, CurrentDay) Else ActiveCell.Value = CurrentDay & "." & Format(Mon, "00") & "." & Trim(CurrentYear) '(отображение дат ранее 1900 года) End If Unload DateForm End Sub
[/vba]
В Вашей версии ActiveCell.Value заменено на глобальную переменную. Строка Unload DateForm в конце процедуры удаляет календарь.VovaK
Всем удачи. У нас все получится. С уважением, Владимир.
Сообщение отредактировал VovaK - Понедельник, 08.08.2011, 07:06
Володя, хороший календарь сделал. Только чуть-чуть с формулами вычисления даты и инициализацией накрутил лишнего. Я тут на досуге подправил. Теперь месяц нормально устанавливается на форме по дате в ячейке. Есть, однако, пара вопросов: 1. Какой смысл разбивать год по одной цифре в лэйбл-боксе? Почему сразу не сделать в одном текст-боксе все цифры? 2. Я сделал немодальный вызов. Но никак не могу при изменении активной ячейки заставить перерисоваться календарь Посмотри, тебе в твоём коде проще разобраться... 3. При листании месяцев вперёд-назад они "упираются" в декабрь и январь вместо того чтобы год прибавлялся/убавлялся... 4. Подумай, куда бы на форме поместить кнопочку для перехода к текущей дате?
Володя, хороший календарь сделал. Только чуть-чуть с формулами вычисления даты и инициализацией накрутил лишнего. Я тут на досуге подправил. Теперь месяц нормально устанавливается на форме по дате в ячейке. Есть, однако, пара вопросов: 1. Какой смысл разбивать год по одной цифре в лэйбл-боксе? Почему сразу не сделать в одном текст-боксе все цифры? 2. Я сделал немодальный вызов. Но никак не могу при изменении активной ячейки заставить перерисоваться календарь Посмотри, тебе в твоём коде проще разобраться... 3. При листании месяцев вперёд-назад они "упираются" в декабрь и январь вместо того чтобы год прибавлялся/убавлялся... 4. Подумай, куда бы на форме поместить кнопочку для перехода к текущей дате?Alex_ST
1. Понты - В давние времена у меня был металлический перекидной календарь, год там был четыре цифры в окошках. Согласись прикольно. 2. Вот накой немодальный вызов - вызвал - дату выбрал - календарь ушел - дата осталась. Я понимаю процесс какой обсчитывать, думаю это лишнее. Тем более открывается быстро и возвращает дату из активной ячейки. 3. Поюзаю, подумаю, если много не переписывать добавлю... 4. Вот накой козе баян? Если вызывать из пустой ячейки позицирует на текущей дате, зачем еще кнопка - Алекс пустое, тем более даты можно выбрать двумя кликами.
Alex_ST, Отвечу по пунктам:
1. Понты - В давние времена у меня был металлический перекидной календарь, год там был четыре цифры в окошках. Согласись прикольно. 2. Вот накой немодальный вызов - вызвал - дату выбрал - календарь ушел - дата осталась. Я понимаю процесс какой обсчитывать, думаю это лишнее. Тем более открывается быстро и возвращает дату из активной ячейки. 3. Поюзаю, подумаю, если много не переписывать добавлю... 4. Вот накой козе баян? Если вызывать из пустой ячейки позицирует на текущей дате, зачем еще кнопка - Алекс пустое, тем более даты можно выбрать двумя кликами.VovaK
Всем удачи. У нас все получится. С уважением, Владимир.
1. Ну, это на любителя... Поэтому в своей доработке я окошечки сдвинул поближе друг к другу. 2. Немодальный вызов удобен если обрабатываешь табличку с несколькими датами. Тогда в Activecell значение из календаря вносить можно даблкликом по нужной дате. А закрывать форму после изменения всех нужных дат - "крестиком" 3. С прокруткой через месяцы по годам получилось очень удобно. Вряд ли кто будет против такой фичи возражать. 4. Не согласен. Если, листая даты далеко ушёл от "сегодня", то удобнее к нему возвратиться по спец.кнопочке чем вспоминать "а что у нас сегодня?" и опять листать до нужной даты (ведь вставка запрещена).
И к стати, ты, я смотрю, даже не посмотрел, как я упростил формулы... А там здорово сократилось и окультурилось всё
1. Ну, это на любителя... Поэтому в своей доработке я окошечки сдвинул поближе друг к другу. 2. Немодальный вызов удобен если обрабатываешь табличку с несколькими датами. Тогда в Activecell значение из календаря вносить можно даблкликом по нужной дате. А закрывать форму после изменения всех нужных дат - "крестиком" 3. С прокруткой через месяцы по годам получилось очень удобно. Вряд ли кто будет против такой фичи возражать. 4. Не согласен. Если, листая даты далеко ушёл от "сегодня", то удобнее к нему возвратиться по спец.кнопочке чем вспоминать "а что у нас сегодня?" и опять листать до нужной даты (ведь вставка запрещена).
И к стати, ты, я смотрю, даже не посмотрел, как я упростил формулы... А там здорово сократилось и окультурилось всё Alex_ST
1. Окошечки сдвинул и весь шарм пропал - но хозяин-барин дело вкуса. 2. Касательно немодального режима, Алекс зачем процедуру на клик мыша продублировал в своей версии (верхнюю удали) и закоментируй в оставшейся Unload DateForm. Если желаешь переписывать даты, можешь привязать к событию SelectionChange листа изменение глобальных переменных Mon, CurrentYear и CurrentDay с вызовом процедуры DateForm.Refresh(CurrentDay, Mon, CLng(CurrentYear)). 3. Кнопку на сегодня, если очень хочешь, сделай сам - код смотри в UserForm_Initialize. 4. Формулы не оценил? Да. Мои мне больше нравятся.
Alex_ST, не смотрел потому что zip в запрете.
1. Окошечки сдвинул и весь шарм пропал - но хозяин-барин дело вкуса. 2. Касательно немодального режима, Алекс зачем процедуру на клик мыша продублировал в своей версии (верхнюю удали) и закоментируй в оставшейся Unload DateForm. Если желаешь переписывать даты, можешь привязать к событию SelectionChange листа изменение глобальных переменных Mon, CurrentYear и CurrentDay с вызовом процедуры DateForm.Refresh(CurrentDay, Mon, CLng(CurrentYear)). 3. Кнопку на сегодня, если очень хочешь, сделай сам - код смотри в UserForm_Initialize. 4. Формулы не оценил? Да. Мои мне больше нравятся.VovaK
Всем удачи. У нас все получится. С уважением, Владимир.
light26, откройте редактор VBA и выберите лист1, увидите код процедуры обработки события на листе. Это один из способов вызвать календарь, второй способ - это если вы откроете модуль книги, там залочены процедуры подключения календаря к выпадающему меню на правый клик по ячейке листа.
А из любого макроса календарь вызывается командой DateForm.Show.
Учите матчасть light26, вы уже давно на форуме, чтобы так изумляться...
light26, откройте редактор VBA и выберите лист1, увидите код процедуры обработки события на листе. Это один из способов вызвать календарь, второй способ - это если вы откроете модуль книги, там залочены процедуры подключения календаря к выпадающему меню на правый клик по ячейке листа.
А из любого макроса календарь вызывается командой DateForm.Show.
Учите матчасть light26, вы уже давно на форуме, чтобы так изумляться...VovaK
Всем удачи. У нас все получится. С уважением, Владимир.