У меня есть приложение 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 после того, как он выполнил свою задачу.