Newsgroup: it.comp.appl.access
Titolo: Aprire pdf con un  click Access 2013

Buonasera, un mio DB creato in access 2003 prevedeva in un bottone
.........altro codice
 
ShellExecute 0, "open", StrInput, "", "", SW_HIDE
 
.........altro codice
 
per aprire il file pdf puntato nella maschera.
 
In ufficio mi hanno dato un PC nuovo con office 2013 ed il mio DB gira, tranne che per questa funzione. Non succede assolutamente nulla.
Una dritta?
Grszie


Il S.O. è 32 o 64Bit...?
 
Dovresti modificare la chiamata API con la nuova modalità PRTSAFE
 
#If VBA7 Then
     Private Declare PtrSafe Function ShellExecute 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 LongPtr
#Else
    Private Declare Function ShellExecute 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
 
@Alex

64 bit


Ho definito una funzione che richiama esplicitamente Acrobat Reader, previa 
lettura del suo percorso nella chiave di registro.
Con le dovute modifiche puoi ricavarti il percorso di installazione in 
Windows 64bit:
 
Public Sub PDFApri(strPathFile As String, strPagina As String)
On Error GoTo Error_PDFApri
 
    Dim WSHShell As Object
    Set WSHShell = CreateObject("WScript.Shell")
    Dim sAcrobatPath As String
    Dim Retval As Double
 
    If strPagina <> "" Then
        sAcrobatPath = 
WSHShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App 
Paths\AcroRd32.exe\")
        Retval = Shell("""" & sAcrobatPath & """" & " /A" & " " & """" & 
"page=" & strPagina & "=OpenActions" & """" & " " & """" & strPathFile & 
"""", vbNormalFocus)
    End If
 
Exit_PDFApri:
    Exit Sub
 
Error_PDFApri:
    GoTo Exit_PDFApri
End Sub
 

Hyperlink non va bene?

 64 bit
 
Quello che ti ho scritto dovrebbe andare anche in 64bit sostituendo il Check del 64bit al posto di VBA7... e dal momento in cui la usi solo in quel modo non sono necessarie altre modifiche.
 
#If Win64 Then
Private Declare PtrSafe Function ShellExecute 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 LongPtr
#Else
Private Declare Function ShellExecute 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
 
Come ti ha detto Roberto, la cosa migliore sarebbe usare FollowHyperlink che è nativo e non richiede nulla, solo che non l'ho suggerito in quanto tu apri il PDF in modalità NASCOSTA(SW_HIDE)... che con il metodo indicato non è possibile.
 
@Alex

> Hyperlink non va bene?
 
Hyperlink ha delle limitazioni: se hai un campo su DB diverso da Access, che 
visualizzi su tabella, che alimenti in automatico, che per forza deve essere 
testo, sul quale devi fare doppio click per aprire un PDF, ... è troppo 
articolato trasformarlo in Hyperlink, meglio usare una Sub che faccia il 
lavoro. Tra l'altro la routine che ho postato, consente di andare ad una 
pagina specifica del PDF, molto comodo nel caso in cui il PDF sia la fusione 
di piu documenti (esempio il risultato di uno spool di stampa). 
 


A voler essere completi... il metodo Follow dell'Oggetto Hyperlink, oppure meglio ancora il metodo FollowHyperlink sono estremamente funzionali per l'esigenza che ha postato l'OP, che non ha attinenza con quanto dici ora come potenzialità possibili in quanto non richieste..., oviamente come esposto carenti della possibilità di mettere in HIDE il file aperto.
 
Sub FollowHyperlink(Address As String, [SubAddress As String], [NewWindow As Boolean = Falso], [AddHistory As Boolean = Vero], [ExtraInfo], [Method As MsoExtraInfoMethod], [HeaderInfo As String])
 
Il metodo che hai postato tuttavia offre alcuni spunti di riflessione che ti indico:
1) nel caso non fosse installato... non fa nulla... in questo caso la gestione errori non ha molto senso..., suggerirei, su ERRORE di verificare  con FindExecutable l'EXE associato al PDF e proporre di usare quello...
2) Dal momento che istanzi Shell di WScript, mi chiedo perchè non sfrutti il metodo RUN dell'oggetto che peraltro consente la gestione SINCRONA, che magari è importante sempre come possibilità...?
3) I metodi SHELL sia Nativo che di WScript restituiscono un valore che può essere il PID del processo, oppure un codice errore...
I codici errori di SHELL sono importanti proprio per quanto indicato al punto 1, mentre il PID, per chi ha dimestichezza è importantissimo in quanto consente di fare azioni sul processo lanciato, anche chiuderlo o recuperare l'istanza della WindowsForm aperta per interagire...
 
Come vedi volendo si possono fare cose ben più avanzate... 
 
@Alex

Come vedi volendo si possono fare cose ben più avanzate...
 
Grazie dei suggerimenti ne terrò conto. 
 

Il metodo RUN fa prima di tutto la stessa cosa che fai fare alla Shell del tuo esempio... ma ha una cosa molto particolare in aggiunta come opzione, che ti ho esposto ma mi pare non colto... ovvero l'esecuzione sincrona... ovvero lancia e ritorna a fine processo...
È utile... eccome se devi attendere la reale completa esecuzione dell'azione, che sia apertura di un file pesante o la stampa ...
Prova a docuemntarti e vedi tu poi come tenerne conto... certo piuttosto di usare API con e creare un processo nel quale poi usare la Waitforsingleobject.... intendo questo:
https://msdn.microsoft.com/en-us/library/bb258148(v=office.12).aspx
 
 
Saluti
@Alex

ovvero lancia e ritorna a fine processo...
È utile... eccome se devi attendere la reale completa esecuzione 
dell'azione, che sia apertura di un file pesante o la stampa ...
 
Si, ne ho colto l'importanza, mi ritorna utile con l'esecuzione di un'altra 
applicazione: PDF2Text.
E' da parecchio tempo che cerco di lanciare questa utility da Access 
attendendo che finisca l'elaborazione, tutti tentativi falliti.
Provo con RUN oppure con le API, grz.