Unfortunately, the solution in the link given by Micron in post #3 doesn't work - the security message still appears.
However, I do have a solution that works perfectly using a default file handler instead of FollowHyperlink.
There is no need to modify the registry.
Copy the following into a standard module e.g. modHandleFiles
Code:
Option Compare Database
Option Explicit
Dim fso As Object
'Original code courtesy of Dev Ashish
'###############################################
'updated for 64-bit Access by Colin Riddington (Mendip Data Systems) - 06/03/2019
#If VBA7 Then
Private Declare PtrSafe Function apiShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" _
(ByVal hWnd As LongPtr, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
#Else '32-bit Office
Private Declare Function apiShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" _
(ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
#End If
'###############################################
Public Const WIN_NORMAL = 1 'Open Normal
Public Const WIN_MAX = 2 'Open Maximized
Public Const WIN_MIN = 3 'Open Minimized
Private Const ERROR_SUCCESS = 32&
Private Const ERROR_NO_ASSOC = 31&
Private Const ERROR_OUT_OF_MEM = 0&
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
Function fHandleFile(stFile As String, lShowHow As Long)
On Error GoTo Err_Handler
Dim lRet As Long, varTaskID As Variant
Dim stRet As String
'First try ShellExecute
lRet = apiShellExecute(hWndAccessApp, vbNullString, _
stFile, vbNullString, vbNullString, lShowHow)
If lRet > ERROR_SUCCESS Then
stRet = vbNullString
lRet = -1
Else
Select Case lRet
Case ERROR_NO_ASSOC:
'Try the OpenWith dialog
varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " _
& stFile, WIN_NORMAL)
lRet = (varTaskID <> 0)
Case ERROR_OUT_OF_MEM:
stRet = "Error: Out of Memory/Resources. Couldn't Execute!"
Case ERROR_FILE_NOT_FOUND:
stRet = "Error: File not found. Couldn't Execute!"
Case ERROR_PATH_NOT_FOUND:
stRet = "Error: Path not found. Couldn't Execute!"
Case ERROR_BAD_FORMAT:
stRet = "Error: Bad File Format. Couldn't Execute!"
Case Else:
End Select
End If
fHandleFile = lRet & _
IIf(stRet = "", vbNullString, ", " & stRet)
Exit_Handler:
Exit Function
Err_Handler:
MsgBox "Error " & Err.Number & " in fHandleFile procedure : " & Err.Description, vbOKOnly + vbCritical
Resume Exit_Handler
End Function
Now all you need to do is call the application with the path of the file and let Windows do the rest.
This code can be used to start any registered applications, including another instance of Access.
If it doesn't know what application to open the file with, it just pops up the standard "Open With.." dialog.
It can even handle URL's and mailto:
'Open a PDF:
' fHandleFile("C:\MyDocuments\MyPDFDoc.pdf",WIN_NORM AL)
'Open a folder:
' fHandleFile("C:\TEMP",WIN_NORMAL)
'Call Email app:
' fHandleFile("mailto:bpo@yahoo.com",WIN_NORMAL)
'Open URL:
' fHandleFile("http://uk.yahoo.com";, WIN_NORMAL)
'Handle Unknown extensions:
' fHandleFile("C:\TEMP\TestThis",Win_Normal)