Страницы: 1
RSS
Как макросом закрыть файлы разных типов (VBA)
 
Как открывать макросом файлы разных типов я разобрался, а вот как после работы с ними их закрывать? Из Эксель, потому что там собирается информация об каждом файле. Типы файлов: Word, PowerPoint, PDF, Visio и разные форматы рисунков (оно открывается средством просмотра Windows).
Код
Пробовал:
Dim objWork As Object  
 On Error Resume Next
     Set objWork = GetObject(, "PowerPoint.Application")
    objWork .Quit

С Word прокатывает, а на PowerPoint уже не работает, как и на остальных типах, и по имени файла, как написано в описании -- не работает тоже.
 
А про какие файлы вообще речь? Вы же получаете ссылку на все приложение PowerPoint, притом исключительно в случае, если он открыт...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Я же перечислил типы файлов.
Программа работает так: открывается файл (разных типов), оператор смотрит, вносит данные в форму - > в базу, файл закрывается. Непонятно как его закрыть.
Так как это сделать?  
 
Цитата
Сергей Байтеряков написал: objWork .Quit
С Word прокатывает, а на PowerPoint уже не работает
Работает и с PowerPoint, только пробел перед .Quit нужно убрать.
Можно и без переменных: GetObject(, "PowerPoint.Application").Quit
 
С Visio должно быть аналогично GetObject(, "Visio.Application").Quit
По поводу PDF - напишите сначала, каким кодом открываете PDF-документ.
 
Процесс можно завершить и с помощью Shell и Taskkill
 
Цитата
ZVI написал:
По поводу PDF - напишите сначала, каким кодом открываете PDF-документ.
Программа: Adobe Acrobat Rider DC
Код для открытия:
Код
Function fOpenFile(sFPath As String) As Boolean
    On Error Resume Next
    fOpenFile = ShellExecute(0&, "Open", sFPath, _
                        vbNullString, vbNullString, 1&) > 32
End Function
 
Цитата
ZVI написал:
Работает и с PowerPoint, только пробел перед .Quit нужно убрать.
Можно и без переменных: GetObject(, "PowerPoint.Application").Quit
Загадка, открыто три файла: Word, Visio,PowerPoint. Ниженаписаный код закрывает только два из трех -- PowerPoint остается открытым.
Код
Sub fClouse()
    On Error Resume Next
    GetObject(, "PowerPoint.Application").Quit
    GetObject(, "Word.Application").Quit
    GetObject(, "Visio.Application").Quit
End Sub
 
а объект то получаете посмотрите что вернет
Set objPPA = GetObject(, "PowerPoint.Application")
По вопросам из тем форума, личку не читаю.
 
Не получаю. Для ворда и визио -- норм.
Пишет:
Run-time error '429'
ActiveX cjmponent can't create object
Изменено: Сергей Байтеряков - 23.03.2017 08:56:05
 
Значит приложение не зарегистрировано корректно
посмотрите что в самом PP выдаст по application
и попробуйте создать объект
objPPA = CREATEOBJECT("PowerPoint.Application")
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
посмотрите что в самом PP выдаст по application
Попробовал вот так (из самого ПП). Выдает: Microsoft PowerPoint., однако при попытке закрыть с использованием этого наименования все та же ошибка.
Код
Sub fProba()
' On Error Resume Next

objPPA = Application

GetObject(, objPPA).Quit
GetObject(, "Microsoft PowerPoint.Application").Quit
End Sub
 
ну так совсем не правильно
попробуйте создать objPPA = CREATEOBJECT("PowerPoint.Application") мне кажется у вас проблемас регистрацие приложеия и незнаю, как решить кроме как переустановка/восстановление  попробовать.
По вопросам из тем форума, личку не читаю.
 
Цитата
Сергей Байтеряков написал: Программа: Adobe Acrobat Reader DC
Попробуйте так закрыть все открытые документы PDF:
Код
Sub ClosePDFs()
  CreateObject("AcroExch.App").CloseAllDocs
End Sub
 
По поводу PowerPoint, возможные причины:
1. Проблемы с регистрацией DLL в реестре. Это Михаил уже отметил.
Например, когда-то было установлено несколько версий PowerPoint.
Лучше всего переустановить приложение PowerPoint.
2. Если объект таки создается, то закрытию могут мешать надстройки приложения, особенно COM-надстройки.
Нужно временно отключить все надстройки (Файл-Параметры-Надстройки), чтобы убедиться в этом ли причина.
Изменено: ZVI - 23.03.2017 02:24:31
 
Всем спасибо за советы.
В итоге коллега помог решить через закрытие окон с программами (сама функция\ подпрограмма в конце).
Код
 Option Explicit
   Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
     (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
   Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
     (ByVal hwnd As Long, ByVal lpString As String, _
     ByVal aint As Long) As Long
   Declare Function GetWindow Lib "user32" _
     (ByVal hwnd As Long, ByVal wCmd As Long) As Long
   Declare Function EnumWindows Lib "user32" _
     (ByVal wndenmprc As Long, ByVal lParam As Long) As Long
   Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
     (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
     lParam As Any) As Long

   Private Const WM_CLOSE = &H10
   Private Const GW_HWNDFIRST = 0
   Private Const GW_HWNDLAST = 1
   Private Const GW_HWNDNEXT = 2
   Private Const GW_HWNDPREV = 3
   Private Const GW_OWNER = 4
   Private Const GW_CHILD = 5
   Private Const GW_MAX = 5

   Private mstrTarget As String
   Private mblnSuccess As Boolean


Public Function blnFindWindow(strApplicationTitle As String) As Boolean

   Dim hWndTmp As Long
   Dim nRet As Integer
   Dim TitleTmp As String
   Dim TitlePart As String
   Dim MyWholeTitle As String
   Dim mCounter As Long
   Dim hWndOver As Integer
   Dim sClassName As String * 100

   blnFindWindow = False

   TitlePart = UCase$(strApplicationTitle)

   'loop through all the open windows
   hWndTmp = FindWindow(0&, 0&)

   Do Until hWndTmp = 0

      TitleTmp = Space$(256)
      nRet = GetWindowText(hWndTmp, TitleTmp, Len(TitleTmp))

      If nRet Then
         'retrieve window title
         TitleTmp = UCase$(VBA.Left$(TitleTmp, nRet))
         'compare window title & strApplicationTitle
         If InStr(TitleTmp, TitlePart) Then
            blnFindWindow = True
            Exit Do
         End If
      End If

      hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)
      mCounter = mCounter + 1

   Loop

   End Function


Public Function blnCloseWindow(strApplicationTitle As String) As Boolean

   ' retrieve Windows list of tasks.
   mblnSuccess = False
   mstrTarget = strApplicationTitle
   EnumWindows AddressOf EnumCallback, 0
   blnCloseWindow = mblnSuccess

End Function


Public Function EnumCallback(ByVal app_hWnd As Long, _
  ByVal param As Long) As Long

   Dim buf As String * 256
   Dim title As String
   Dim length As Long

   ' Checks a returned task to determine if App should be closed

   ' get window's title.
   length = GetWindowText(app_hWnd, buf, Len(buf))
   title = Left$(buf, length)

   ' determine if target window.
   If InStr(UCase(title), UCase(mstrTarget)) <> 0 Then
      ' Kill window.
      SendMessage app_hWnd, WM_CLOSE, 0, 0
      mblnSuccess = True
   End If

   ' continue searching.
   EnumCallback = 1

End Function
'------------------------ Сама подпрограмма для закрытия -------------------
Sub main()
'Это функция для закрытия окна с фалом
  If blnFindWindow("название файла без разширения") Then
       If Not blnCloseWindow("название файла без разширения") Then
           MsgBox "Problems encountered closing Window", _
             vbInformation, "API Call"
           Exit Sub
       End If
   End If

End Sub


Страницы: 1
Читают тему
Наверх