' Описываем необходимые процедуры API:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName as String, _
ByVal lpWindowName As Long) As Long
Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long _
ByVal wParam as Long _
ByVal lParam As Long) As Long
Sub GetExcel()
Dim MyXL As Object ' Переменная для сохранения
' ссылки на Microsoft Excel.
Dim ExcelWasNotRunning As Boolean ' Флаг для выхода из приложения.
' Проверка, выполняется ли Microsoft Excel.
On Error Resume Next ' Отложенный перехват ошибок.
' Функция GetObject, вызванная без указания первого аргумента,
' возвращает ссылку на экземпляр приложения. Если это приложение
' не запущено, возвращается ошибка. Обратите внимание на запятую,
' стоящую на месте отсутствующего первого аргумента.
Set MyXL = Getobject(, "Excel.Application")
If Err.Number <> 0 Then ExcelWasNotRunning = True
Err.Clear ' Очищаем объект Err на случай ошибки.
' Проверка Excel. Если Excel выполняется,
' он вводится в таблицу выполняемых объектов (Running Object table).
DetectExcel
Задаем в объектной переменной ссылку на открываемый файл.
Set MyXL = Getobject("c:\vb4\MYTEST.XLS")
' Делаем видимым Excel с помощью свойства Application. Затем делаем
' видимым окно, содержащее файл, с помощью семейства Windows объекта,
' определяемого ссылкой MyXL.
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
' Здесь помещаем инструкции
' по обработке вызванного файла.
' ...
' Если приложение Microsoft Excel не выполнялось при запуске данной
' программы, закрываем его с помощью метода Quit свойства Application.
' Отметим, что при попытке выхода из Microsoft Excel строка заголовка
' мигает и выводится приглашение сохранить все загруженные файлы.
If ExcelWasNotRunning = True Then
MyXL.Application.Quit
End IF
Set MyXL = Nothing ' Освобождаем ссылку на
' приложение и электронную таблицу.
End Sub
Sub DetectExcel()
' Процедура находит выполняемый Excel и регистрирует его.
Const WM_USER = 1024
Dim hWnd As Long
' Если Excel выполняется, этот вызов API возвращает его дескриптор.
hWnd = FindWindow("XLMAIN", 0)
If hWnd = 0 Then ' 0 означает, что Excel не выполняется.
Exit Sub
Else
' Excel выполняется. Используйте функцию API SendMessage, чтобы ввести его в таблицу выполняемых объектов (Running Object Table).
SendMessage hWnd, WM_USER + 18, 0, 0
End If
End Sub
VBA(Word): нужен дескриптор окна (hWnd)!
В Access97 это просто: Application.hWndAccessApp.
PS. Если есть различия по версиям Word,
то хотя бы для Word2002 (по возможности и для Word97/2000)
Цитата:
Originally posted by Бер
Подскажите, пожалуйста, как из VBA в Word-е получить дескриптор окна для последующей передачи во внешние процедуры.
В Access97 это просто: Application.hWndAccessApp.
PS. Если есть различия по версиям Word,
то хотя бы для Word2002 (по возможности и для Word97/2000)
Подскажите, пожалуйста, как из VBA в Word-е получить дескриптор окна для последующей передачи во внешние процедуры.
В Access97 это просто: Application.hWndAccessApp.
PS. Если есть различия по версиям Word,
то хотя бы для Word2002 (по возможности и для Word97/2000)
Вот смотри какую штуку я нашел в хелпе к 97-му Ворду. Может, она тебе поможет... (просто самому мне это никогда не нужно было):
Код:
Так вроде всегда в VBA(VBE) это свойство болтается: Application.Hwnd
Цитата:
Originally posted by SergeySV
Так вроде всегда в VBA(VBE) это свойство болтается: Application.Hwnd
Так вроде всегда в VBA(VBE) это свойство болтается: Application.Hwnd
Хочется, чтобы это было действительно так, хотя я его там искал и раньше - ничего.
Если ты его там видел, попробуй, пожалуйста, запустить Word и найти его там.
О результатах обязательно сообщи.
Цитата:
Originally posted by Cutty Sark
Вот смотри какую штуку я нашел в хелпе к 97-му Ворду. Может, она тебе поможет... (просто самому мне это никогда не нужно было): ...
Вот смотри какую штуку я нашел в хелпе к 97-му Ворду. Может, она тебе поможет... (просто самому мне это никогда не нужно было): ...
Я этот help использовал раньше, когда из Access запускал Word. Ты прав, это можно использовать и в данном случае. Спасибо.
А может все-таки есть у wordVBA собственные функции, кто знает отзовитесь!
Действительно прикольно, для Excel это свойство есть - Application.Hwnd, а в Word нет.... :)