Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2013, 16:09   #1
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию Как сделать UserForm не по верх окон

Здравствуйте!
Подскажите как сделать чтобы форма автоматически становилась не поверх всех окон при нажатии любого листа эксель в трее или при открытии другого листа. Сейчас пока форма открыта я немогу открыть никакой лист экселя.

И еще такая проблема. Подскажите как добавить кнопку свернуть. На форуме нашёл примеры , но не могу их реализовать.
Вложения
Тип файла: rar пример.rar (28.5 Кб, 38 просмотров)
and150382 вне форума Ответить с цитированием
Старый 03.02.2013, 17:16   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

чтобы форма не мешала доступу к листам Excel, надо установить её свойство ShowModal в FALSE
(меняется в свойствах формы, или при помощи параметра про запуске методом Show)



по сворачиванию формы - без WinAPI не обойтись:
Код:
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Const GWL_STYLE As Long = (-16)
Const WS_SYSMENU As Long = &H80000
Const WS_MINIMIZEBOX As Long = &H20000
Const WS_MAXIMIZEBOX As Long = &H10000
Const SW_SHOWMAXIMIZED As Long = 3
Const SW_SHOWMINIMIZED As Long = 2
Const SW_SHOWNORMAL As Long = 1
 
Private Sub UserForm_Activate()
'добавляет на форму значки минимизировать форму и значок развернуть окно на полный экран
Dim lngFrmHndl As Long
Dim lngStyle As Long
    lngFrmHndl = FindWindow(vbNullString, Me.Caption)
    lngStyle = GetWindowLong(lngFrmHndl, GWL_STYLE) Or WS_SYSMENU Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngFrmHndl, GWL_STYLE, (lngStyle)
    DrawMenuBar lngFrmHndl
End Sub
 
Private Sub CommandButton1_Click()
'минимизируем окно по нажанию кнопки
    Dim hwnd As Long
    hwnd = FindWindow(vbNullString, Me.Caption)
    Call ShowWindow(hwnd, SW_SHOWMINIMIZED)
End Sub
Не забывайте - чтобы сворачивание работало во всех версиях Excel,
необходимо писать код в 2 вариантах: http://excelvba.ru/articles/WinAPI
EducatedFool вне форума Ответить с цитированием
Старый 03.02.2013, 17:48   #3
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию

Я пробовал ставить ShowModal в FALSE, но форма при нажатии на любой лист экселя все равно остается поверх окон и закрывает лист.

Последний раз редактировалось and150382; 04.02.2013 в 00:31.
and150382 вне форума Ответить с цитированием
Старый 03.02.2013, 20:13   #4
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию

Спасибо сворачивание работает.
Но всё же кто-нибудь может знает как сделать лист экселя поверх формы?

Последний раз редактировалось and150382; 04.02.2013 в 00:31.
and150382 вне форума Ответить с цитированием
Старый 04.02.2013, 10:24   #5
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию

Кто-нибудь дайте идею, как это можно сделать
and150382 вне форума Ответить с цитированием
Старый 04.02.2013, 12:21   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

and150382, я так понял, что встроенными VBA-средствами нельзя решить вашу задачу. Нужно использовать API-функции, что вам предложено в сообщении #2.


Примечание

Когда нет VBA-средств для решения вашей задачи, то нужно искать API-функции.
Скрипт вне форума Ответить с цитированием
Старый 04.02.2013, 12:50   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Но всё же кто-нибудь может знает как сделать лист экселя поверх формы?
А зачем нужна форма ПОД листом Excel?
Её же видно не будет...

Просто скрывайте форму (Userform1.Hide) при активации других листов,
а при отображении нужного листа - снова отображайте (Userform1.Show)
Это же всего 1-2 строки кода. Чем такой вариант не устраивает?
EducatedFool вне форума Ответить с цитированием
Старый 04.02.2013, 13:19   #8
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию

В трее много открытый разных книг экселя.Форма работает с одной только книгой. Когда я нажимаю на какую нибудь книгу в трее чтобы занести туда данные, она открывается под формой. Чтобы мне занести данные приходится закрывать форму, т.к. она мешает.
and150382 вне форума Ответить с цитированием
Старый 04.02.2013, 14:04   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
and150382: В трее
вы имеете ввиду Панель задач Windows?
Скрипт вне форума Ответить с цитированием
Старый 04.02.2013, 14:25   #10
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию

Да. Панель задач Windows
and150382 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Показать Form2 по верх Form1 и сделать активной Shouldercannon Общие вопросы Delphi 15 02.07.2011 21:13
Как можно сделать так, чтобы дочерняя форма была поверх всех окон после наступления определённого события? Вадим Мошев Общие вопросы Delphi 4 10.06.2011 13:01
Как реализовать переход на верх страницы по образцу? akokin JavaScript, Ajax 4 10.12.2009 16:07
Как сделать так, чтобы форма была поверх всех окон? Jupiter Общие вопросы Delphi 9 31.07.2009 17:42
Как сделать так чтобы окно формы всегда было поверх остальных окон? HelloZAPOR Общие вопросы Delphi 5 23.07.2007 08:05