Vba excel на передний план

W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

1

10.02.2016, 10:04. Показов 3892. Ответов 19


Студворк — интернет-сервис помощи студентам

Вывожу из Access данные для отчетов в шаблон Excel, заполняю ячейки сохраняю.
В 2003 офисе окно Exsel всегда было на первом плане — т.е. как и должно быть. После переноса программы на 2007-2010 офис — Excel всегда скрывается под окном access — это не удобно, кажется что отчета нет вообще. Как Excel вывести вперед, есть какая-то команда для этого?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

10.02.2016, 10:04

19

alvk

Эксперт MS Access

7267 / 4469 / 288

Регистрация: 12.08.2011

Сообщений: 13,512

10.02.2016, 10:10

2

Может забыли

Visual Basic
1
xlApp.Visible = True

Если нет, то может у вас старая версия 2010-го Экселя? Что-то такое давно было тоже.



0



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 11:31

 [ТС]

3

Visible это вообще его видимость/невидимость, а мне типа модальность нужна или как ее там..
Пробовал и в 2007 и в 2010 — проблема та же. не похоже что они все старые. И все равно это не вариант, юзеры у себя ничего обновлять не будут как и обратно на 2003 переходить.



0



547 / 274 / 50

Регистрация: 03.04.2015

Сообщений: 926

10.02.2016, 11:39

4

Обычно при создании экземпляра Excel и выполнения вышеуказанной команды он как раз и оказывается верхним окном. Видимо это и правда глюк. А если окно свернуть и развернуть?



0



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 12:04

 [ТС]

5

Цитата
Сообщение от corbis
Посмотреть сообщение

свернуть и развернуть

Программно? Как?



0



corbis

547 / 274 / 50

Регистрация: 03.04.2015

Сообщений: 926

10.02.2016, 12:26

6

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const HWND_TOPMOST = -1
 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
    ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long
 
Public Sub AlwaysOnTop(caption As String)
 
    Dim ret As Long
    Dim hWnd As Long
    
    hWnd = FindWindow(vbNullString, caption)
    ret = SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    
End Sub

Применение:

Visual Basic
1
2
3
Private Sub UserForm_Initialize()
    AlwaysOnTop Me.caption
End Sub

Вместо Me.Caption нужно будет поставить заголовок окна Excel.



1



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 13:28

 [ТС]

7

Цитата
Сообщение от corbis
Посмотреть сообщение

заголовок окна Excel.

а «Microsoft Excel» хватит или надо все переписать с заголовка? Заголовки разные получаются:
«Microsoft Excel — файл.xls» в 2003 офисе
«файл (Режим совместимости) — Microsoft Excel» в 2010м.
Вот если бы их программно определять.
В общем попробовал разные варианты — изменений с этой функцией не заметил((



0



547 / 274 / 50

Регистрация: 03.04.2015

Сообщений: 926

10.02.2016, 13:53

8

Да, именно разные. И нужно правильный подсунуть. Но это же не проблема. Если вы создаете экземпляр, так и заголовок можете узнать без проблем.



0



kavasaka

W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 14:13

 [ТС]

9

PureBasic
1
2
3
 Dim xLObj As Object
      Set xLObj = CreateObject("excel.application")
        xLObj.Application.Workbooks.Open filename:=файл

вот так создаю и открываю. А как имя узнать?
просто когда . нажимаю подсказок не дает как в VBA.



0



texnik-san

шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

10.02.2016, 14:19

10

Visual Basic
1
hWnd = xLObj.Hwnd

Вместо

Visual Basic
1
hWnd = FindWindow(vbNullString, caption)

А то что-то вы мудрите. Узнавать заголовок приложения, чтобы получить идентификатор окна…



1



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 14:26

 [ТС]

11

Цитата
Сообщение от texnik-san
Посмотреть сообщение

1
hWnd = xLObj.Hwnd

только xLObj в той процедуре еще нет. Его что Public сделать?
Или пусть тоже Dim xLObj As Object будет. А это будет один и тот же «excel.application» или разные?
чет я запутолся совсем..



0



547 / 274 / 50

Регистрация: 03.04.2015

Сообщений: 926

10.02.2016, 14:29

12

Это общая функция. Не для этой конкретной задачи написанная. И так правильнее будет, да.



0



texnik-san

шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

10.02.2016, 14:39

13

Лучший ответ Сообщение было отмечено alvk как решение

Решение

Цитата
Сообщение от kavasaka
Посмотреть сообщение

только xLObj в той процедуре еще нет. Его что Public сделать?

Да хоть входным параметром передайте.

Добавлено через 6 минут
А еще лучше — в ваш модуль добавляете это

Visual Basic
1
2
3
4
5
6
7
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const HWND_TOPMOST = -1
 
Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
    ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long

А прямо в свой код, в том месте, где вам уже нужно, чтобы окно стало «всплывающим» — это:

Visual Basic
1
SetWindowPos xLObj.Hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE



1



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 14:57

 [ТС]

14

Не работает — ексел все равно сзади.

xLObj.Hwnd — это какой-то 7 значный код получается, а не заголовок окна.
SetWindowPos всегда возвращает 1 что это значит?

это еще для первого варианта



0



шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

10.02.2016, 15:06

15

Цитата
Сообщение от kavasaka
Посмотреть сообщение

xLObj.Hwnd — это какой-то 7 значный код получается, а не заголовок окна.

Заголовок окна и не нужен, мы проскочили этот шаг и сразу получаем то, для чего заголовок был нужен (идентификатор окна).

Но этот вариант все равно отставляем и пробуем сразу второй.



0



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 15:13

 [ТС]

16

Сори. у вас там что-то пропущено в коде.
Public Sub должно быть.

Цитата
Сообщение от texnik-san
Посмотреть сообщение

А прямо в свой код, в том месте, где вам уже нужно

на эту строку ругается и на функцию SetWindowPos и на все параметры.



0



Модератор

Эксперт MS Access

11341 / 4660 / 748

Регистрация: 07.08.2010

Сообщений: 13,496

Записей в блоге: 4

10.02.2016, 15:18

17

попробуйте —формирование ворд документа из екселя и открытие впереди екселя
распакуйте с сохранением каталогов и откройте ексель zmm.xlsm



0



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 15:30

 [ТС]

18

Цитата
Сообщение от shanemac51
Посмотреть сообщение

попробуйте —формирование ворд документа из екселя и открытие впереди екселя

зачем мне Ворд из ексцеля, если у меня прога В Акцесе, которая забивает отчеты в ексел???? я даже распаковал и открыл. Там даже макросов нет. Вы прикалываетесь?)))

Цитата
Сообщение от texnik-san
Посмотреть сообщение

Но этот вариант все равно отставляем и пробуем сразу второй.

а в чем разница в этих вариантах? SetWindowPos думаю нельзя ставить в любом месте только в модуле (а это есть 1 вариант!) и Public Sub туда же.. в итоге полностью 1 вариант (который все равно не работает!)

они все прикалываются??



0



шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

10.02.2016, 15:33

19

Цитата
Сообщение от kavasaka
Посмотреть сообщение

на эту строку ругается и на функцию SetWindowPos и на все параметры.

Потому что то, что я написала «в ваш модуль добавляете это» должно быть добавлено в ТОТ ЖЕ модуль, где и ваша функция, причем в самом верху модуля, сразу после строк Оption.

Цитата
Сообщение от kavasaka
Посмотреть сообщение

Сори. у вас там что-то пропущено в коде.
Public Sub должно быть.

Ничего не пропущего и ничего не должно быть.

Добавлено через 1 минуту

Цитата
Сообщение от kavasaka
Посмотреть сообщение

думаю

Это лишнее ))))



1



W

115 / 115 / 33

Регистрация: 16.04.2013

Сообщений: 748

10.02.2016, 15:46

 [ТС]

20

Просто когда все барахло в модуле, а в формах только вызов функции — как то привычнее

Но главное что заработало в 10ке СПАСИБО!
зы. потом на трезвую все же попытаюсь в модуль все убрать))



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.02.2016, 15:46

20

 

День добрый!  

  Есть книга в которой выполняется макрос. По результатам макроса должна открываться другая книга. Книга открывается, но только на заднем плане. Подскажите плиз команду, которая открывает книгу по верх текущей.

 

что значит открывается?  

  командой open?    
может примерчик?

 

{quote}{login=слэн}{date=18.03.2008 01:08}{thema=}{post}что значит открывается?  

  командой open?    
может примерчик?{/post}{/quote}  
Workbooks.Open Filename:=»Имя файла»  
Workbooks(«Имя файла»).Activate

 

последнее заменить на  
Windows(«Имя файла»).Activate

 

JK

Гость

#5

19.03.2008 09:16:25

{quote}{login=AMC}{date=18.03.2008 10:20}{thema=}{post}последнее заменить на  
Windows(«Имя файла»).Activate{/post}{/quote}  

  AMC, спасибо!

I am trying to bring and Excel window to the front of all applications running regardless.

Current code,

Private Declare Function SetForegroundWindow _
                     Lib "user32" _
                   (ByVal hWnd As Long) As Long

Public Sub Bring_to_front()   
    SetForegroundWindow wb.Application.hWnd    
End Sub
Sub Test()    
     Set wb = Workbooks("MyWorkBook.xlxs")
      call Bring_to_front
End Sub

At the moment nothing happens.

asked Dec 27, 2015 at 15:03

0

You don’t need an API for this, you can use something like:

Sub BringXLToFront()
    AppActivate Application.Caption
End Sub

The AppActivate() method in VBA takes a string argument, and it will activate (i.e. bring it to the front) any window that contains that exact string.


More specific to your question though — you need to understand how APIs work in VBA a bit more — if you’re using a x64 system then you need to use conditional compilation and declare the API function as pointer-safe by using the PtrSafe keyword and the LongPtr data type:

#If Win64 Then
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" _
               (ByVal hWnd As LongPtr) As LongPtr
#Else
    Private Declare Function SetForegroundWindow Lib "user32" _
               (ByVal hWnd As Long) As Long
#End If

answered Dec 27, 2015 at 15:15

SierraOscar's user avatar

SierraOscarSierraOscar

17.5k6 gold badges41 silver badges68 bronze badges

Found the answer to what I as trying to do after a bit more research.

This will bring the worksheet you specify to the front.

Public Declare Function SetForegroundWindow _
Lib "user32" (ByVal hwnd As Long) As Long

Public Sub Bring_to_front()
    Dim setFocus As Long

    ThisWorkbook.Worksheets("Sheet1").Activate
    setfocus = SetForegroundWindow(Application.hwnd)
End Sub

answered Dec 28, 2015 at 11:37

RRS feed

  • Remove From My Forums
  • Вопрос

  • Доброе утро друзья.

    В Excel пытаюсь переместить Textbox на передний план перед ListBox.Все
    кнопки перетыкал, но переместить Textbox на передний план не могу. Подскажите куда ещё надо нажать?

Ответы

  • Данный метод не подходит. Вопрос решился помещением TexTbox в Frame. После этого применяю Zorder и всё работает прекрасно.

Все ответы

  • Какая разница в том, как они расположены в дизайнере форм? Или они не перемещаются из кода?

  • вот так можно управлять ими в коде

    Dim mFlag As Boolean

    Private Sub UserForm_Click() mFlag = Not mFlag If mFlag = True Then Me.TextBox1.ZOrder msoBringToFront Me.ListBox1.ZOrder msoSendToBack Else Me.TextBox1.ZOrder msoSendToBack Me.ListBox1.ZOrder msoBringToFront End If Me.TextBox1.Visible = mFlag Me.ListBox1.Visible = Not mFlag End Sub Private Sub UserForm_Initialize() mFlag = True Me.TextBox1.Visible = mFlag Me.ListBox1.Visible = Not mFlag Me.TextBox1.ZOrder msoBringToFront Me.ListBox1.ZOrder msoSendToBack End Sub

    • Изменено
      SergejS
      7 октября 2017 г. 9:40

  • Данный метод не подходит. Вопрос решился помещением TexTbox в Frame. После этого применяю Zorder и всё работает прекрасно.

  • Вы только TextBox во Frame
    или 
    ListBox тоже?

  • Только Textbox поместил в Frame

  • Не совсем понимаю смысл этой операции, формы в VBA это не WPF, но хозяин — барин!

  • Вот тут я внизу отписался что именно хотел сделать

    Ссылка

  • А что помешало использовать ComboBox? У него есть все мозможности, как для ввода текста, так и отображения в списке, при этом он такой же компактыный как и TextBox?

  • А какая разница чего перемещать на передний план? TextBox или Combobox? TextBox я считаю более правильно подходит.

  • а зачем перемещать? Combobox реализует в себе как TextBox, так ListBox и перемещать ничего не надо! И в том
    коде, который я выклыдвал, все и так нормально перемещается при использовании 
    TextBox и ListBox без использования
    Frame.

  • Как он реализует Listbox? Он реализует выпадающий список, или я что-то не знаю?

  • там есть стиль, когда она расскрытый, как ListBox

  • А Вы подскажите как этот стиль сделать?

  • возможно что ComboBox из VBA поддерживает не все настройки нормального Combobox,
    что то я не могу найти, как сделать его расскрытм

  • а зачем он должен быть раскрытым, там есть возможность, начинаешь воодить текст, он показывает элементы которые подходят для введенной пользователем информации

  • А это уже другая функция.

  • я мало работаю с VBA, а в нем свойства по другому называются, чем у обычного эл. управления

  • Да на VBA приходится поломать голову. Ту же прокрутку в Listbox на колёсико до сих пор адекватно никто придумать не может.

  • так в VBA элементы управления старые и они не изменялись с выходом VisualBasic 6 или даже 5 версии

  • что мешает использовать обычный VB.Net c Excel? я имено так и работаю.

  • Вы имеете ввиду написать на VB дополнение надстройку к Excel или что-то другое?

  • Я не знаю для каких целей вы используете Excel, у меня есть Excel файлы где обрабатываются большие объемы данных, но программа написана на VB.Net, стартуется exe файл, читаются данные из БД или из других файлов, которые вставляются
    в Excel, выполняются какие-то вычисления и затем Excel, используется для представления диограм или печати предопределенных форм.

  • У меня в Excel написана программа для расчётов и предоставления уже отчётов и тех же диаграмм. Я пробовал перенести её на VB, но успехом не увенчалось, так и лежит мёртвым грузом. А в Microsoft сказали
    на что замахнулся я сидят сотни программистов разрабатывают. Вот поэтому и приходится извращаться и допиливать и подключать библиотеки в Excel.

  • у меня есть проблемы с запуском макросов в Windows 10, не нашел возможности, как можно вообще запустить отладку в Windows 10 и отлаживать код, потому что макрос или деактивируется, или запускается сразу
    при минимальных настройках безопасности, что не может устраивать клиента. Поэтому и пишу весь код в VB.Net,
    чтобы не зависить от макросов (VBA) 
    Excel.

Я пытаюсь вывести окно Excel на передний план всех работающих приложений.

Текущий код,

Private Declare Function SetForegroundWindow _
                     Lib "user32" _
                   (ByVal hWnd As Long) As Long

Public Sub Bring_to_front()   
    SetForegroundWindow wb.Application.hWnd    
End Sub
Sub Test()    
     Set wb = Workbooks("MyWorkBook.xlxs")
      call Bring_to_front
End Sub

На данный момент ничего не происходит.

2 ответа

Лучший ответ

Нашел ответ на то, что я пытался сделать после небольшого исследования.

Это переместит указанный вами рабочий лист на передний план.

Public Declare Function SetForegroundWindow _
Lib "user32" (ByVal hwnd As Long) As Long

Public Sub Bring_to_front()
    Dim setFocus As Long

    ThisWorkbook.Worksheets("Sheet1").Activate
    setfocus = SetForegroundWindow(Application.hwnd)
End Sub


5

user1452705user1452705
28 Дек 2015 в 11:37

Для этого вам не нужен API, вы можете использовать что-то вроде:

Sub BringXLToFront()
    AppActivate Application.Caption
End Sub

Метод AppActivate() в VBA принимает строковый аргумент, и он активирует (т.е. выводит его на передний план) любое окно, содержащее это точное < / strong> строка.


Однако более конкретно для вашего вопроса — вам нужно немного больше понять, как API-интерфейсы работают в VBA — если вы используете систему x64, вам нужно использовать условную компиляцию и объявить функцию API как безопасную с указателем, используя {{X0 }} и тип данных LongPtr:

#If Win64 Then
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" _
               (ByVal hWnd As LongPtr) As LongPtr
#Else
    Private Declare Function SetForegroundWindow Lib "user32" _
               (ByVal hWnd As Long) As Long
#End If


14

SierraOscar
29 Дек 2015 в 14:34

Like this post? Please share to your friends:
  • Vba excel на маке
  • Vba excel моя директория
  • Vba excel модуль формы
  • Vba excel модуль листа
  • Vba excel модуль класса для чего