将PDF嵌入到Excel中-三个问题

时间:2018-08-07 22:17:40

标签: excel vba pdf embed

我写了一个宏,可以将PDF文件嵌入到Excel工作表中。我希望文件图标显示在某个单元格中。到目前为止,还算不错,但是我确实有一些疑问。

但是首先,我的代码执行文件的嵌入:

Range("AN5").Select

ActiveSheet.OLEObjects.Add(ClassType:="AcroExch.Document.DC", Link:=False, _
    DisplayAsIcon:=True, _
    IconIndex:=0, IconLabel:=NameForPDFIcon, _
    IconFileName:="C:\WINDOWS\Installer\{AC76BA86-7AD7-1033-7B44-AC0F074E4100}\PDFFile_8.ico").Activate

我的问题:

  1. 我希望该图标位于Cell AN5的中心,但该图标应位于顶部和左侧。如果我在OLEObjects.Add行中添加左上角数字,它将把图标移到单元格A1中。我不知道如何相对于已选择的单元格使用“顶部和左侧”。

  2. 无论何时嵌入文件,PDF都会在Adobe Reader中打开。有没有办法让它不打开?

  3. IconFileName部分具有非常长的字母和数字字符串。 (我是从录制将PDF插入工作表的宏中获得的。)它看起来像一个注册表地址。如果我在另一台计算机上使用此文件,图标会显示在那里吗?我认为这长字符串在另一台计算机上会有所不同吗?任何人都知道我如何做到这一点,无论它运行在什么计算机上,它都可以工作?我计划在完成后将此文件发送给其他人。

2 个答案:

答案 0 :(得分:1)

基于https://stackoverflow.com/questions/32235897/how-to-embed-documents-using-vba

Declare Function FindExecutable Lib "shell32.dll" _
     Alias "FindExecutableA" (ByVal lpFile As String, _
                              ByVal lpDirectory As String, _
                              ByVal lpResult As String) As Long


Sub tester()
    AddFile ActiveSheet.Range("H10"), "C:\Users\jblow\Desktop\Training.pdf"
    AddFile ActiveSheet.Range("H20"), "C:\Users\jblow\Desktop\Info.xlsm"
End Sub

Sub AddFile(c As Range, sFile As String)

    Dim exe As String, o

    exe = FindApp(sFile)

    Set o = c.Worksheet.OLEObjects.Add(Link:=False, DisplayAsIcon:=True, _
            IconFileName:=exe, IconIndex:=0, _
            IconLabel:="Testing", Top:=c.Top, Left:=c.Left, _
            Filename:=sFile)

    o.ShapeRange.Width = c.Width '<< fit to cell

End Sub

Function FindApp(sFile As String) As String
   Const MAX_FILENAME_LEN = 260
   Dim i As Integer, s2            As String

   'Check if the file exists
   If Dir(sFile) = "" Or sFile = "" Then
      MsgBox "File not found!", vbCritical
      Exit Function
   End If
   'Create a buffer
   s2 = String(MAX_FILENAME_LEN, 32)
   'Retrieve the name and handle of the executable, associated with this file
   i = FindExecutable(sFile, vbNullString, s2)
   If i > 32 Then
      FindApp = Left$(s2, InStr(s2, Chr$(0)) - 1)
   Else
      MsgBox "No association found !"
   End If
End Function

答案 1 :(得分:1)

  1. OLEObjects.Add Method (Excel)开始,要使用Left参数,'相对于工作表中单元格A1左上角的新对象的初始坐标(以磅为单位)。因此,如果您希望图标位于AN5的中间,则必须将A:AM的列宽与1:4的行高相加,然后将列AN的列宽。您可以尝试放弃Select并使用Range(“ AN5”)。OLEObjects.Add ...,它应使OLEObjects将AN5视为相对A1。

  2. 插入时不激活对象。

  3. 对于安装了Adobe版本的任何人,GUID应该是公用的。