Страницы: 1 2 3 След.
RSS
Совместить выпадающий календарь и действия с ячейкой
 
Возникла проблема. Прошу подсказать, как ее побороть.  
1. Диапазон D4:D15. Выбор из выпадающего списка. При DoubleClick на ячейке копируются данные в эту строку из строки 2 (реализован или автоввод, или ручной ввод (тогда DoubleClick не задействуется)).  
2. Диапазон G2:I2. Данные для автокопирования по предыдущему пункту. При DoubleClick на одной их этих ячеек данные из нее копируются на весь столбец (бывает необходимость изменить введенные данные и заполнить выбранный столбец данными из строки 2).  
3. Ячейки G:H. Сюда вводятся даты.  
В таком варианте все работает. Но это же вручную даты забивать! Давайте календарь прицепим!  
 
Вот тут и появилась она - проблема. Вернее, чтобы появилась, нужно раскомментровать строку UserForm1.Show в коде листа.  
Теперь календарик исправно помогает вводить даты. Но он же и мешает, если работать по п.1 или п.2.  
Как их подружить?  
 
По ходу дела принимаются критические замечания по коду.  
Calculate - чтобы убрать выделение для копирования;  
.Range("E3").Select или .Cells(iRws, 7).Select (выбор ячейки в конце процедуры) - чтобы убрать выделение диапазона.
 
Виктор, не анализируя что-зачем, тупо сделал то, о чем спрашивалось.  
Все изменения прокомментированы в коде.  
Форму сделал немодальной, побегайте по ячейкам с датами - календарь будет подхватывать дату ячейки, а на пустых - текущую.
 
Файл - в архиве
 
Побегал. Спасибо, можно использовать, только позиционировать календарь в стороне, чтобы столбцы с датами не закрывались.  
 
Проблема ранена, но не добита :)  
Не дружит календарь и копирование столбца со строки 2 - при попытке два раза кликнуть на ячейке календарь тут как тут при первом клике.  
 
Главная задача - три действия, не мешающие друг другу:  
- по желанию копирование в строку данных строки 2;  
- по желанию копирование в столбец данных из ячейки строки 2;  
- возможность вводить даты с календаря в столбцы G:H.  
 
Сейчас два первых пункта реализованы через DoubleClick, вызов календаря через Click. Как еще можно реализовать, чтобы и удобно работать, и проблему добить?
 
Двойной клик на D6 - G2:I2 копируется в G6:I6б курсор перескакивает в G6 (не знаю зачем), календарь не активируется. Что не так?  
При последующих перемещениях календарь ведет седя как обычно - всплывает на заказанных ячейках G4:H15, G2:H2.  
 
Такой же бы конкретный сценарий, при котором что-то происходить не так.
 
"курсор перескакивает в G6 (не знаю зачем)". Ничего страшного, я знаю :)  
Так я снимаю выделение диапазона после копирования. Для похожего действия в код добавлено Calculate - снимается выделение диапазона, который копировался ("бегущие муравьи"). Можно по-другому?  
 
Двойной клик на ячейке G2 (или H2). Под MsgBox висит календарь. Не мешает, но как бы не к месту. После выбора "нет" ячейка выделена и календарь неактивен, закрыть можно только после выхода из ячейки.
 
Решил! Перед вызовом MsgBox:  
UserForm1.Hide  
 
Теперь при Click на G2 (или H2) есть календарь, при DoubleClick только сообщение.
 
Только сейчас заметил (по выпадающему списку): Владимир добрее пакостного мальчика :)
 
Задумался над термином "бегущими муравьями" :-)  
"Мурашки" после копирования снимаются с помощью Application.CutCopyMode = False  
 
Для того, чтобы форма убиралась при двойном клике на G2:H2 можно первой строкой  
в Sub Copy_Columns() записать:  
UserForm1.Hide    
 
Но лучше добавить на форму кнопку и увеличивать размер формы только на ячеках G2:H2. Приложил такой сделанный наспех вариант.
 
Эх, опоздал :-(
 
{quote}{login=С.М.}{date=29.10.2011 05:23}{thema=}{post}Эх, опоздал :-({/post}{/quote}  
Саша, опоздать здесь никогда не поздно :-)  
У Вас для смены даты в G2:H2 приходится делать: клик на ячейке + клик (чтобы стал двойным) + клик на форме выбора + клик на форме календаря    
У меня: клик на ячейке + клик на форме календаря.  
Автор темы любит спорт, поэтому у Вас - лучше! :-)  
 
P.S. Еще не помешало бы добавить Cancel = True, а то курсор все время в ячейку заглядывает
 
Настолько любить спорт - уже фанатизм, а у меня против фанатизма прививка :)
 
To аll: о каком спорте идёт речь ?  
 
To ZVI: на скрине пояснение - почему не добавил Cancel = True - у меня  
на листах нет стандартного BeforeDoubleClick.
 
Неважно, какой спорт, важна любовь к тренировке, в данном случае указательного пальца правой руки :)  
 
UserForm1.Hide - догадался, сделал.  
Application.CutCopyMode - принято.  
 
С кнопкой на календаре обдумывал, но этот вариант не подошел: желательно одинаковое действие для G2:I2, а для I2 календарь не нужен.  
В варианте Саши лишние телодвижения.  
 
Чтобы не запутывать пользователя, вызов календаря и копирование должны, по возможности, вызываться разными командами.  
В столбце D Click на ячейке - выпадающий список, а DoubleClick - копирование. Поэтому и в строке 2 копирование желательно вызывать той же командой. Для календаря остается одинарный Click.  
 
Для строки 2 решено сделать гибрид из всех вариантов:    
двойным нажатием вызов вопроса "точно оно Вам надо?" (I);  
двойным нажатием вызов календаря с этим же вопросом (G:H);  
одинарным нажатием вызов календаря "без кнопок".  
 
Спасибо за решения.  
Тему можно закрывать.
 
{quote}{login=vikttur}{date=29.10.2011 09:36}{thema=}{post}  
Для строки 2 решено сделать гибрид из всех вариантов:    
двойным нажатием вызов вопроса "точно оно Вам надо?" (I);  
двойным нажатием вызов календаря с этим же вопросом (G:H);  
одинарным нажатием вызов календаря "без кнопок".{/post}{/quote}  
Виктор, такая последовательность не реализуема - до события DoubleClick происходит SelectionChange.  
Как то Владимир (ZVI) писал об одном из принципов программирования: divide et impera - разделяй и властвуй  
(http://www.planetaexcel.ru/forum.php/www.mail.ru?thread_id=4517),  
а если DoubleClick (заполнение колонок) перенести на их заголовки: G3:I3 ?
 
Кто-то один не понял кого-то другого.  
В случае, если не поняли меня, оклемаюсь, покажу, что задумал.  
Действия на заголовки переносить не хочется, причина та же - "чтобы не запутывать пользователя".  
 
Попутный вопрос - что лучше для данного случая:  
-регулируемая высота формы с календарем (есть кнопки/спрятаны кнопки);  
-две страницы на форме (одна - календарь, вторая - кнопки)?
 
{quote}{login=vikttur}{date=31.10.2011 02:48}{thema=}{post}  
Действия на заголовки переносить не хочется, причина та же - "чтобы не запутывать пользователя".{/post}{/quote}  
Занудство:  
 
Виктор, ИМХО, моя схеме логична и однозначна:  
- при выделении (SelectionChange) ячеек диапазонов G2:H2 и G4:H15 - выскакивает Календарь;  
- DoubleClick по ячейкам столбца D4:D15 копирует строку G2:I2 в строку таблицы, НО эти ячейки можно назвать ЗАГОЛОВКАМИ строк;  
- DoubleClick по заголовкам столбцов таблицы G3:I3 - заполняет соответствующий столбец.  
Итого: при выделении - Календарь, при двойном клике - заполнение или строк или столбцов.
 
Саша, спасибо.  
Наверное, я больше занудствую :)  
Мне пока что больше по душе вариант работы только с действующими ячейками (своя рубашка ближе к телу? :) ).
 
Рано я тему закрыл :)  
 
Вот что получилось:  
- выделение ячейки G4:H15, G2:H2 - календарь с возможностью занесения даты в ячейку;  
- DoubleClick на G2:I2 - диалоговое окно (вторая страница формы): копировать/не_копировать данные в столбец;  
- DoubleClick на D4:D15 - копируются данные строки 2 в текущую строку. Если выделенная ячейка пустая, копирование не происходит. Чтобы не появлялся календарь, при копировании выделяется не первая ячейка, а весь диапазон.  
 
Вопросы.  
1. При двойном клике на G2:H2 курсор оказывается в ячейке (форма немодальная) и с формой работать нельзя. Снимаю выделением другой ячейки (ActiveCell.Offset(1, 0).Select). Есть другой метод?  
 
2. Почему после отработки процедуры Copy_Rows строка Application.CutCopyMode (в коде листа) срабатывает, а после отработки Copy_Columns нет (добавил строку в процедуру)?  
 
3. Пробовал сделать форму модальной (в коде листа). Ошибка. Что делаю не так?  
 
4. При DoubleClick на G2:H2 кратковременно появляется календарь. И правильно появляется, ведь выделение ячейки произошло. Есть мысли, как его не показывать?  
Может, задержку какую?
 
>1. При двойном клике на G2:H2 курсор оказывается в ячейке (форма немодальная) и с формой работать нельзя.    
 
Почему нельзя? Можно)  
 
>3. Пробовал сделать форму модальной (в коде листа). Ошибка. Что делаю не так?  
Если не ошибаюсь, без аргументов .Show и есть модальная форма. Хотя можно указать явно: .Show vbModal
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
>2. Почему после отработки процедуры Copy_Rows строка Application.CutCopyMode (в коде листа) срабатывает, а после отработки Copy_Columns нет (добавил строку в процедуру)?  
 
У меня работает и там и там  
 
>4. При DoubleClick на G2:H2 кратковременно появляется календарь. И правильно появляется, ведь выделение ячейки произошло. Есть мысли, как его не показывать?  
Может, задержку какую?  
Как вариант можно ввести булеву переменную уровня модуля
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
По 1 вопросу See Attached file (недавно записался на буржуйский форум, теперь по-другому не умеем :))
 
>4. При DoubleClick на G2:H2 кратковременно появляется календарь. И правильно появляется, ведь выделение ячейки произошло. Есть мысли, как его не показывать?  
Может, задержку какую?  
 
Прошу прощения, сразу не понял. Даж не знаю, там сперва событие перехода ячейки срабатывает...
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
А cancel = true установлен и не помогает при дабл клике не входить в режим редактирования ячейки?
 
Заранее прошу прощения, если я чего-то не туда "ляпну" - постигаю азы, а тут такие "зубры" отвечают :)  
nilem, без календаря в нельзя. Или я не так понял?  
 
nerv  
1. Закомментировать в модуле листа строку   ActiveCell.Offset(1, 0).Select.  
Курсор в ячейке, форма неактивна.  
 
2. В Sub Copy_Columns() комментирую строку Application.CutCopyMode = False.  
После отработки этой процедуры выделение ячейки строки 2 остается.  
 
3. Пробовал. Вместо .Show записал .Show vbModal.  
Как была изначально ShowModal=False, так и остается.  
 
4. "Как вариант можно ввести булеву переменную уровня модуля". Не сообразил. Например?
 
Igor67, точно, еще ZVI об этом упоминал. Куда его?  
ActiveCell.Cancel = True не работает.
 
:-) Просто Cancel = True
 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)  
Target.Value = "a"  
Cancel = True  
End Sub  
Как то так это выглядит:)  
Вить, а что это так на макросы потянуло? видно большой проект делается.
 
"nilem, без календаря в нельзя. Или я не так понял?"  
Worksheet_SelectionChange закомментировал, чтобы не мешалась для 1-го вопроса (первоначально предполагал последовательность :)). Раскоментируй, все будет Ок.
 
>1. Закомментировать в модуле листа строку ActiveCell.Offset(1, 0).Select.  
Курсор в ячейке, форма неактивна.  
 
Форма активна : )  
 
 
>2. В Sub Copy_Columns() комментирую строку Application.CutCopyMode = False.  
После отработки этой процедуры выделение ячейки строки 2 остается.  
 
Тогда зачем снимаете?) Если хотите убрать, то не комментируйте ее.  
 
 
>3. Пробовал. Вместо .Show записал .Show vbModal.  
Как была изначально ShowModal=False, так и остается.  
 
Не чего не понимаю) Если Вы указываете модальный вызов формы, то она так и будет вызвана. Как может быть False?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1 2 3 След.
Читают тему
Наверх