Страницы: 1 2 След.
RSS
плавающая кнопка
 
Помогите кто сможет.  
Имеется файл на котором необходимо создать кнопку с макросом, причем такую что бы она не была привязана к ячейке как обычно получаеться при саздание ее с помощью панелей формы или элементы управления. Т.е. так как файл у меня большой состоящий из множество строк и столбцов мне необходимо при перемещение по листу в бок или в низ что бы кнопка допустим находилась всегда в нижним левом углу.  
Возможно ли это?  
Заранее спасибо, всем тем кто откликниться!!!
 
Элемент управления, расположенный прямо на листе, всегда привязан к его ячейкам и вместе с ними и перемещается.  
Если бы нужно было не в нижнем левом, а в верхнем левом, то "Окно"-"Закрепить области"... и в этой области и располагать кнопку.  
Может, конечно, ГУРУ и смогут предложить какое-то решение (через API, например), но это будет далеко не простой код...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Можно при этом убрать заголовок, кнопку сделать размером точно по форме. Выглядеть будет очень похоже на обычную кнопку :-)
 
Юрий, а как убрать заголовок у формы?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
можно вывести форму в нужное место в немодальном режиме..
Живи и дай жить..
 
апаздал :)
Живи и дай жить..
 
{quote}{login=Alex_ST}{date=16.07.2010 02:14}{thema=}{post}Юрий, а как убрать заголовок у формы?{/post}{/quote}  
В модуль формы:  
Private Declare Function FindWindow _  
       Lib "user32.dll" Alias "FindWindowA" ( _  
       ByVal lpClassName As String, _  
       ByVal lpWindowName As String) As Long  
Private Declare Function GetWindowLong _  
       Lib "user32.dll" Alias "GetWindowLongA" ( _  
       ByVal hWnd As Long, _  
       ByVal nIndex As Long) As Long  
Private Declare Function SetWindowLong _  
       Lib "user32.dll" Alias "SetWindowLongA" ( _  
       ByVal hWnd As Long, _  
       ByVal nIndex As Long, _  
       ByVal dwNewLong As Long) As Long  
Private Declare Function DrawMenuBar Lib "user32.dll" ( _  
       ByVal hWnd As Long) As Long  
 
Private Sub UserForm_Initialize()  
   Dim ihWnd As Long, iStyle As Long  
 
   ihWnd = FindWindow(vbNullString, Me.Caption)  
   iStyle = GetWindowLong(ihWnd, -16&)  
   SetWindowLong ihWnd, -16&, iStyle And Not &HC00000  
   DrawMenuBar ihWnd  
End Sub  
= = =  
www.msoffice.nm
 
Круто!  
Но, к сожалению, абсолютно не понятно, как это сделано...  
Теперь бы ещё и форму как-то научиться по экрану "таскать"... Ведь заголовка-то нет, "ухватиться" не за что... Надо чтобы кто-то подсказал как позиционирование такой формы делать.  
 
Да и с подбором размера формы под кнопку пришлось повозиться, т.к. хоть заголовок и не показывается, но место его на форме остаётся, а в VBE на заголовок кнопку не затащишь...  
 
К стати, а как такую форму закрыть? "Крестика"-то нет вместе с заголовком.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=16.07.2010 02:45}{thema=}{post}К стати, а как такую форму закрыть? "Крестика"-то нет вместе с заголовком.{/post}{/quote}  
Событие клика на форме. Я так сделал.
 
Юрий, а можете выложить пример того что вы предлогаете, пожалуйсто?
 
Событие клика на форме - это понятно...  
Но ведь это нужно было заранее предусмотреть...  
А я с дуру сразу для пробы создал такую формочку с пустой кнопочкой в открытом файле...  
Хорошо ещё, что в файл до того сохранить догадался на всякий случай... Пришлось закрывать без сохранения.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, можно было вернуться в VBE и кликнуть по UserForm :-)
 
{quote}{login=marz}{date=16.07.2010 02:51}{thema=}{post}Юрий, а можете выложить пример того что вы предлогаете, пожалуйсто?{/post}{/quote}  
Вот :-)
 
Вот точно такую же хреновину я и создал...  
Кто ж знал, что форму закрыть так просто? У меня был её код открыт, так я туда даже попытался прописать Sub Close_Me: Unload Me: Exit Sub  
Запускал, не закрывается, а только лист с формой выводит.  
 
Да... Давно формы юзаю, а такого простого выхода не знал...  
Стыжусь.Краснею.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Но всё равно: ответ про позиционирование такой формы остался открытым...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
:-) Я сам не знал. Можно малюсенький макрос с Unload нужной формы  на сочетание клавиш. Но автору ведь нужно постоянно видеть :-)  
Позиционирование. Мне попадалось позиционирование по углам. Но в данном случае (разовая операция) для конкретного файла можно подогнать и вручную.
 
да теперь-то я с этой формой играюсь в отдельном файле, а в нем для вызова формы сделал кнопочку на листе и к ней приписал:  
Sub Show_or_Hide_Form1()  
  If UserForm1.Visible = False Then UserForm1.Show vbModeless Else Unload UserForm1  
End Sub  
 
А позиционирование формы мне тоже не так давно где-то попадалось и я даже куда-то его к себе сохранил для примера... Поищем.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс хотел не только разместить, но и таскать.
 
нарыл у себя в запасниках  
как делать всякие фишки с формой
 
Что-то без заголовка мышкой тянуть не получается. Размеры менять - да, тянуть - нет.
 
The_Prist,  
здОрово!  
Только проблемы с позицией кнопки при изменении масштаба листа: ширина столбца заголовков строк при изменении масштаба (или при переходе на лист с другим масштабом)меняется, а форма стоИт как пришпиленная на том же месте, где и была поставлена при UserForm_Initialize...  
Что-то я поискал и не нашёл на листе событий по изменению масштаба чтобы можно было пересчитывать позицию формы...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да и ещё что-то "коряво" прописано при позиционировании:  
при разном масштабе листа форма создаётся со смещением по вертикали на совершенно не предсказуемую величину (то при 50% на уровне пятой ячейки снизу, а то при 25% и 55% залезает на ярлычки листов)  
Вот попытайте файлик:
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
slav,  
примерчик классный. Тоже сохраню у себя на всякий случай в "копилке".  
Но уж больно код навороченный, да ещё и без комментариев...    
Так что вряд ли когда-нибудь буду его использовать. Только если уж совсем прижмёт и без этого будет не обойтись...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
как ни бился, а так и не смог заставить "плавающую кнопку" появляться ПО ВЕРТИКАЛИ точно в левом нижнем углу при ЛЮБЫХ МАСШТАБАХ...  
Всё время куда-то "прыгает" по вертикали: то на ярлыки листов заедет или даже ещё ниже их, а то где-то в нижней четверти видимой области ячеек.  
Наверное, тут надо покопаться в совершенно не понятном для меня выражении:  
UserForm1.Top = (rRange.Top + rRange.Height) * ActiveWindow.Zoom/100 + ActiveWindow.PointsToScreenPixelsY(0) * Application.InchesToPoints(1) * 15/1440 - UserForm1.Height  
Ну, что значит ActiveWindow.Zoom/100 понятно,    
ActiveWindow.PointsToScreenPixelsY(0) * Application.InchesToPoints(1) - тоже более менее понятно,  
а вот что за коэффициент 15/1440 ??? Откуда он взялся? Это что-то эвристическое? Подгонка под конкретные условия?  
Ну, посмотрите, мой примерчик post_138602.zip, пожалуйста, попробуйте при разных масштабах заставить появляться-прятаться кнопочку...    
 
Вообще-то очень интересный вариант может получиться если заставить формочку-кнопочку появляться не внизу листа, а ниже ярлыков листов - на статусбаре (ну, правее надписи "Готово" и ей подобных. И никакие данные на листе такая кнопка не закрывает и не используемое в приложении место занимает.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Здравствуйте!  
Как-то пытался создать себе такую же панель (сдесь же и одолжил), но недоделал.  
Но работает.  :)  
Посмотрите, она жестко привязана к окну, независимо от маштаба.
 
Vovan RU, спасибо, но тут кажется не совсем то...    
 
Много лишнего (для данного случая, конечно, а не для вашей программы) кода, поэтому трудно найти как позиционируется на экране форма. Или это всё-таки такая хитрая панель управления?  
 
Но в рассматриваемом здесь примере проблема возникает именно при попытке привязать к НИЖНЕЙ границе окна...  
Если привязывать к верхней, то проблем быть скорее всего не должно
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=20.07.2010 04:37}{thema=}{post}Vovan RU, спасибо, но тут кажется не совсем то...    
 
Много лишнего (для данного случая, конечно, а не для вашей программы) кода, поэтому трудно найти как позиционируется на экране форма. Или это всё-таки такая хитрая панель управления?  
 
Но в рассматриваемом здесь примере проблема возникает именно при попытке привязать к НИЖНЕЙ границе окна...  
Если привязывать к верхней, то проблем быть скорее всего не должно{/post}{/quote}  
да вот тут позиция задается:  
Private Sub UserForm_Initialize()  
   Dim hWnd As Long, i As Integer  
 
   hWnd = FindWindow(vbNullString, Me.Caption)  
   If hWnd <> 0 Then  
       For i = 0 To 2  
           Call RemoveMenu(GetSystemMenu(hWnd, 0&), 0&, MF_BYPOSITION)  
       Next  
   End If  
   lStyle = GetWindowLong(hWnd, GWL_STYLE)  
   lngStyle = lngStyle Xor WS_SYSMENU  
   SetWindowLong hWnd, GWL_STYLE, lngStyle  
   DrawMenuBar hWnd  
   Left = 400 'позиция по горизонтали  
   Top = 85 'позиция по вертикали  
End Sub
 
С помощью  
 
Left = 400 'позиция по горизонтали  
Top = 85 'позиция по вертикали  
 
можно задать позицию в любой точке экрана...
 
Да, прошу прощения, в стандартный модуль MyPanel попал еще код создания панели инструментов.   :)))
 
Владимир, ну и как вы сможете заданием фиксированных Left и Top поставить форму именно в левый нижний угол экрана? Подбором?  
А если у листа будет другой масштаб, снизу открыта какая-нибудь панель управления или на компе будет другое разрешение экрана? Куда тогда "уедет" ваша форма?  
Именно для исключения этого "бегания" формы тут народ и извращается с автоматическим (адаптивным под экран) её позиционированием...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1 2 След.
Читают тему
Наверх