Страницы: 1
RSS
Если не установлена программа для чтения PDF, возврат значения в ячейку и без ошибки чтения
 
Добрый вечер!
Ответов нигде не отыскал.

Есть следующий код (макрос и файл прилагаю), который находит все файлы в указанной папке и подпапках (файлы xls, xlsx, docx, txt, PDF с текстом), и выводит название файла, адрес и т.п. на новый лист.
Возможно ли реализовать, чтобы макрос возвращал значение, например "необходим Acrobat Reader" в столбце D в случае, если на компьютере не установлена программа для чтения PDF (реально ли такое на практике). Заранее спасибо за ваши советы.
Код
Sub Макрос5()
    Dim V As String
    Dim BrowseFolder As String
      
    'открываем диалоговое окно выбора папки
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выберите папку или диск"
        .Show
        On Error Resume Next
        Err.Clear
        V = .SelectedItems(1)
        If Err.Number <> 0 Then
            MsgBox "Вы ничего не выбрали!"
            Exit Sub
        End If
    End With
    BrowseFolder = CStr(V)
      
    'добавляем лист и выводим на него шапку таблицы
    ActiveWorkbook.Sheets.Add
    With Range("A1:E1")
        .Font.Bold = True
        .Font.Size = 12
    End With
    Range("A1").Value = "Имя файла"
    Range("B1").Value = "Путь"
     
    'вызываем процедуру вывода списка файлов
    'измените True на False, если не нужно выводить файлы из вложенных папок
    ListFilesInFolder BrowseFolder, True
End Sub
  
  
Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)
  
    Dim FSO As Object
    Dim SourceFolder As Object
    Dim SubFolder As Object
    Dim FileItem As Object
    Dim r As Long
  
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = FSO.getfolder(SourceFolderName)
  
    r = Range("A65536").End(xlUp).Row + 1   'находим первую пустую строку
    'выводим данные по файлу
    For Each FileItem In SourceFolder.Files
        Cells(r, 1).Formula = FileItem.Name
        Cells(r, 2).Formula = FileItem.Path
        r = r + 1
        X = SourceFolder.Path
    Next FileItem
      
    'вызываем процедуру повторно для каждой вложенной папки
    If IncludeSubfolders Then
        For Each SubFolder In SourceFolder.SubFolders
            ListFilesInFolder SubFolder.Path, True
        Next SubFolder
    End If
  
    Columns("A:E").AutoFit
  
    Set FileItem = Nothing
    Set SourceFolder = Nothing
    Set FSO = Nothing
  
End Sub
 
Цитата
Art89 написал:
на компьютере не установлена программа для чтения PDF
У вас браузер установлен? Если да, то и программа для чтения PDF тоже.
 
RAN, установлен. На рабочих компьютерах часто нет установленного Acrobat Pro и других приложений чтения PDF. Задача в том, чтобы возвращать значение "необходим Acrobat Reader" в случае, если файл PDF, к примеру, не удалось прочесть макросом или именно через отсутствие необходимого ПО. Извините, если не четко формулирую мысли. Что думаете?
 
Art89,  RAN,  вам написал о том, что с некоторых пор PDF просматривается IE , который является неотъемлемой частью системы. Следовательно всегда есть та программа которая откроет эти файлы. Однако, соглашусь, что порой только в Acrobat Reader некоторые документы открываются нормально. Если необходимо определеить установлено ли AR, то можно сделать WMI запрос.
Код
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colSoftware = objWMIService.ExecQuery("Select * from Win32_Product Where Name like '%Acrobat Reader%'")
For Each objSoftware In colSoftware
Debug.Print objSoftware.Name
Next
Но учтите, запрос первый раз отрабатывает достаточно долго.
Альтернатива, Проверять ветки реестра и искать там, что возможно будет быстрее, но не гарантирует ответ.
По вопросам из тем форума, личку не читаю.
 
Доброе время суток.
Вариант для чтения из реестра.
Код
    Dim p As Object
    Set p = CreateObject("WScript.Shell")
    Debug.Print p.RegRead("HKCR\.pdf\")

В моём случае получено AcroExch.Document.11
Изменено: Андрей VG - 18.02.2018 20:32:51
 
Андрей VG,  Добрый вечер.  Ассоциация может быть ,а приложение отсутсвовать. Собственно тогда надо применить оба метода, типа сперва чем открыть, а потом а есть ли это чем :-).
По вопросам из тем форума, личку не читаю.
 
БМВ, Андрей VG спасибо, попробовал ваши варианты кода.
БМВ, действительно загрузился минуты на 2 на 150 файлов - не критично. Но я не могу понять какой должен быть результат из этого кода - он что-то выдает, если Acrobat Reader не найден? Можно ли сделать, чтоб отрицательный результат отображался напротив необходимого файла из списка? Так как мой макрос отработал по прежнему и изменений (кроме увеличения времени на обработку) нигде не нашлось.
Андрей VG, если это возможно, обьясните пжл чайнику как использовать ваш код в моем (тяжелом) случае, не могу понять
 
Я ж вам пример показал, а не готовый код, ну замените там  For Each ... Next на
If colSoftware.Count > 0 Then Debug.Print True
Вместо Debug.Print True  то что хотите получить в случае если установлен AR. По идее дергать это надо не для каждого файла, а только один раз, а после использовать ранее полученный результат.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Ассоциация может быть ,а приложение отсутсвовать.
Михаил, я саму примитивную версию предложил. Можно и поглубже для надёжности. Там сбой будет только, если "дурной" админ не удалил программу, ручками удалив все файлы из папки.
Цитата
Art89 написал:
обьясните пжл чайнику как использовать ваш код
Начните, пожалуй, с чтения Создание макросов и пользовательских функций на VBA
 
Цитата
Андрей VG написал:
Михаил, я саму примитивную версию предложил.
Андрей, вспомнив про тормознутость WMI при этой операции, я сам про реестр предложил. Правда думал в HKLM\Software\Adobe прям есть, а оно только  HKCU , По ассоциации тут может и не дурной админ, а  .... например после Adobe установлен какой-либо иной  софт, потом он корректно снят, но ассоциации инсталятор обратно не вернул.  Про рукоблудное удаление программ проводником я вааще молчу.
Изменено: БМВ - 18.02.2018 23:07:03
По вопросам из тем форума, личку не читаю.
 
БМВ, вы гений - спасибо большое! Накачал книг, сегодня же начинаю заполнять свою огромную дырищу в знаниях VBA. Код действительно достаточно запустить один раз и он возвращает мне значение. Если прописывать через функцию or также приблизительное названияе других программ для чтения PDF, наличие или отсутствие отображает корректно! Ещё раз всем большое спасибо. Код, может кому пригодится:
Код
Sub Macros1()
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set colSoftware = objWMIService.ExecQuery("Select * from Win32_Product Where Name like '%Acrobat Reader%'")
    If colSoftware.Count > 0 Then
    Cells(r, 4).Formula = "Acrobat Reader óñòàíîâëåí"
    Else
    Cells(r, 4).Formula = "Óñòàíîâèòå Acrobat Reader"
    End If
End Sub
 
Art89, копируйте код при русской раскладке клавиатуры - тогда не будет проблем с кириллицей.
И Cells(r, 4).Formula = в данном случае можно писать так: Cells(r, 4) = ...
Страницы: 1
Читают тему
Наверх