2012-05-17 19 views
8

Ho cercato di risolvere questo problema, e sembra che non riesca a trovare la soluzione al problema da nessuna parte. Ecco la prima parte: VBA Shell command always returns "File Not Found" In questa domanda, non trovava l'applicazione nella cartella% APPDATA% per qualche strano motivo, probabilmente un'impostazione di sicurezza.VBA: Come eseguire un'altra applicazione da MS Access

Da allora ho spostato lo strumento di importazione nella stessa directory in cui ho archiviato il database, con la minima speranza di farlo funzionare correttamente.

Il mio obiettivo è fare clic su un pulsante in MS Access e farlo eseguire direttamente il mio strumento di importazione. In questo momento, ho aperto la cartella che contiene lo strumento. Funziona sul mio computer di sviluppo che ha privilegi di amministratore, ma non funziona su altri computer senza privilegi di amministratore. Il codice in questo momento sembra qualcosa di simile al seguente:

Dim hProcess as Long 
Dim myPath as String 
Dim ex as String 

ex = "C:\WINDOWS\explorer.exe " 
myPath = Environ("ProgramFiles(x86)") & "\mytool\" 

hProcess = Shell(ex & myPath, vbNormalFocus) 

In questo modo la cartella che contiene il file da aprire, ma solo su account computer che hanno i privilegi di amministratore. Quando si esegue questo su un account macchina che ha meno di privilegi completi, semplicemente non fa nulla.

Ho anche provato la seguente:

Dim hProcess As Long 
Dim myPath as String 

myPath = Environ("ProgramFiles(x86)") & "\mytool\mytool.exe" 
hProcess = Shell(myPath, vbNormalFocus) 

Questa sezione "sembra" funzionare nel senso che carica l'applicazione "mytool.exe" quando guardo il gestore del processo. Tuttavia, dopo alcuni secondi (forse 20), viene visualizzata una finestra di dialogo che informa che l'applicazione "mytool.exe" ha smesso di funzionare.

Una cosa da notare qui è che ho i privilegi di amministratore sul mio computer di sviluppo, ma ho tutti i privilegi sul mio computer di casa. Sulla mia macchina di casa, questo secondo codice funziona senza alcun problema. Alla mia macchina di sviluppo, si blocca, mentre su una macchina utente con restrizioni, non fa nulla.

Esistono suggerimenti su come aprire questa applicazione da MS Access mentre si utilizzano privilegi meno di amministratore? O per eseguire direttamente l'applicazione o per lo meno aprire la cartella in cui risiede la suddetta applicazione.

Grazie!

P.S. Ho provato sia il codice ShellAndWait che il codice RunApplication trovati su stackoverflow, nessuno dei quali funziona in questa istanza.

risposta

1

Basta scherzare con http://www.mombu.com/microsoft/scripting-wsh/t-vista-uac-problem-with-wscriptshell-run-method-1508617.html. Ho provato questo su Windows 7 home PC.

Set objShell = CreateObject("Shell.Application") 
myPath = Environ("ProgramFiles(x86)") & "\mytool" 
Set objFolder = objShell.Namespace(myPath) 
Set objFolderItem = objFolder.ParseName("mytool.exe") 
objFolderItem.InvokeVerb "runas" 

Potrebbe darti qualche idea.

+0

Sarà questo lavoro con VBA? So che molte istruzioni VB nel set non hanno controparti in VBA. –

+0

L'ho provato in VBA, ma non ho idea se funzionerà nella tua situazione. Tutto quello che posso dire è che funzionava in VBA sul mio PC di casa. – Fionnuala

+0

Viene visualizzato un errore di "Metodo o Datamember non trovato" nel metodo objShell.Namespace(). Inoltre, non so cosa dimensionare objFolder e objFolderItem come. Attualmente, sono quotati come varianti. –

0

check

Shell szFileName, vbNormalFocus 

con qualche altro eseguibile. Può essere un problema con il tuo strumento.

3

Io uso sempre ShellExecute dall'API di Windows quando ho bisogno di eseguire qualcosa in VBA.
Per quanto ne so, funziona anche su macchine senza privilegi completi.

Esempio:

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 lpnShowCmd As Long) As Long 


Public Sub ShellEx(ByVal Path As String, Optional ByVal Parameters As String, Optional ByVal HideWindow As Boolean) 

    If Dir(Path) > "" Then 
     ShellExecute 0, "open", Path, Parameters, "", IIf(HideWindow, 0, 1) 
    End If 

End Sub 

Ora è possibile chiamare ShellEx per eseguire praticamente qualsiasi cosa:

'run executable 
ShellEx "c:\mytool.exe" 

'open file with default app 
ShellEx "c:\someimage.jpg" 

'open explorer window 
ShellEx "c:\" 

Nota che ShellEx ha due parametri opzionali pure.
non ho mostrato questo negli esempi precedenti, ma è possibile:

  • parametri passa eseguibili
  • nascondere la finestra della chiamata eseguibile
Problemi correlati