我写了一个宏,可以将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
我的问题:
我希望该图标位于Cell AN5的中心,但该图标应位于顶部和左侧。如果我在OLEObjects.Add行中添加左上角数字,它将把图标移到单元格A1中。我不知道如何相对于已选择的单元格使用“顶部和左侧”。
无论何时嵌入文件,PDF都会在Adobe Reader中打开。有没有办法让它不打开?
IconFileName部分具有非常长的字母和数字字符串。 (我是从录制将PDF插入工作表的宏中获得的。)它看起来像一个注册表地址。如果我在另一台计算机上使用此文件,图标会显示在那里吗?我认为这长字符串在另一台计算机上会有所不同吗?任何人都知道我如何做到这一点,无论它运行在什么计算机上,它都可以工作?我计划在完成后将此文件发送给其他人。
答案 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)
从OLEObjects.Add Method (Excel)开始,要使用Left参数,'相对于工作表中单元格A1左上角的新对象的初始坐标(以磅为单位)。因此,如果您希望图标位于AN5的中间,则必须将A:AM的列宽与1:4的行高相加,然后将列AN的列宽。您可以尝试放弃Select并使用Range(“ AN5”)。OLEObjects.Add ...,它应使OLEObjects将AN5视为相对A1。
插入时不激活对象。
对于安装了Adobe版本的任何人,GUID应该是公用的。