Newsgroup: it.comp.appl.access
Titolo: Followhyperlink, non riesco a trovare la soluzione

Ciao a tutti,
 
come da consigli ricevuti giorni fa da @Alex, memorizzo gli allegati 
utilizzando l'Oggetto FileDIalog in una sottodirectory del database. 
Mentre per aprirli uso il metodo FollowHyperlink. Riscontro problemi sia 
nella memorizzazione che nell'apertura, anche se il problema maggiore è 
l'apertura che non avviene. Quando clicco sul pulsante sfoglia per 
ricercare il file da memorizzare, mi apre questo percorso E:\GENERAL 
BACKUP\Documenti, anzichè E:\GENERAL BACKUP\GESTIONE FAMIGLIA\Allegati e 
non riesco a capire il motivo.
 
 
Mentre per l'apertura del file con doppio click programmato in questo modo:
 
Private Sub Allto_DblClick(Cancel As Integer)
 
 
Dim percorso As String
 
percorso = "E:\GENERAL BACKUP\GESTIONE FAMIGLIA\Allegati"
 
Application.FollowHyperlink percorso
 
 
 
 
End Sub
 
Arrivo ad aprire la subfolder Allegati ma non ad aprire il file che in 
maschera è memorizzato in questo modo AB Medical 4 feb 20.pdf, neanche 
se in maschera lo memorizzo con E:\GENERAL BACKUP\GESTIONE 
FAMIGLIA\Allegati\AB Medical 4 feb 20.pdf . Qui sono consapevole che 
manca il comando di apertura del file stesso, sono giorni che sto 
facendo ricerche con Google anche su siti in lingua inglese ma non trovo 
nulla che spieghi come procedere per chi come me ha poca dimestichezza. 
Cosa sto tralasciando per poter aprire questo benendetto pdf? Grazie.
 
 
 
-- 
RoBort


per aprire qualsiasi file da anni uso questo codice e non mi ha mai dato 
problemi.
 
 
creati un un modulo
Option Compare Database
 
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
 
 
'***App Window Constants***
Public Const WIN_NORMAL = 1         'Open Normal
Public Const WIN_MAX = 2            'Open Maximized
Public Const WIN_MIN = 3            'Open Minimized
 
'***Error Codes***
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)
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)
End Function
 
 
 
 
 
e nella tua funzione
 
 
Private Sub Allto_DblClick(Cancel As Integer)
 
 
Dim percorso As String
 
percorso = "E:\GENERAL BACKUP\GESTIONE FAMIGLIA\Allegati"
 
Dim X As Variant
X = fHandleFile(percorso, WIN_NORMAL)
 
 
End Sub
 
 
ciao
BFS
 
 
 
 

Oppure questo:
 
 
Public Sub ExecuteFile(FilePath As String)
    'Esegue file
    On Error GoTo error
    Dim ret As Integer
    ret = Shell("rundll32.exe url.dll,FileProtocolHandler " & (FilePath))
    Exit Sub
error:
    MsgBox Err.Description, vbExclamation, "Error"
End Sub
 
@Alex

Vi ringrazio per le dritte, incontro ancora dei problemi. Non serve che 
premetta la tanta volontà che ho nel cercare di apprendere ricercando 
etc. e la poca conoscenza.
 
Per quanto concerne la dritta di BFS, ho creato il modulo e senza andare 
oltre mi si visualizza il seguente messaggio:
 
Errore di compilazione.
Il codice del progetto deve essere aggiornato per l'utilizzo in sistemi 
a 64 bit. Esaminare e aggiornare le istruzioni Declare, quindi 
contrassegnarle con l'attributo PtrSafe.
 
Mentre per quanto riguarda la dritta di @Alex, sicuramente ho impostato 
il tutto dove non andava messo, vale a dire sul doppio click 
dell'apertura del file. Pertanto non sono riuscito a farlo funzionare. 
Se vorrete darmi un ulteriore aiuto vi ringrazio anticipatamente e colgo 
l'occasione per augurarvi Buona Pasqua.
 
__
RoBort
 
 
 
 
 
 
Il 03/04/2021 02:09, Robort ha scritto:


Per quanto riguarda la funzione che ti ho suggerito la devi mettere in un modulo generico e richiamarla su evento doppio click cosi:
 
Call ExecuteFile(percorsocompleto)
 
Dove percorsocompleto è il Path+NomeFile
 
Per la funzione API di BFS la dichiarazione si può modificare cosi:
 
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
 
Secondo me per come ha inserito l'handle nella chiamata senza passare per variabili dovrebbe bastare.
 
@Alex


Alex grazie per la pazienza... Allora, ho provato la funzione che mi hai 
suggerito, l'ho messa in un modulo ed ho fatto tutto il resto, 
probabilmente tralasciando o sbagliando qualcosa, non mi funziona. 
Allora ho provato sempre i tuoi suggerimenti sulla funzione di BFS, mi 
va in debug alla riga successiva al commento 'First try ShellExecute e 
precisamente evidenzia apiShellExecute - Errore di compilazione: Sub o 
Function non definita.
 
-- 
RoBort

Non vedi che basta cambiare il nome della chiamata API della funzione...?
 
Temo tu abbia lacune profonde per riuscire ad avere un minimo di autonomia su questi argomenti...
 
@Alex


Profonde è ancora poco...
 
-- 
RoBort

Il 03/04/2021 22:21, @Alex ha scritto:

Profonde è ancora poco...
 
Il fatto è che non capisco dove e quale nome dovrei cambiare.
 
-- 
RoBort


Non ti disperare: la procedura di Alex non funziona, quella di BFS
invece pure.
 
Oddio, sarà roba vecchia che a casa loeo anciora funziona, ma non
a casa mia: Win 10 PRO, Office 2019 tutto ENG 64/bit.
 
Ho cercato su Internet e ho trovato una ventina di procedure
per Excel ed Access che pure da me non funzionano, eppure ho
Adobe Acrobat DC installato e la reference Adobe Acrobat 10.0
Type Library selezionata.
 
Secondo me la cosa migliore sarebbe quella di avvalersi, via VBA,
di Edge che autonomamente è in grado di leggere i PDF, ma pare che
sia complicata tale gestione perché VBA ed Edge sono ancora sordi
fra di loro.
 
Io continuo le ricerche e se trovo qualcosa che funzioni
te lo comunico.
 
bruno


Ho un semplice database dove annoto le spese di casa, mi piacerebbe 
poter integrare la scansione degli scontrini fiscali ed eventuali 
fatture. Le conoscenze per la materia in questione sono veramente 
esigue, non ho nessuna pretesa. Sono giorni che cerco Googlando tentando 
di capire il dafarsi.
 
-- 
RoBort

Robort used his keyboard to write :

Qual è il layout del tuo database? quante tabelle hai fatto e quali
le relazioni?
 
Io un database del genere non ce l'ho, posso dirti come lo farei.
Una tabella con chiave primaria per le categorie di spesa (alimentari,
sanitarie, utenze, abbigliamento, etc).
Tale tabella relazionata 1-a-molti con altra tabella che contiene
le specifiche di spesa per le varie categorie (la data di acquisto,
il costo, la persona cui l'acquisto si riferisce, la documentazione
e la modalità di pagamento, etc.
Scheda e sottoscheda in modalità ContinuousForm per l'input e il
controllo dei dati.
Dopodiché puoi fare tutte le scansioni che vuoi con delle semplici
query.
Capisco che se sei alle prime armi la cosa ti possa apparire
complicata quando invece è semplicissima.
 
Io ho fatto una cosa del genere, ancor più semplice, per gli
indirizzi, numeri telefonici, email, etc.
 
Se posso darti una mano... batti un colpo.
 
Bruno


Ti ho risposto in privato, non so se ti è arrivata l'email
 
-- 
RoBort


Sì, ho esaminato brevemente il tuo lavoro: ma non sei alle prime armi!
Del lavoro ne hai fatto; è un lavoro che non farei mai, ma questa non
è una critica è una questione di gusti e abitudini.
Pensa che una tabella aperta nella modalità Tabbed Documents, se in
corrispondenza non è selezionato Display Document Tabs... quella
tabella non so come si chiuda!
 
Comunque l'attuale tuo problema è solo quello di riuscire ad aprire
un PDF da Access... cosa di cui abbiamo già discusso.
O c'è altro? dal breve esame che ho fatto mi pare che tutto
funzioni regolarmente.
 
Vedo che non hai mai usato Forms nella modalità ContinuousForm: è una
cosa che MS ha sempre detto che non si può fare: ma non è vero,
si può fare benissimo e, a mio avviso, è molto utile e piacevole.
 
Bruno

 Bruno
 
 
Se non ti dispiace continuo a risponderti in privato
 
-- 
RoBort


Ok, se vuoi che anch'io lo faccia, dimmelo!
 
Bruno


Si certamente! Era sott'inteso.
 
-- 
RoBort


Lo spirito di un newsgroup consiste nel ricevere/fornire aiuto da altre 
persone accomunate dall'interesse per uno specifico argomento
Gran parte di questo aiuto e' possibile riceverlo anche solamente 
leggendo le conversazioni altrui
Postare chiedendo aiuto su un certo argomento e poi dirottare la 
conversazione in privato, non e' propriamente conforme a quanto i 
frequentatori di questo ng si attendono
Vi invito pertanto a proseguire la discussione in pubblico
La soluzione del tuo problema contingente puo' (o potra') essere di 
aiuto ad altri che abbiano lo stesso problema e sono alla ricerca di una 
soluzione
 

 
 
 
Buongiorno omonimo.
 
Sono d'accordo con quanto esponi, però quando si viene snobbati per la 
poca conoscenza della materia, ricevendo risposte tecniche a me 
incomprensibili, nonostante abbia cercato per giorni prima di postare e 
soprattutto provato e riprovato, onestamente come posso proseguire? 
Grazie per l'attenzione e buona giornata
 
 
-- 
RoBort

 
 
 
su windows 10 pro non centra nulla
ITA o ENG neppure
office 2019 neppure
 
al massimo centra qualcosa il 32bit che uso o io con il 64bit che usa lui
 
ma non ho modo di verificarlo
 
 
mi pare strano che non vada con il classico:
 
#If VBA7 Then
     Private Declare PtrSafe 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
#Else
     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
 
con tutto il resto invariato
 
BFS

 BFS
 
 
 
 
Ero rimasto all'ultimo post di Alex che riporto
 
"Non vedi che basta cambiare il nome della chiamata API della funzione...?
 
Temo tu abbia lacune profonde per riuscire ad avere un minimo di 
autonomia su questi argomenti..."
 
 
Siccome non ho capito cosa e come cambiare il nome della chiamata API, 
mi sono bloccato.
 
-- 
RoBort


Ciao
Di che 'si viene snobbati' parli?
Hai postato il 03/04, e quel giorno ci sono 9 messaggi
Ed altri i giorni successivi
 
"..ricevendo risposte tecniche a me incomprensibili.."
Eh ma su questo mica possiamo farci niente, siamo in un ng tennigo, e 
con termini tennici si risponde, se pensi che la descrizione di una 
risposta sia troppo complicata basta dire 'non capisco'
E sperare che qualche volenteroso spieghera' in modo piu' semplice
 
Ho scritto 'sperare' volutamente, perche' non e' che puoi pretendere 
qualcosa, si domanda e si spera che qualcuno conosca la risposta e la 
scriva, e solitamente avviene cosi
 
Per ultimo, non ho ben capito il motivo per cui, sentendoti 'non 
risposto' hai pensato di rendere privata la conversazione
Mi pare un controsenso, perche' altri avrebbero potuto partecipare alla 
conversazione, ma facendo cosi' ti limiti ad interloquire con una sola 
persona


perchè @alex ha scritto
 
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
 
 
 
mentre nel mio codice la funzinoe si chiama apiShellExecute
per quello ti da errore di funzione non trovata
 
quindi o cambi la dichiarazione con
 
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 LongPtr
 
 
 
oppure cambi qui sostituitendo apiShellExecute con ShellExecute:
 
'First try ShellExecute
    lret = ShellExecute(hWndAccessApp, vbNullString, _
            stFile, vbNullString, vbNullString, lShowHow)
 
 
BFS
 

 persona
 
 
Ciao, assolutamente senza pretesa. Nel senso che non tiro nessuno per la 
giacca se non mi dà la risposta per filo e per segno come si suol dire. 
Si è capito il mio livello di conoscenza in Access... Ho pensato di 
rendere privata la conversazione perchè alla fine era un botta e 
risposta e non volevo "disturbare" il n.g. Perdonami se faccio questa 
considerazione che sfodero ogni tanto, ho l'impressione che determinati 
n.g. siano ad appannaggio di chi mastica già la materia.
 
-- 
RoBort


Hai ragione, è anche colpa mia, anzi soprattutto colpa mia poiché
conosco chiaramente le regole di comportamento del NG.
Ho accettato la privacy perché l'OP mi è parso timoroso, quasi
vergognoso, di continuare a proporre domande su risposte che non
comprendeva.
La conclusione, chiamiamo così l'esito positivo o
negativo della discussione, l'avrei conumque comunicata al NG.
 
Si tratta, mi pare, di un new entry... vediamo di non essere
troppo scrupolosi.
 
Bruno

 mi pare strano che non vada con il classico:
 
Secondo me la ragione sta nelle "gioie e delizie" delle API che io
ho sempre sborrito e mai usate (ho il terrore degli insetti!!!)
 
Ho cercato in Internet la soluzione: ce ne sono centinaia, ma nessuna
che mi funzioni (sarò sfigato).
 
Sono comunque riuscito a farne funzionare una (sia in Excel sia in
Access) attivando la Reference "Adobe Acrobat 10.0 Type Library"
ed avendo Acrobat Pro DC installato.
Col solo Acrobat installato la procedura non funzione, ora voglio
verificare cosa succede non avendo Acrobat installato ma la
Reference selezionata.
 
Dovrei però disinstallare Acrobat per poi reinstallarlo e questo è
un problema.
Debbo installare Windows e Office in un altro PC...
 
Bruno


Infatti funzionano perfettamente entrambe le soluzioni, provate su Win10 64bit, non sono affatto cose vecchie, ma sempre basta saperle usare.
 
Ovviamente quella che hai suggerito richiede il parametro lShowHow, obbligatorio che sicuramente non hanno impostato, ma funzionano perfettamente.
 
@Alex
 

 Application.FollowHyperlink percorso
 
Allego il tuo file:
 
https://1drv.ms/u/s!AvTaMfd5-b2o1FrpJaaW12OlzkOP?e=ef7r8n
 
 
nel quale ho creato una Form denominata OpenPDF.
Ci sono due pulsanti:
- quello con BFS apre i file PDF secondo la procedura fornita da BFS
  che dal tuo file funziona perfettamente mentre da altro mio file
  (ne ho provati 2) continua a dare i numeri;
- quello con FollowHyperlink col codice:
  FollowHyperLink "FilePath\FileName.pdf" apre regolarmente il PDF
  utilizzando il mio Acrobat DC.
  Sicuramente userà Acrobat Reader DC se quello trova installato.
 
  Se scelgo come default app EDGE per aprire i PDF, FollowHyperlink
  non ubbidisce, continua ad aprirli con Acrobat DC, mentre
  interviene EDGE se il PDF l'apro con DblClick.
 
Ti è chiaro dove sbagliavi? davi in pasto a FollowHyperlink la
directory che contiene i PDF, non lo specifico PDF che volevi aprire.
 
In Excel la sintassi cambia in:
ThisWorkbook.Followhyperlink "Filepath\Filename"
 
Bruno

 Bruno
 
 
 
Chiedo scusa Bruno ed a tutto il n.g., ma c'è qualcosa che non mi 
torna... Ad ogni record che inserisco inerente ad una spesa, allego il 
relativo scontrino fiscale o fattura che sia. Ho provato con un record 
dove nel campo denominato ALLEGATO c'è la dicitura Easydent 1 apr 
21.pdf. Col doppio click come l'avevo impostato riuscivo ad aprire la 
directory dove ci sono i file pdf in questione. Ho provato ad impostare 
il metodo di BFS ma non succede nulla e credo di sapere il motivo solo 
che non saprei come rimediare. Nell'esempio che hai allegato, cliccando 
sul pulsante BFS relativo alla form OpenPDF, la riga di comando è 
questa; Call fHandleFile("D:\RISPOSTA 185.pdf", 1)
 
Nel mio caso devo modificare quello che c'è tra parentesi tonda, ed ho 
provato non sapendo come fare, inserendo il nome del campo, nonchè 
Allto, prima senza virgolette, poi con le virgolette. Non ottengo nulla, 
dove dovrebbe aprirsi il file Easydent 1 apr 21.pdf. Sinceramente non so 
dove andare a parere. Ora provo a cambiare il path al tuo esempio in 
quanto in D:\ non ho nessun file pdf, per rendermi conto del 
funzionamento sempre se riesco.
 
 
-- 
RoBort


se la tua form contiene il nome dell'allegato (attenzione solo il nome e 
non l'intero percorso) in una casella di testo chiamata esempio MioAllegato
conterrà quindi il testo: Easydent 1 apr 21.pdf
 
il pulsante che hai nella form per aprire l'allegato sarà qualcosa tipo
Call fHandleFile("E:\GENERAL BACKUP\GESTIONE FAMIGLIA\Allegati\" & 
Me.MioAllegato ,1)
 
in pratica alla funzione verrà passato l'intero percorso E:\GENERAL 
BACKUP\GESTIONE FAMIGLIA\Allegati\Easydent 1 apr 21.pdf
 
se invece la casella di testo contiene l'intero percorso ti basta :
 
Call fHandleFile(Me.MioAllegato ,1)
 
BFS
 
 
 
 
 
 
 
 

 BFS
 
Non so come ringraziarti, ora funziona! Ringrazio Bruno ed Alex. Ragà, 
ho tutta la buona volontà per apprendere, sto seguendo un corso in 
Kindle di programmazione VBA per Access 2019 di Alessandra Salvaggio. 
Non è semplice da autodidatta capire quali sono i testi da seguire, 
cercare dritte per il web prima di chiedere al n.g. etc. etc. Comunque 
per l'applicazione proposta da BFS non è frutto di una semplice 
conoscenza del VBA... Non pretendo di fare la maturità senza aver fatto 
la quinta elementare... Non credevo che per aprire un allegato si 
andassi incontro ad un livello simile di programmazione. Ho un altro 
quesito da porre sempre per la medesima applicazione, aprirò un altro 
post. Grazie.
 
 
-- 
RoBort


Ti avevo chiesto se funzionava da te, con Acrobar Reader installato,
quell'unica riga di codice formata con FollowHyperlink.
In caso positivo quelle 30-40 righe di codice della formula
fornita da BFS sono soltanto uno sciupio di codice.
Salvo che, pur avendo il Reader installato, tu non voglia...
te lo faccio dire da BFS.
 
Bruno