Добрый вечер, друзья. Помогите разобраться с проблемой. В эксель есть такая функция - как оконный режим, когда один открытый файл разбивается на два или несколько окон. Я сделал макрос при помощи макрорекордера, который должен создавать дополнительное окно, но он что-то не хочет работать. Окно новое создает, но выравнивать его под нужные размеры и располагать в определенном месте листа отказывается. У меня возникло два вопроса: 1) Почему макрос не выравнивает созданное окно под заданные размеры? 2) Как закрепить это экселевское окно - поверх другого экселевского окна того же файла?
Смотря что Вы под закреплением подразумеваете. Если просто однократно вывести на передний план это довольно просто, а если надо что-то вроде всегда поверх других окон, то это надо через API -ки решать. В частности SetWindowPos, только у меня она не хочет работать.
Код
Option Explicit
#If VBA7 And Win64 Then
Public Declare PtrSafe 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 wFlags As Long) As Long
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long
#Else
Public Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (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 wFlags As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetForegroundWindow Lib "user32" () As Long
#End If
Sub Макрос2()
Dim hndW&, buf1&
Dim str1 As String
ActiveWindow.NewWindow
With Application
.WindowState = xlNormal
.Left = 865
.Top = 180
.Width = 183
.Height = 293
End With
str1 = ActiveWindow.Caption
''hndW = FindWindow(vbNullString, str1) 'FindWindow - получаем хендлер по заголовку
hndW = GetForegroundWindow() 'хендлер активного окна
buf1 = SetWindowPos(hndW, -1, 0, 0, 0, 0, 0)
'-1 поверх всех окон,
End Sub
Udik написал: В частности SetWindowPos, только у меня она не хочет работать.
Кстати нельзя сказать что этот макрос не работает. В Е2013 - при запуске - никакого закрепления окна не происходит (только вызов). А вот когда я его открыл и запустил в Е2007 - то поверх окон закрепилось, не частное, а общее окно программы эксель. В Е2003 та же картина. Так что макрос работает, но частично.