【发布时间】:2020-03-04 18:50:53
【问题描述】:
我正在尝试以编程方式将 PDF 文件嵌入到特定的工作表中。当我使用 ClassType 变量“Adobe.Document.2015”嵌入时,文件打开没有问题,但是,我必须手动粘贴到文件路径中。当我使用 OLEObjects.Add 的文件名参数进行嵌入时,我可以以编程方式执行此操作,但是,当用户打开以这种方式嵌入的 PDF 文档时,他们会在 Acrobat 端收到一条错误消息。通过 OLEObjects.Add 的 ClassType 参数添加时不会出现此消息。有没有办法同时使用 ClassType 和 Filename 参数,这样我就不必手动粘贴文件路径?
当我尝试 Application.SendKeys 时,我不知所措,但它是在 OLEObjects.Add 方法解决后执行的,而不是在解决期间执行。感谢任何帮助。
Sub OLE_Objects_Fix()
Dim OLE As Excel.OLEObject
Dim OLEs As Excel.OLEObjects
Dim Xl As New Excel.Application
Dim Ws As Excel.Worksheet
Dim Wb As Excel.Workbook
Dim dirPath, fileName, filePath As String
Dim Rng As Excel.Range
Set Rng = Summary.Range("A1")
dirPath = "C:\Users\me\Desktop\...\Models\"
fileName = VBA.Dir(dirPath, vbNormal)
With Xl
.Visible = True
While fileName <> ""
If VBA.Left(fileName, 9) = "unique identifier" Then
Debug.Print fileName
Set Wb = .Workbooks.Open(dirPath & fileName, False, False)
For Each Ws In Wb.Worksheets
Ws.Activate
Set Rng = Rng.Offset(1, 0)
If Ws.Name = Rng.Offset(0, 1).Value Then
filePath = Rng.Offset(0, 3).Value
End If
For Each OLE In Ws.OLEObjects
OLE.Delete
Next OLE
If filePath <> "" Then
Debug.Print Ws.Name: Debug.Print filePath
Set OLEs = Ws.OLEObjects
Set OLE = OLEs.Add( _
fileName:=filePath, _
Link:=False, _
DisplayAsIcon:=False, _
Left:=Ws.Range("F1").Left, _
Top:=Ws.Range("F1").Top)
End If
Next Ws
filePath = ""
Wb.Close (True)
End If
fileName = VBA.Dir
Wend
End With
End Sub
【问题讨论】:
-
但是,你在什么程序中工作,只使用 Excel 对象?需要在哪里手动粘贴文件路径?
-
@FaneDuru 我在 Excel 中工作。当我在 OLEObjects.Add 方法中使用 ClassType 参数时,它会打开一个文件对话框并要求我选择一个文件。我曾尝试使用 Application.SendKeys 但它是在解决方法后执行的,而不是在我需要的期间执行。
-
那么,
Dim Xl As New Excel.Application是一种奇怪的方法...无论如何,如果您的 OLEObject 将嵌入 作为图标,那会不会有问题?我问这个是有目的的…… -
@FaneDuru 我正在使用新的 excel 实例来打开这些工作簿,因为我不希望用户看到正在更新的 OLE 对象。如果我使用 Excel 的活动实例,他们的用户输入可能会搞砸。只要文档仍然没有错误地打开,我就不关心将项目显示为图标。
-
好的。然后试试这个:事实上,我会发布一个答案。在这里你不会明白的,在评论里……