Newsgroup: it.comp.appl.access
Titolo: Problema nel richiamare la libreria Shell32.dll in Access 2010 in Win 7 e Win 8

Ciao a tutti e grazie in anticipo per le risposte che mi darete.
 
Premetto che la problematica che riporto di seguito l'ho riscontrata sia utilizzando Access 2010 con Win 7 che con Win 8
 
Nell'evento click di un bottom ho inserito il seguente codice per stampare un PDF (conoscendone il percorso) senza doverlo aprire:
Dim myPath As String
myPath = "C:\Folder"
ShellExecute Me.hWnd, "print", myPath & "\" & Me.NomeFile, "", "", SW_HIDE.
 
Quando scateno l'evento mi esce l'errore di Runtime 453 : "IMPOSSIBILE TROVARE IL PUNTO D'INGRESSO SHELLEXECUTE DELLA DLL IN SHELL32.DLL."
 
Nel modulo del Form dove ho inserito il Bottom ho caricato le seguenti dichiarazioni :
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" (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
Private Const SW_HIDE = 0
 
Sono andato nei riferimenti ed ho verificato l'attivazione dei seguenti riferimenti:
a)Visual Basic for Application
b) Microsoft Access 14.0 Object Library
c) Microsoft Office 14.0 Object Library
d) OLE Automation
e) Microsoft Visual Basic for Application Extensibility 5.3
 
A questo punto ho provato lo stesso DB su un notebook dove ho montato Access 2010 con  Windows 8. Ho effettuato le stesse verifiche, ma non è cambiato nulla.
 
Come posso risolvere il "problema"???
Grazie ancora....

I Riferimenti ovviamente NON servono a nulla con le API...
Tuttavia se avessi la Versione Windows ed Office a 64Bit... potresti avere un problemino..!
 
Da Così:
Private Declare Function ShellExecute Lib "shell32.dll" (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 
 
A Così:
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
 
@Alex

Ciao Alex e grazie per la risposta.
L'Office installato è a 32 bit, mentre Windows (7 e 8 ) è a 64.
Ho inserito le "dichiarazioni" che mi hai postato per i 64 bit e il messaggio di errore non mi esce più, ma non mi stampa nulla!
Da cosa può dipendere???? 
Grazie ancora.
 
NB:Senza volerlo ho pubblicato ancora il post iniziale.Sarà l'ora"tarda...."

Prova ad usare questa:
 
Option Compare Database
Option Explicit
 
Private Declare Function ShellExecute _
  Lib "shell32.dll" _
  Alias "ShellExecuteA" ( _
    ByVal hWnd As Long, ByVal lpszOp As String, _
    ByVal lpszFile As String, _
    ByVal lpszParams As String, _
    ByVal lpszDir As String, _
    ByVal FsShowCmd As Long _
  ) As Long
 
Private Const SE_ERR_FNF = 2&
Private Const SE_ERR_PNF = 3&
Private Const SE_ERR_ACCESSDENIED = 5&
Private Const SE_ERR_OOM = 8&
Private Const SE_ERR_DLLNOTFOUND = 32&
Private Const SE_ERR_SHARE = 26&
Private Const SE_ERR_ASSOCINCOMPLETE = 27&
Private Const SE_ERR_DDETIMEOUT = 28&
Private Const SE_ERR_DDEFAIL = 29&
Private Const SE_ERR_DDEBUSY = 30&
Private Const SE_ERR_NOASSOC = 31&
Private Const SE_ERR_BAD_FORMAT = 11&
 
Private Const SW_HIDE = 0
Private Const SW_SHOWNORMAL = 1
 
Public Function ExecuteFile(DocName As String, _
    Optional FileOp As String = "open") As Boolean
Dim lRetVal As Long, sMsg As String
 lRetVal = ShellExecute(0&, FileOp, DocName, _
              vbNullString, vbNullString, _
              IIf(FileOp = "print", SW_HIDE, SW_SHOWNORMAL))
  If lRetVal <= 32 Then
    ExecuteFile = False
    'There was an error
    Select Case lRetVal
      Case SE_ERR_FNF
        sMsg = "File not found"
      Case SE_ERR_PNF
        sMsg = "Path not found"
      Case SE_ERR_ACCESSDENIED
        sMsg = "Access denied"
      Case SE_ERR_OOM
        sMsg = "Out of memory"
      Case SE_ERR_DLLNOTFOUND
        sMsg = "DLL not found"
      Case SE_ERR_SHARE
        sMsg = "A sharing violation occurred"
      Case SE_ERR_ASSOCINCOMPLETE
        sMsg = "Incomplete or invalid file association"
      Case SE_ERR_DDETIMEOUT
        sMsg = "DDE Time out"
      Case SE_ERR_DDEFAIL
        sMsg = "DDE transaction failed"
      Case SE_ERR_DDEBUSY
        sMsg = "DDE busy"
      Case SE_ERR_NOASSOC
        sMsg = "No association for file extension"
      Case SE_ERR_BAD_FORMAT
        sMsg = "Invalid EXE file or error in EXE image"
      Case Else
        sMsg = "Unknown error"
    End Select
    MsgBox "Cannot " & FileOp & " " & DocName _
        & vbCrLf & vbCrLf & sMsg, vbExclamation
  Else
    ExecuteFile = True
  End If
End Function
 
 
Da richiamare così:
If ExecuteFile("C:\Documents\Mine.doc", "print") then
   MsgBox "Stampato Correttamente"
End If
 
NOn cambia NULLA ma almeno hai eventualmente un messaggio coerente con l'indicazione del perchè fallisce....!
 
Fai attenzione se vuoi ad usare la Formattazione Condizionata per scrivere codice che possa funzionare sia in 32bit che 64bit...
 
#IF VBA7 Then
   #IF Win64 Then
 
   #ELSEIF Win32 THEN
 
   #ELSE   
 
   #END IF
 
#ELSEIF VBA6 THEN
 
 
#END IF
 
Buon Lavoro.
@Alex
Oppure

Meglio questa non avevo convertito in 64Bit:
 
Option Compare Database
Option Explicit
 
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
 
Private Const SE_ERR_FNF = 2&
Private Const SE_ERR_PNF = 3&
Private Const SE_ERR_ACCESSDENIED = 5&
Private Const SE_ERR_OOM = 8&
Private Const SE_ERR_DLLNOTFOUND = 32&
Private Const SE_ERR_SHARE = 26&
Private Const SE_ERR_ASSOCINCOMPLETE = 27&
Private Const SE_ERR_DDETIMEOUT = 28&
Private Const SE_ERR_DDEFAIL = 29&
Private Const SE_ERR_DDEBUSY = 30&
Private Const SE_ERR_NOASSOC = 31&
Private Const SE_ERR_BAD_FORMAT = 11&
 
Private Const SW_HIDE = 0
Private Const SW_SHOWNORMAL = 1
 
Public Function ExecuteFile(DocName As String, Optional FileOp As String = "open") As Boolean
	Dim lRetVal 	As LongPtr
	Dim sMsg 	As String
 
 lRetVal = ShellExecute(Me.hWnd, FileOp, DocName, _

@Alex


Ciao Alex
Scusa per il ritardo nella risposta, ma ho potuto provare il "tutto" solo ora.
Ho inserito il codice che mi hai postato ma l'evento fallisce ancora.
Richiamandolo con la struttura If mi da l'indicazione file non trovato.In realtà il file esiste ed è correttamente salvato nel folder inserito nel path.
Può dipendere dal fatto che io non inserisca il nome del file ma lo faccia intercettare direttamente dal campo Nomefile????
Ti riscrivo il codice sull'evento click del bottom :
Dim myPath As String
myPath = "C:\Folder"
ShellExecute Me.hwnd, "print", myPath & "\" & Me.NomeFile, "", "", SW_HIDE
Aspetto un tuo gentile riscontro.
Dino