Public Function CheckExcel() As Boolean
Dim objExcl As Object
On Error Resume Next
Err.Clear
Set objExcl = GetObject(, "Excel.Application")
If Err.Number > 0 Then
CheckExcel = False
Else
CheckExcel = True
End If
End Function
Как проверить, подключен ли объект?
Проблема такая, я в Access пишу процедурку, которая будет создавать вордовый документ и грузить туда в шаблон данные. Объект Word у меня создается autoexec-ом при запуске базы:
Function AutorunFunction()
Set WordObject = CreateObject("word.Application")
WordObject.Visible = True
End Function
А потом по нажатии кнопочки на аксесовской форме, в Word-е будет создаваться отчет. НО проблема в том, что какой-нибудь глупый юзер может с перепугу закрыть Word.
Объясните плз., как мне проверить WordObject на предмет: подключен к нему все еще объект, или уже нет? Подозреваю, что это не сложно, но если сложно, то напишите подробнее (я в Бейсике дуб) :(
WordObject.Visible = True
можно установить, когда отчет будет сформирован.
В общем Tiraspolsky безусловно прав - можно показать word пользователю когда все будет уже готово... правда это конечно не предохраняет на 100% программу от закрытия (можно ее и через диспетчер задач прикрыть), так что лишняя проверка не помешает.
Цитата:
Originally posted by Tiraspolsky
А зачем ты торопищься?
WordObject.Visible = True
можно установить, когда отчет будет сформирован.
А зачем ты торопищься?
WordObject.Visible = True
можно установить, когда отчет будет сформирован.
Это на самом деле не принципиально. Если WordObject создается один раз за все время работы БД, то все равно существует опасность, что его закроют ручками раньше, чем к нему потом обратится программа.
Цитата:
Originally posted by SergeySV
В общем Tiraspolsky безусловно прав - можно показать word пользователю когда все будет уже готово... правда это конечно не предохраняет на 100% программу от закрытия (можно ее и через диспетчер задач прикрыть), так что лишняя проверка не помешает.
например так
В общем Tiraspolsky безусловно прав - можно показать word пользователю когда все будет уже готово... правда это конечно не предохраняет на 100% программу от закрытия (можно ее и через диспетчер задач прикрыть), так что лишняя проверка не помешает.
например так
Спасибо, попробую :)
Если у пользователя свой Excel, а вы открываете свой и пользователь Ваш закрывает, а свой оставляет, то тогда это не отсечется, а ошибке в коде возникнет... потому что функция проверяет просто наличие запущенного экземпляра Excel'я
Чтобы это учесть можно ее переписать на такой манер:
Код:
Function CheckExcl(ByRef ExcelApp As Object) As Boolean
Dim xlApp As Object
On Error GoTo Er_
' пробуем обратиться к свойству Application у Excel.Application.
' это свойство есть у каждого объекта в VBA
Set xlApp = ExcelApp.Application
CheckExcl = True
Ex_:
Set xlApp = Nothing
Exit Function
Er_:
Set ExcelApp = Nothing
CheckExcl = False
Resume Ex_
End Function
Dim xlApp As Object
On Error GoTo Er_
' пробуем обратиться к свойству Application у Excel.Application.
' это свойство есть у каждого объекта в VBA
Set xlApp = ExcelApp.Application
CheckExcl = True
Ex_:
Set xlApp = Nothing
Exit Function
Er_:
Set ExcelApp = Nothing
CheckExcl = False
Resume Ex_
End Function
ExcelApp - это переменная-указатель на твой созданный экземпляр-Excel
Я призываю Вас соразмерять прилагаемые усилия и средства с решаемой задачей. Тем более в данном конкретном случае, когда программа общается с объектом только во время формирования отчета.
Если же есть надобность в последующих обращениях, на мой взгляд лучший способ - проверять дескриптор окна, который следует предварительно запомнить.
Цитата:
Originally posted by Tiraspolsky
Ребята, вы, конечно, большие умельцы по части всяких хитростей и ухищрений. Давайте, однако, поймем, о чем мы говорим. А говорим мы об интерфейсе пользователя. И если WordObject.Visible = False, то объект из интерфейса пользователя исключен. Если же считать, что диспетчер программ также входит в интерфейс пользователя, то пользователь (который полный болван по определению) может закрыть не только Word, но и все приложение а также другие жизненно важные процессы. С этой точки зрения надо на время формирования отчета заблокировать клаву и мышь. Такое решение, однако, напоминает пословицу про дурака в церкви.
Я призываю Вас соразмерять прилагаемые усилия и средства с решаемой задачей. Тем более в данном конкретном случае, когда программа общается с объектом только во время формирования отчета.
Если же есть надобность в последующих обращениях, на мой взгляд лучший способ - проверять дескриптор окна, который следует предварительно запомнить.
Ребята, вы, конечно, большие умельцы по части всяких хитростей и ухищрений. Давайте, однако, поймем, о чем мы говорим. А говорим мы об интерфейсе пользователя. И если WordObject.Visible = False, то объект из интерфейса пользователя исключен. Если же считать, что диспетчер программ также входит в интерфейс пользователя, то пользователь (который полный болван по определению) может закрыть не только Word, но и все приложение а также другие жизненно важные процессы. С этой точки зрения надо на время формирования отчета заблокировать клаву и мышь. Такое решение, однако, напоминает пословицу про дурака в церкви.
Я призываю Вас соразмерять прилагаемые усилия и средства с решаемой задачей. Тем более в данном конкретном случае, когда программа общается с объектом только во время формирования отчета.
Если же есть надобность в последующих обращениях, на мой взгляд лучший способ - проверять дескриптор окна, который следует предварительно запомнить.
Да все Ок, я уже прогу написал :) Теперь вношу поправки. Проще заново переписать... :(