Newsgroup: it.comp.appl.access
Titolo: Cartella di Office

Salva a tutti,
ho la necessità, tramite VBA, di ricavare la cartella d'installazione di Microsoft Office, che varia a seconda della versione.
Io sono riuscito a ricavare (tramite API) le cartelle di Windows, Temp, dell'utente, ma non ho trovato niente che riguardi Office.
Esiste tale possibilità? La necessità nasce dal fatto che devo avviare un file di Word per effettuare una stampa unione da una query di Access; il file possiede una macro che si avvia all'apertura.
Attualmente agisco così:
 
Esporto la Query in un file Excel
 
poi avvio Word con la macro:
 
strDoc = "C:\Program Files (x86)\Microsoft Office\Office15\Winword.exe /Unisci " & "NomeMiaTabella"
Call Shell(strDoc, vbMaximizedFocus)
 
dove "Unisci" è il nome della macro di Word che avvia la stampa unione e "NomeMiaTabella" è il file Excel comprensivo di percorso.
 
Purtroppo non è così scontato che i futuri utenti dell'applicativo usino tutti la stessa versione di Office, per cui vorrei parametrizzare tale informazione.
 
Uso Word 2013 su Windows 10.
 
Grazie
Franco

Per MsAccess.Exe puoi usare questa:
SysCmd(acSysCmdAccessDir)
 
Se ti fidi sia anche il Path del Pacchetto Office, è sufficiente...
 
Personalmente se volessi sapere il PATH di Word o di qualsiasi altro EXE, chiamerei l'API FindExecutable per non avere dubbi.
 
Esempio:
 
Option Compare Database
Option Explicit
 
#If Win64 Then
    Declare PtrSafe Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" _
        (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
#Else
    Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" _
        (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
#End If
 
Const SYS_OUT_OF_MEM        As Long = &H0
Const ERROR_FILE_NOT_FOUND  As Long = &H2
Const ERROR_PATH_NOT_FOUND  As Long = &H3
Const ERROR_BAD_FORMAT      As Long = &HB
Const NO_ASSOC_FILE         As Long = &H1F
Const MIN_SUCCESS_LNG       As Long = &H20
Const MAX_PATH              As Long = &H104
 
Const USR_NULL              As String = "NULL"
Const S_DIR                 As String = "C:\" '// Change as required (drive that .exe will be on)
 
 
Function GetInstallDirectory(ByVal usProgName As String) As String
 
    Dim fRetPath As String * MAX_PATH
    Dim fRetLng As Long
 
    fRetLng = FindExecutable(usProgName, S_DIR, fRetPath)
 
    If fRetLng >= MIN_SUCCESS_LNG Then
        GetInstallDirectory = Left$(Trim$(fRetPath), InStrRev(Trim$(fRetPath), "\"))
    End If
 
End Function
 
 
Da chiamare così:
GetInstallDirectory("Winword.exe")
 
@Alex

Grazie Alex,
il primo metodo funziona.
Ho provato anche il secondo, ma mi restituisce un errore:
"MAX_PATH" variabile non definita.
E' sicuramente più completo e mi piacerebbe usarlo.
I miei riferimenti sono:
Microsoft Office 15.0
Microsoft Forms 2.0
Microsoft Excel 15.0
Microsoft Word 15.0
Microsoft ADO 2.8
Forse manca qualche altro riferimento?
 
Saluti
Franco


Secondo me ti sei perso un pezzo perchè c'è... ed il codice funziona.
 
Const MAX_PATH              As Long = &H104
 
@Alex

Ciao Alex,
hai ragione tu, avevo sbagliato un'impostazione: io ho un modulo dove raggruppo tutte le funzioni API, così ho salvato quella suggerita da te nel modulo predetto, mentre la chiamante in un altro. Però (non ridere) ho lasciato tutte le dichiarazioni delle costanti insieme alla funzione API anziché all'altra. Sono una capra!
Grazie ancora
Franco