CIUFFO
21-01-2004, 16:10
Ho scritto del codice in Access 2004 (vedi sotto) che utilizzo per controllare se un file di Excel 2004 (“CAMBI.xls”) è aperto e lo apre non non lo è, utilizzando le API.
Il mio codice funzionava bene col 98, ma con XP mi dà un problema: aprendo altri file di Excel quando spengo il Pc, XP non riesce a chiudere “CAMBI.xls”, infatti aprendo il Task Manager ho notato che Excel.exe compare 2 volte.
Come posso aprire “CAMBI.xls” da Access utilizzando l’automazione invece delle API?
Ho provato con l’automazione (vedi sotto) ma non ho molta dimestichezza, “CAMBI.xls” lo apre (sembra!) visualizzando per un attimo solo l’UserForm1 che “CAMBI.xls” lancia con .Show all’apertura, poi si chiude sigh!(è un form utilizzato come casella di dialogo personalizzata che contiene un pulsante che esegue delle operazioni poi riduce ad icona il foglio), io invece vorrei visualizzare il foglio compresa la barra degli strumenti.
---------------------------------------------------------------------------------------------------------------
CON LE API
IN UN MODULO ( CAMBI.xls è nella stessa cartella che contiene il DB )
Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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
Const SW_SHOWNORMAL = 1
Dim path, fs, s, h
Dim hwnd As Long
Sub MyEXCEL()
Set fs = CreateObject("Scripting.FileSystemObject")
h = CurrentDb.Properties("name").Value
s = fs.GetparentfolderName(h)
path = s + "\cambi.xls"
hwnd = FindWindow(vbNullString, "Microsoft Excel - CAMBI.xls")
If hwnd = 0 Then ' 0 significa che il file di Excel non è in esecuzione.
ShellExecute hwnd, vbNullString, path, vbNullString, vbNullString, SW_SHOWNORMAL
Else
Exit Sub
End If
End Sub
IN UNA MASCHERA
Private Sub Comando1_Click()
MyEXCEL 'vedi Modulo1
End Sub
--------------------------------------------------------------------------------------------------------------
CON L’AUTOMAZIONE
IN UNA MASCHERA ( CAMBI.xls è nella stessa cartella che contiene il DB )
Private Sub Comando2_Click()
Dim path, fs, s, h
Dim xl As Object
Set xl = CreateObject("Excel.sheet")
Set fs = CreateObject("Scripting.FileSystemObject")
h = CurrentDb.Properties("name").Value
s = fs.GetparentfolderName(h)
path = s + "\cambi.xls"
xl.Application.Workbooks.Open path
End Sub
Il mio codice funzionava bene col 98, ma con XP mi dà un problema: aprendo altri file di Excel quando spengo il Pc, XP non riesce a chiudere “CAMBI.xls”, infatti aprendo il Task Manager ho notato che Excel.exe compare 2 volte.
Come posso aprire “CAMBI.xls” da Access utilizzando l’automazione invece delle API?
Ho provato con l’automazione (vedi sotto) ma non ho molta dimestichezza, “CAMBI.xls” lo apre (sembra!) visualizzando per un attimo solo l’UserForm1 che “CAMBI.xls” lancia con .Show all’apertura, poi si chiude sigh!(è un form utilizzato come casella di dialogo personalizzata che contiene un pulsante che esegue delle operazioni poi riduce ad icona il foglio), io invece vorrei visualizzare il foglio compresa la barra degli strumenti.
---------------------------------------------------------------------------------------------------------------
CON LE API
IN UN MODULO ( CAMBI.xls è nella stessa cartella che contiene il DB )
Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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
Const SW_SHOWNORMAL = 1
Dim path, fs, s, h
Dim hwnd As Long
Sub MyEXCEL()
Set fs = CreateObject("Scripting.FileSystemObject")
h = CurrentDb.Properties("name").Value
s = fs.GetparentfolderName(h)
path = s + "\cambi.xls"
hwnd = FindWindow(vbNullString, "Microsoft Excel - CAMBI.xls")
If hwnd = 0 Then ' 0 significa che il file di Excel non è in esecuzione.
ShellExecute hwnd, vbNullString, path, vbNullString, vbNullString, SW_SHOWNORMAL
Else
Exit Sub
End If
End Sub
IN UNA MASCHERA
Private Sub Comando1_Click()
MyEXCEL 'vedi Modulo1
End Sub
--------------------------------------------------------------------------------------------------------------
CON L’AUTOMAZIONE
IN UNA MASCHERA ( CAMBI.xls è nella stessa cartella che contiene il DB )
Private Sub Comando2_Click()
Dim path, fs, s, h
Dim xl As Object
Set xl = CreateObject("Excel.sheet")
Set fs = CreateObject("Scripting.FileSystemObject")
h = CurrentDb.Properties("name").Value
s = fs.GetparentfolderName(h)
path = s + "\cambi.xls"
xl.Application.Workbooks.Open path
End Sub