Попробуйте, пожалуйста, заменить ваш код для добавления OLEObject на этот, и дайте мне знать, если он хорошо открыт:
Set OLE = OLEs.Add( _
fileName:=filePath, _
Link:=False, _
DisplayAsIcon:=True, _
IconFileName:= _
"C:\Windows\Installer\{AC76BA86-1033-FFFF-7760-0E0F06755100}\_SC_Acrobat.ico", _
IconIndex:=0, _
IconLabel:="Click to open the " & Ws.Name & " PDF file")
Вторая версия, для которой не требуется путь к значку. Он использует (установленный) путь exe. И также показывает значок связанного приложения . Есть два способа сделать это. Использование API или извлечение его непосредственно из реестра. Я покажу пример только для первого способа:
Адаптируйте ваш код для создания OLEObject следующим образом:
exePath = exeApp(filePath)
Set OLE = ws.OLEObjects.Add( _
fileName:=filePath, _
link:=False, _
DisplayAsIcon:=True, _
IconFileName:=exePath, _
left:=ws.Range("F1").left, _
top:=ws.Range("F1").top, _
IconIndex:=0, IconLabel:="Embeded PDF (your name)")
Поместите функцию API поверх вашего модуля (в объявлениях часть):
Private Declare PtrSafe Function FindExecutable Lib "shell32.dll" _
Alias "FindExecutableA" (ByVal lpFile As String, _
ByVal lpDirectory As String, ByVal lpResult As String) As Long
И скопируйте функцию, способную получить связанный путь к приложению:
Private Function exeApp(strFile As String) As String
Const MAX_FILENAME_LEN = 260
Dim i As Long, buff As String
If strFile = "" Or Dir(strFile) = "" Then
MsgBox "File not found!", vbCritical
Exit Function
End If
'Create a buffer
buff = String(MAX_FILENAME_LEN, 32)
'Retrieve the name and handle of the executable
i = FindExecutable(strFile, vbNullString, buff)
If i > 32 Then
exeApp = left$(buff, InStr(buff, Chr$(0)) - 1)
Else
MsgBox "No association found, for this file !"
End If
End Function