DocumentExport копирует PDF на страницу Excel, но оставляет открытую копию PDF, который я не могу закрыть - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть приложение Microsoft Project vba, в которое я хочу скопировать выбор задач, используя поле «помечено», чтобы идентифицировать все предшествующие задачи для целевой задачи, обозначенной ниже как «цель». Когда я проследил, чтобы сеть включала только незавершенные задачи, управление переходит к подпрограмме, которая использует DocumentExport для создания скопированного файла и сохранения его в формате PDF. Затем, используя ActiveSheet.OLEObjects.add, возьмите этот PDF-файл и скопируйте его в заданную c excel Tab с ячейкой «A3», являющейся верхним / левым углом для файла, который нужно поместить.

выдержки из моего текущий код:

    target = ActiveCell.Task
    SaveFilePath = "C:\Macros\"
    SaveFileName = SaveFilePath & "Target-" & target & ".pdf"
    SaveFilePath = "C:\Macros\"
    SaveFileName = SaveFilePath & "Target-" & target & ".pdf"

    Application.FilePageSetupView Name:=".MarkedPred_View", allsheetcolumns:=True, BestPageFitTimescale:=True
    Application.FilePageSetupPage Name:=".MarkedPred_View", Portrait:=False, PagesTall:=6, PagesWide:=1, PaperSize:=pjPaperLegal, FirstPageNumber:=False
    StrHeader = "&18&B" & GetFontFormatCode("Calibri") & "Status Date=" & Format(ActiveProject.StatusDate, "mm/dd/yy") & " Task Name= " & SelTask.Name & " ID:" & SelTask.ID & " UID:" & SelTask.UniqueID
    Application.FilePageSetupHeader Name:=".MarkedPred_View", Alignment:=pjCenter, Text:=StrHeader
    Application.FilePageSetupLegend Name:=".MarkedPred_View", LegendOn:=pjNoLegend

    DocumentExport SaveFileName, pjPDF, FromDate:=EarliestStart - 30, ToDate:=LFin + 30

    xlsheet.Range("A3").Select
    ActiveSheet.OLEObjects.Add(FileName:=SaveFileName, Link:=True _
            , DisplayAsIcon:=False).Activate

Если установить для свойства Link значение false, копирование в excel не произойдет

    sbDeleteAFile (SaveFileName)

    Sub DeleteAFile(ByVal FileToDelete As String)
         IsFileOpen (FileToDelete)
             SetAttr FileToDelete, vbNormal
             Kill FileToDelete
    End Sub

    Function IsFileOpen(FileName As String)
    Dim filenum As Integer, errnum As Integer

    OutputStr = ("1587 - IsFileOpen - started for = " & FileName)       'added
    Call Txt_Append(MyFile, OutputStr)

    On Error Resume Next   ' Turn error checking off.
         filenum = FreeFile()   ' Get a free file number.
         ' Attempt to open the file and lock it.
         Open FileName For Input Lock Read As #filenum
         Close filenum          ' Close the file.
         errnum = Err           ' Save the error number that occurred.
         On Error GoTo 0        ' Turn error checking back on.


        ' Check to see which error occurred.
        Select Case errnum


            Case 0
               IsFileOpen = False
               'Open (Filename)
               ' Error number for "Permission Denied."
               ' File is already opened by another user.
               OutputStr = ("1587 - IsFileOpen - is NOT Open")       'added
               Call Txt_Append(MyFile, OutputStr)
           Case 70
               IsFileOpen = True

              ' Another error occurred.
           Case Else
               OutputStr = ("1587 - IsFileOpen - IS Open")       'added
               Call Txt_Append(MyFile, OutputStr)
               Error errnum
         End Select

    End Function

"LFin" - это конечная sh дата цели задание, из которого я собираю всех своих предшественников. Я использую конечную дату sh в качестве "Последнего конечного значения sh" (LFIN) для привязки "ToDate" в команде.

Ошибка появляется с ActiveSheet.OLEObjects.Add (fileName : = SaveFilename, Link: = True _ "команда, в которой файл PDF открывается и копируется на указанную вкладку Excel, где ячейка" A3 "является точкой вставки изображения.

У меня нет ни одной код для закрытия PDF-файла в этом фрагменте, поэтому я получаю сообщение об ошибке при попытке удалить открытый файл. Я видел множество обсуждений на различных досках, где, если файл открывается другим приложением, MS Project VBA не может удалить его, как это происходит не иметь дескриптор файла (??). Если я вручную закрываю PDF, закрываю уведомление об ошибке в отладчике и затем нажимаю «Run / Continue», PDF удаляется и циклически возвращается к основной процедуре, как я хочу, но я должен снова закрыть вновь созданный PDF-файл, очистить диалоговое окно и выбрать «Выполнить / продолжить».

Единственный раздел этого кода, который не работает должным образом (и я в настоящее время отсутствует в этом коде) имеет возможность закрыть PDF после его копирования в Excel, поскольку он больше не нужен. Я видел только очень сложный код, который получает дескриптор PDF, а затем позволяет закрыть указанный файл c, не затрагивая другие файлы PDF, которые также могут быть открыты и не являются частью этого процесса.

У кого-нибудь есть идеи? Я впервые начал использовать CopyToClipboard, но эта команда может скопировать только 16 строк расписания MS Project в буфер обмена. Затем я попробовал ExportAsFixedFormat, но записи FromDate и ToDate не влияют на отображаемое изображение.

Использование DocumentExport и Application.OLEObjects.Add позволяет мне копировать неограниченные страницы расписания в буфер обмена и вставлять их во вкладку Excel с указанием только желаемых дат. Это самое близкое, что я смог получить, чтобы получить то, что Я хочу, чтобы результат был похож. Мне не удалось найти связанную команду для Application.OLEObjects.Add, которую я могу использовать, чтобы закрыть файл PDF, созданный Application.OLEObjects.Add. Конечно, имеет смысл открыть файл PDF, чтобы его можно было скопировать на вкладку Excel, но удивительно, что нет и простого способа закрыть этот файл PDF после того, как он выполнил свою задачу.

1 Ответ

0 голосов
/ 07 февраля 2020

Вопрос сводится к следующему:

Ошибка появляется с командой «ActiveSheet.OLEObjects.Add (fileName: = SaveFilename, Link: = True, DisplayAsIcon: = False) .Activate». где файл PDF открывается и копируется в указанную вкладку Excel ...

Причина, по которой открывается файл PDF, заключается в том, что код сообщает его. С помощью * Только что добавленный метод OLEObject 1009 * активирует его, то есть открывает файл PDF.

Решение состоит в том, чтобы просто использовать метод OLEObjects.Add:

ActiveSheet.OLEObjects.Add FileName:=SaveFileName
...