Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2
RSS
Как сделать, чтобы форма появлялась рядом с активной ячейкой?
 
Не ясно также, какие параметры попадания в цель ожидаются, напомню, что "Для меня целью было предоставить код для позиционирование формы под/над ячейкой с точностью до одного пикселя и предотвращение выхода формы за пределы видимости"  
Чтобы всем было понятно, что тестировать, желательно уточнить, с какой точностью должна позиционироваться форма в Вашем варианте, а то может и так все нормально.
 
sva, благодарю! Правда, не совсем то, чего бы хотелось... У меня это выглядит так (см. файл). Видимо, придется убирать "бордюры" семерки, если это не слишком накладно, только как?  
 
Аноним, спасибо!  
 
ZVI: Владимир,  
>Ваше "вряд ли" легко проверить, набрав в поисковике: Declare PtrSafe Function FindWindow  
Подумал, что странный какой то тип) Таких в VBA нет) Long, есть, а вот LongPtr)  
 
>1. У правого края форма закрывает ячейку  
А можно поподробней? У меня, вроде как нормально (см. файл)  
 
>2. Если мышкой (не с клавиатуры) ткнуть в самую правую видимую ячейку, которая видна не полностью (у меня это T1), то формы вообще не видно.  
Об этом и Аноним упоминал. Вроде как поправил.  
 
>3. Когда окно Excel раскрыто не на весь экран что-то уж больно долго считает.  
Ага. Эт, пожалуй, один из самых серьезных недостатков. Есть мысля, как можно поправить, но сегодня уже не возьмусь, сил нет)  
 
>Полагал, что из моего кода несложно было получить желаемый результат, но сделать как-то иначе - всегда полезнее, поддерживаю.  
Просветите, пожалуйста, как из вашего кода это можно было реализовать? Если не ошибаюсь, у Вас там все от GetCursorPos (мыши) пляшет. А если позиция активной ячейки и указателя мыши разные, что тогда?  
 
>Не ясно также, какие параметры попадания в цель ожидаются  
Пожалуй, то же, что и у Вас: позиционирование формы рядом с ячейкой с точностью до одного пикселя и предотвращение выхода формы за пределы видимости  
 
Еще раз всем большое спасибо!)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
По второму пункту имелось ввиду, наверное, это (см.скин) выделена ячейка Q7 и форма ее закрывает.
 
Про бордюры копай сюда:  
 
BoardWidth = (GetSystemMetrics(5&) + GetSystemMetrics(45&) + GetSystemMetrics(7&)) / 1.333
 
>>1. У правого края форма закрывает ячейку  
>А можно поподробней? У меня, вроде как нормально (см. файл)  
Приложил картинку при выделенной ячейке O1 на моеи компе.  
 
>Просветите, пожалуйста, как из вашего кода это можно было реализовать?  
Оно Вам точно надо, или как вопрос с объединенными ячейками - нарисовал, но Вам же не потребовалось? :-)  
 
>>Не ясно также, какие параметры попадания в цель ожидаются  
>Пожалуй, то же, что и у Вас: позиционирование формы рядом с ячейкой...  
Слово "рядом" немного смущает. Например, в Вашем примере на объединенной ячейке L22:Q26 форма позиционируется не по краю объединения, а по краю L22.  
Вспомните Ваш вопрос по объединенным ячейкам, уже можно и так? :-)
 
Саш, посмотрел код - понравилась идея. Чтобы в оконном режиме быстрее считал, попробуй ограничить границы внешнего цикла размерами окoн Application и ActiveWindow.
 
Не критично, но факт... Win 7 Excel 2007
post_282175.jpg (60.96 КБ)
 
Александр, как учесть объединенные ячейки - посмотрите в post_274618.zip  
Для поиска нужной строки и столбца я бы с помощью RangeFromPoint в координатах активного окна искал бы бинарным методом активную ячейку, как только нашлась - запустил бы код из post_274618.zip  
А в начале нужно еще определять, видима ли ячейка, и принадлежит ли видимой области активного окна, потому что активная ячейка может быть скрыта или при скроллинге упозти куда-нибудь.
 
{quote}{login=ZVI}{date=26.11.2011 03:46}{thema=}{post}...запустил бы код из post_274618.zip{/post}{/quote}...подставив вместо позиции мышки найденные координаты точки внутри активной ячейки (в пикселях).
 
Всем очередное спасибо! Не знаю, чтобы я без Вас делал : )  
 
sva, аха, понял)  
 
 
VovaK: Владимир,  
>Чтобы в оконном режиме быстрее считал, попробуй ограничить границы внешнего цикла размерами окoн Application и ActiveWindow.  
Кажется, удалось решить. Только немного иначе) Файл пока выкладывать не стану, попробую разобраться с проблемой "закрытия" ячейки.  
 
>Про бордюры копай сюда:  
Если удастся доделать, надеюсь с ними поможете : ) Т.е. потестите у себя (разумеется, при условии, что Вам это интересно и есть время)  
 
 
ZVI:  
>Оно Вам точно надо, или как вопрос с объединенными ячейками - нарисовал, но Вам же не потребовалось? :-)  
Ни че се не потребовалось! Да без Вашего файла я бы ни шагу не ступил!)  
 
>Слово "рядом" немного смущает. Например, в Вашем примере на объединенной ячейке L22:Q26 форма позиционируется не по краю объединения, а по краю L22.  
Так и знал, что спросите про "рядом") Объединенные ячейки я рассматриваю как одну. Под рядом подразумевается слева или справа.  
 
>Приложил картинку при выделенной ячейке O1 на моеи компе.  
За картинку спасибо! И ваше Всем опять спасибо)))  
 
>А в начале нужно еще определять, видима ли ячейка, и принадлежит ли видимой области активного окна  
Согласен. Но эт позже. Главное, не забыть : )  
 
 
с уважением, nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Итак, позиционирование формы относительно активной ячейки без привязки к координатам мыши. Версия 1.1 : )  
 
- попытался ускорить алгоритм обработки в целом, в том числе в режиме окна, припугнув к "хитрости" - сканирование по диагонали (тут есть и минусы, расписывать их не буду, те кому надо, поймут);  
- вроде как разобрался с объединенными ячейками (объединенную ячейку во весь экран не рассматривал);  
- надеюсь, решил проблемы с позиционированием, проиллюстрированные Вашими скриншотами (всеми, кроме скриншота Владимира с описанием "Не критично, но факт...")  
 
По прежнему вызов формы: Ctrl+Enter, быстрое закрытие Escape.  
Синтаксис основной процедуры не изменился: SetFormPosition Форма, Ячейка.  
 
 
Жду Ваших отзывов/замечаний/предложений, с уважением nerv : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Саша, вставь еще одну проверку, если активная ячейка за пределами видимости экрана, то позицирование по центру экрана, типа    
 
If Intersect(Activecell, ActiveWindow.VisibleRange) Is Nothing Then  
 
потому как форма не видима, если активная ячейка за границами экрана (за границами Application - работает).
 
Выкинул одно лишнее условие, чуть подправил позиционирование при скрытых строках/столбцах и добавил совместимость с Win64 по примеру ZVI : )  
 
>VovaK: если активная ячейка за пределами видимости экрана, то позицирование по центру экрана, типа If Intersect(Activecell, ActiveWindow.VisibleRange) Is Nothing Then потому как форма не видима  
 
По идее она и не должна появляться, если активная ячейка вне пределов видимости или скрыта) И вроде как получилось вполне приемлемо : )  
 
Повторюсь: вызов формы: Ctrl+Enter, закрытие Escape;  
синтаксис основной процедуры: SetFormPosition Форма, Ячейка.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
а такой вопрос, получается что без api нельзя получить точные координаты для получения ячейки через RangeFromPoint  
x = ActiveCell.Left + ??  
y = ActiveCell.Top + ??  
Set objCell = ActiveWindow.RangeFromPoint(x, y)  
 
нет такого значения, которое нужно прибавить в координаты, чтобы стопудняк определить ячейку? целое точно не подходит, надо чтото такое типа TwipPerPixels или ещё чтото может...  
 
никто не мог бы посоветовать чегонибудь?
 
в общем, методом подбора ось x можно ещё выловить:  
x = ActiveWindow.PointsToScreenPixelsX(ActiveCell.Left) * 1.4  
y = ActiveWindow.PointsToScreenPixelsY(ActiveCell.Top) * 1.14  
Set objCell = ActiveWindow.RangeFromPoint(x, y)  
 
но, ось y немного подглючивает. не всегда верно.  
почему это именно такие цифры пока незнаю.
 
filemoto, ничего не выйдет. Возьмите одну из панелей инструментов и прикрепите на левый край. Запустите Ваш код и посмотрите что получилось.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Здравствуйте,Уважаемые Специалисты!:)  
Вы обсуждаете появление одной формы под ячейкой.  
Код ниже в модуле листа позиционирует только Userform1  
*координаты опустим:)  
============  
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)  
  Cancel = True  
  Dim b As CommandBar  
  dx = 0: dy = 0  
  For Each b In Application.CommandBars  
    If b.Visible Then  
      Select Case b.Position  
       Case msoBarLeft: dx = dx + b.Width  
       Case msoBarMenuBar, msoBarTop: dy = dy + b.Height  
      End Select  
    End If  
  Next  
  With Target.Application.ActiveWindow  
    UserForm1.Left = (Target.Left - .VisibleRange.Left) * .Zoom / 100 + .Application.Left + dx  
    UserForm1.Top = (Target.Top - .VisibleRange.Top) * .Zoom / 100 + .Application.Top + dy  
    UserForm1.Show  
  End With  
End Sub  
============  
Вопрос:  
Как следует изменить код выше в модуле листа,чтобы И Userform1,И Userform2  
появлялась по дабл-клику в нужных столбцах под ячейками?  
============  
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)  
 Dim r&, c%  
  r = Target.Row  
  c = Target.Column  
  Select Case c  
Case 8  
     UserForm1.Show  
Case 9  
     UserForm2.Show  
       End Select  
Cancel = True  
End Sub  
============  
Огромное Вам спасибо за помощь:)
 
самое простое - заменить userform1 на me и поместить код в userform_activate каждой формы  
 
 
можно, конечно, и без повтора кода... но муторнее и быстрее работать не будет.  
 
можно еще чуть поправить алгоритм определения сдвигов - ведь некот меню могут располагаться и по два в одной строке
Живи и дай жить..
 
{quote}{login=ZVI}{date=04.11.2011 09:14}{thema=}{post}Чтобы полностью вывести не спозиционированое начальное положение формы за видимые пределы, для поного исключения мигания при активации, в коде формы в процедуре UserForm_Initialize лучше вместо:  
Me.Top = -100 вот это: Me.Top = -1000  
потому что высота данной формы больше 100.{/post}{/quote}\ Корректировка для корректной работы с 64-битным Excel,  
применительно к коду файла http://www.planetaexcel.ru/docs/forum_upload/post_282172.zip  
 
Модуль: ZVI_FrmPosition  
Процедура: ZVI_SetFormPosition()  
Было: Dim hWnd&  
Должно быть: Dim hWnd  
 
Модуль формы: frmCalendar  
Процедура: DeactivationUnload()  
Было: Dim x As Long  
Должно быть: Dim x
 
{quote}{login=слэн}{date=07.03.2012 11:04}{thema=}{post}самое простое - заменить userform1 на me и поместить код в userform_activate каждой формы{/post}{/quote}  
а как быть с    
With Target.Application.ActiveWindow  
компилятор выдает ошибку 424 "object required"?
 
без WinAPI http://www.excelworld.ru/forum/3-949-32059-16-1354577454
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=ZVI}{date=09.09.2009 03:29}Размеры меню и панелей можно как-то учесть в Excel 2003 и предыдщих версиях, но в Excel 2007 вместо меню ни панелей используется лента (Ribbon), которая может быть и свернута. Поэтому для Excel 2007 такой номер, похоже, не пройдет.{/post}{/quote}  
я до вчерашнего дня тоже так думал, пока не сел за рефакторинг ранее написанного мною кода. Оказывается, можно и без WinAPI достаточно точно позиционировать форму. По крайней мере у меня работает.  
 
Пока это всего лишь тестовый пример, учитывающий далеко не все. Хотелось бы, чтобы кто-нибудь проверил и отписал о результатах. Форма вызывается Ctrl+Enter.  
 
Тестировалось на Windows 7, excel 2010 & 2003  
 
Что не учитывает пример:  
- Не работает при закреплении и разделении областей  
- Выход формы за пределы экрана  
- Небольшая погрешность при зуме  
 
На данный момент без циклов в коде.  
 
p.s.: сори за некропостинг.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
в цитате скрыто:  
 
> Размеры меню и панелей можно как-то учесть в Excel 2003 и предыдщих версиях, но в Excel 2007 вместо меню ни панелей используется лента (Ribbon), которая может быть и свернута. Поэтому для Excel 2007 такой номер, похоже, не пройдет.    
 
этот форум уже достал. Даже пост поправить нельзя.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
up
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: Пред. 1 2
Читают тему (гостей: 1)
Наверх