Страницы: 1 2 След.
RSS
Как сделать, чтобы форма появлялась рядом с активной ячейкой?
 
При выделении ячейки у меня показывается Msgbox  с вопросом передавать содержимое ячейки на другой лист или нет.  
If Not Intersect(Target, Range(Cells(5, 2), Cells(Конец1, 2))) Is Nothing Then  
   a = MsgBox("Передать данные на лист Выбор?", vbOKCancel, "Передача данных")  
   If a = 1 Then  
   ...  
Но  MsgBox появляется всегда в центре экрана, а ячейки находятся в столбце В. Значений много, теряю время на перемещение.  
Как сделать, чтобы форма появлялась рядом с активной ячейкой, но не закрывала ее?
 
Это через API надо привязывать к координатам ячейки. В свое время ZVI выкладывал подобный пример для календаря.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
если с формой(не с msgbox), то можно и без api
Живи и дай жить..
 
{quote}{login=The_Prist}{date=09.09.2009 11:55}{thema=}{post}Это через API надо привязывать к координатам ячейки. В свое время ZVI выкладывал подобный пример для календаря.{/post}{/quote}  
Да, была такая тема, но летом канула в лету: http://www.planetaexcel.ru/forum.php?thread_id=9898  
Прилагаю пример, который там приводился, с календарём по двойному клику на ячейках с датами с привязкой формы к координатам ячейки,
 
К предыдущему сообщению - см. приложение
 
{quote}{login=слэн}{date=09.09.2009 01:00}{thema=}{post}если с формой(не с msgbox), то можно и без api{/post}{/quote}  
А есть разница между Формой и МсджиБоксом? Насколько я понимаю, при старте надо поставить вручную, а координаты поставить с полученных с помощью api (или без нее)?
 
для формы существует специальный объект, куда может вовращаться управление при наступлении определенных событий.  
форма  имеет такие изменяемые свойства, как left, top, Width, Height.  
 
форму вы можете конструировать гораздо гибче..  
 
 
единственное - ее координаты отсчитываются относительно родительского окна(т.е application), а аналогичные свойства ячеек - относительно клиентского(т.е с учетом показываемых менюшек и т.п)
Живи и дай жить..
 
{quote}{login=слэн}{date=09.09.2009 03:16}{thema=}{post}для формы существует специальный объект, куда может вовращаться управление при наступлении определенных событий.  
форма  имеет такие изменяемые свойства, как left, top, Width, Height.  
 
форму вы можете конструировать гораздо гибче..  
 
 
единственное - ее координаты отсчитываются относительно родительского окна(т.е application), а аналогичные свойства ячеек - относительно клиентского(т.е с учетом показываемых менюшек и т.п){/post}{/quote}  
Размеры меню и панелей можно как-то учесть в Excel 2003 и предыдщих версиях, но в Excel 2007 вместо меню ни панелей используется лента (Ribbon), которая может быть и свернута. Поэтому для Excel 2007 такой номер, похоже, не пройдет.    
 
А вот с API все сработает нормально. Кстати в приложенном примере с API также учтено, чтобы форма не убегала за края экрана.
 
Всё!!!  
Спасибо!!! Все получилось!!! Спасибо за разъяснения!  
Я убрал МэсджиБокс и поставил Форму, настроил кнопки и всё работает замечательно.  
Единственное не разобрался с ходу, как поставить, чтобы Форма была справа от ячейки, левым верхним углом совпадала с левым верхним углом соседней ячейки. Но думаю, будет время разберусь!
 
{quote}{login=ZVI}{date=09.09.2009 02:09}{thema=}{post}К предыдущему сообщению - см. приложение{/post}{/quote}К сожалению, при объединенных ячейках "халтурит", т.е. позиционирует форму там, где непосредственно происходил клик.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Саня, ходи сюда http://www.excelworld.ru/forum/3-949-1
 
Ух ты! Спасибо, Владимир, сходим : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=30.10.2011 02:24}{thema=Re: }{post}К сожалению, при объединенных ячейках "халтурит", т.е. позиционирует форму там, где непосредственно происходил клик.{/post}{/quote}  
Александр, только не говорите, что Вам нужна дата в объединенных ячейках :-)  
Чтобы игнорировать объединенные ячейки:  
If ActiveCell.MergeArea.Cells.Count > 1 Then Exit Sub  
 
Но код позиционирования формы, действительно можно и нужно улучшить, чтобы использовать с любыми другими формами, в том числе и на объединенных ячейках.  
 
Приложил обновленную версию с измененным алгоритмом позиционирования.  
Форма отображается возле активной ячейки и при этом не выходит за видимую часть экрана. Основная процедура работает теперь корректно и с объединенными ячейками,  
а API-код совместим с 64-битными версиями Excel и операционной системы. То есть, код работает во всех версиях Excel, начиная, по крайней мере, с Excel 2002.  
 
Изменен (упрощен) код вызова формы в модуле ЭтаКнига.  
 
Код и свойства формы также изменены.  
Теперь в форме после навигации с клавиатуры можно по Enter ввести дату в ячейку и закрыть форму, а по ESC - просто закрыть форму. Форма закрывается также автоматически, когда теряет фокус при активации любой ячейки, в том числе и активной.  
То есть: двойной клик на ячейке с датой или на пустой ячейке - вызов календаря.  
Клик на любой ячейке, в том числе и на активной - закрытие формы.  
При выборе даты мышкой дата записывается в активную ячейку, а форма закрывается.
 
Чтобы полностью вывести не спозиционированое начальное положение формы за видимые пределы, для поного исключения мигания при активации, в коде формы в процедуре UserForm_Initialize лучше  
вместо: Me.Top = -100  
вот это: Me.Top = -1000  
потому что высота данной формы больше 100.
 
>Александр, только не говорите, что Вам нужна дата в объединенных ячейках :-)  
И не буду) Мне интересно само позиционирование)  
 
То, чего мне "удалось" добиться без API (см. файл)  
описание здесь: http://www.excelworld.ru/forum/3-949-1  
 
Уж не знаю, на сколько это хорошо или плохо, но тем не менее)  
 
p.s.: воспользовался Вашим файлом, предварительно удалив все Ваши опознавательные знаки, дабы не подумали, что это Вы так коряво состряпали : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Саша, просьба - уберите календарь с формы. Я покажу как это выглядит на 2007...
 
Замечания по позицированию в 2007:  
 
1. Не учел выключение заголовков  
2. В Win 7 нужно удалять ширину бордюров (границы формы наезжают на ячейку) - без WinAPI никак    
BoardWidth = (GetSystemMetrics(5&) + GetSystemMetrics(45&) + GetSystemMetrics(7&)) / 1.333  
3.Ленту и строку формул "видит" только при Zoom 100%, при другом Zoom сильно смещает.  
4. Не понял почему так реагирует на высоту ячеек, ширина отрабатывает - высота нет.  
5. Не учел полноэкранный режим.  
6. И последнее, при позицировании на границе экрана форма "ныряет" за границы видимого - это не есть хорошо, нужно позицировать по правой (или по верхней) границе ячейки...
 
VovaK, спасибо, что помогаете!  
 
>1. Не учел выключение заголовков  
А что это такое? : )  
 
>2. В Win 7 нужно удалять ширину бордюров (границы формы наезжают на ячейку) - без WinAPI никак BoardWidth = (GetSystemMetrics(5&) + GetSystemMetrics(45&) + GetSystemMetrics(7&)) / 1.333  
Да, тут без API не обойтись, но если можно, чуть позже. Сейчас хотел бы попытаться решить иные задачи. Эт пусть на сладкое остается)  
 
>3.Ленту и строку формул "видит" только при Zoom 100%, при другом Zoom сильно смещает.  
Попытался реабилитироваться в файле  
 
>Не учел полноэкранный режим  
Можно поподробней?  
 
>6. И последнее, при позицировании на границе экрана форма "ныряет" за границы видимого - это не есть хорошо, нужно позицировать по правой (или по верхней) границе ячейки...  
Это обстоятельство, на данный момент мне кажется преодолимым. Пока даж не берусь за это. Причина - не хочу загромождать код. Тож на сладкое : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Заголовки строк и таблиц, там где наименование строк и столбцов - их можно выключить.  
Полноэкранный режим - ни меню ни ленты, только таблица. Включается через вкладку "Вид".
 
Александр, спасибо Вам, что подняли тему 04.11.2011 09:32, обратив внимание на проблемы в моем коде при наличии объединенных ячеек.  
Проблемы устранены. Но так как продолжается обсуждение (других?) тем, то мне уже не понятно, действительно ли доработка Вам была нужна, или интерес был чисто спортивный? :-)  
 
Другими словами, какие и чьи проблемы-то теперь пытаемся решить?  
 
Если речь о варианте без API, то это вроде был предмет обсуждения Вами в другой теме. В ней я не участвовал по 2-м причинам:  
1. Не понятна цель и преимущество сделать именно без API - количество строк кода для меня никогда не имели значения, потому что код пишется один раз, а используется многократно – один раз можно и постараться. Трудно обсуждать без понимания цели и смысла. Для меня целью было предоставить код для позиционирование формы под/над ячейкой с точностью до одного пикселя и предотвращение выхода формы за пределы видимости.  
2. Если очевидна хоть одна техническая проблема, которая без API неустранима, то он станет вариантом с API, тогда чем не устравиет предложенный?  
 
Простые решения мне нравятся, особенно если они, как Вы выразились, "не халтурят". Ваш вариант (post_274918.xls) хорош и очевидно сгодится для многих случаев, но пока сильно шалит при закреплении окна. Также  немного «гуляет» по вертикали при масштабировании или изменении высоты ячейки форма, на объединенных ячейках форма не у нижнего края, с большими номерами строк «гуляет» по горизонтали, не учитывает отключения заголовков строк и таблиц, форма может выйти и за пределы видимости.  
Большинство этих "сладеньких" недочетов несложно устранить без API, но если есть хоть один, который требует API, то решение с API как бы уже есть.  
 
Впрочем, походить по хоженным чужими ногами граблям я тоже люблю - хорошо обучает и незабываемо :-)
 
VovaK, благодарю, теперь буду знать : )  
 
 
ZVI,  
>Александр, спасибо Вам, что подняли тему 04.11.2011 09:32, обратив внимание на проблемы в моем коде при наличии объединенных ячеек.  
Да не за что)  
 
>2. Если очевидна хоть одна техническая проблема, которая без API неустранима, то он станет вариантом с API, тогда чем не устраивает предложенный?  
Не то, чтобы я был противником API, но, признаться, работал с ним давно, в основном с функциями терминала и то в Ассемблере.  
Ваш вариант чудесный, не подумайте ни чего такого) Но он позиционирует форму исходя из положения курсора мыши (насколько я понял) [ (для 86x) Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long ], меня это не совсем устраивает по причине того, что вызов той формы, для кот. я бьюсь над позиционированием, предполагается по средствам горячих клавиш. А позиция курсора мыши и активной ячейки не всегда совпадают.
 
В свою очередь, хочу еще раз напомнить название темы:  
"Как сделать, чтобы форма появлялась рядом с активной ячейкой?"  
Т.е., где обсуждать, если не здесь?)  
 
>Ваш вариант (post_274918.xls) хорош и очевидно сгодится для многих случаев, но пока сильно шалит при закреплении окна.  
Нет при закреплении окна он не шалит, он не работает (на данный момент) : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Саша, кроме закрепления областей есть еще одна засада - разбиение окна (Вкладка "Вид" команда - Разделить)
 
Спасибо, Владимир, знаю) И здесь тоже отмечал, кода скрины выкладывал.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
т.е. здесь это http://www.excelworld.ru/forum/3-949-1 ^_^
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Все пытаюсь добиться позиционирования формы относительно активной ячейки, в связи с чем хотел задать ряд вопрос:  
 
1. Как определить позицию курсора клавиатуры (каретки)?  
Пытаюсь использовать ф-цию  
Private Declare Function GetCaretPos Lib "user32" (ByRef lpPoint As CPos) As Boolean  
со структурой  
Private Type CPos: x As Long: y As Long: End Type  
 
Написано, что "копирует позицию знака вставки в клиентских координатах. Позиция знака вставки всегда дается в клиентских координатах окна, в котором она находится". Эт, конечно, все замечательно, но куда плясать дальше?)  
 
2. На клавиатуре есть чудесные клавиши: Меню/Shift+F10. Если их нажать в экселе, то всплывающее меню будет автоматически размещено по отношению к активной ячейке. Можно ли этим как-нибудь воспользоваться? Отследить, какие ф-ции API вызываются и как оно работает? : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
НУ НАКАНЕЦ-ТА БЛИН!)))  
 
Для начала хотел бы поблагодарить Владимира (ZVI) за его замечательный пример с позиционированием, из которого я очень много подчерпнул) И уж коли я о Вас заговорил, если не ошибаюсь у Вас там в первой строке (и еще чуть ниже) опечатка: LongPtr (Win64). Хотя вряд ли, но тем не менее : )  
 
Итак, позиционирование формы относительно активной ячейки. API Win32.  
Синтаксис основной процедуры таков: SetFormPosition Форма, Ячейка.  
 
В данном файла форма вызывается по ср-вом горячих клавиш - Ctrl+Enter.  
 
p.s.: в 2007 и выше не тестировал. В Windows Vista и Windows Seven тоже. Если кому не лень,сделайте скриншот посмотреть, как она себя ведет.  
 
с уважением, nerv : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=25.11.2011 08:08}{thema=Позиционирование формы относительно ячейки. Версия 1.0}{post}...если не ошибаюсь у Вас там в первой строке (и еще чуть ниже) опечатка: LongPtr (Win64). Хотя вряд ли, но тем не менее : ){/post}{/quote}  
Добрый вечер Александр!  
Ваше "вряд ли" легко проверить, набрав в поисковике: Declare PtrSafe Function FindWindow  
Нет там ошибки, откуда сомнения? :-)
 
В Win 7 и Excel 2007 нормально позиционируется.
 
Если часть ячейки находится в видимой части экрана, а часть - нет, по Ctrl+Enter ничего не происходит. :(
 
{quote}{login=nerv}{date=25.11.2011 08:08}{thema=Позиционирование формы относительно ячейки. Версия 1.0}{post}НУ НАКАНЕЦ-ТА БЛИН!)))В данном файла форма вызывается по ср-вом горячих клавиш - Ctrl+Enter.{/post}{/quote}  
Не смотрел код, но в excel 2003 поработал немного тестировщиком :-)  
1. У правого края форма закрывает ячейку  
2. Если мышкой (не с клавиатуры) ткнуть в самую правую видимую ячейку, которая видна не полностью (у меня это T1), то формы вообще не видно.  
3. Когда окно Excel раскрыто не на весь экран что-то уж больно долго считает.  
Полагал, что из моего кода несложно было получить желаемый результат, но сделать как-то иначе - всегда полезнее, поддерживаю.
Страницы: 1 2 След.
Наверх