Non usando Access ho collaudato il codice in una macro di Word, ottenendo il killaggio di excel.
Prova a modificare la riga in
- Codice: Seleziona tutto
myPid = Shell("CMD /C TASKKILL /IM excel.exe /F")
L' opzione /F causa un "forzaggio" del kill, utile in casi di applicazione effettivamente bloccata. Poi, se ancora non e' risolto, lavora passo-passo e verifica il contenuto di myPid dopo l' esecuzione della riga: dovrebbe restituirti un numero intero oppure un Errore, dicci quale e' il tuo caso.
Infine una constatazione: la documentazione in rete descrive una abbondanza di situazioni in cui un processo non si riesce a killare (fai una google search con la stringa "taskkill doesn't kill process", senza virgolette). Saranno quindi necessarie due cose:
1) il Do /Loop che segue l' On Erro Goto 0 deve includer anche una uscita per timeout; questo era fatto dalla riga
DoEvents: If Timer > (myT2 + 5) Or Timer < myT2 Then Exit Do 'che hai omesso nel tuo codice e che quindi ti raccomando di ripristinare.
2) se la presenza di un processo impiccato (che non si riesce a killare nemmeno con l' opzione Forza) e' bloccante per la tua macro allora e' bene inserire in coda al codice che dovrebbe aver killato quel processo un controllo che effettivamente il processo non sia piu' presente, e se invece lo e' abortire la macro con suggerimento all' utente di chiudere i file eventualmente aperti prima di riprovare.
TUTTAVIA....
Sposo le considerazioni di Flash (vedi sopra).
Rileggendo la tua discussione, il problema non e' l' avere excel aperto, quanto eventualmente che sia gia' aperto il file che la tua macro deve "lavorare".
Pertanto il mio suggerimento e' di testare se un Excel e' gia' aperto; se No lo crei e procedi. Se invece Si allora controlli se il tuo fatidico file e' aperto in quella sessione excel; se Si lo chiudi, e poi scegli se creare una nuova istanza di Excel (a), oppure agganciarti all' istanza corrente (b).
Tutto questo (ipotesi b) potrebbe corrispondere a un codice come questo:
- Codice: Seleziona tutto
Dim myEx As Object
On Error Resume Next
'tentativo di agganciare applicazione excel
Set myEx = GetObject(, "excel.application")
On Error GoTo 0
'il file da non avere aperto
myCriticalFile = "QUESTO_FILE.xls" '<<< Il nome corretto del file
'Verifica se Excel aperto & file critico presente
If Not myEx Is Nothing Then
myEx.Visible = True
'cerco il file:
For I = 1 To myEx.Workbooks.Count
If myEx.Workbooks(I).Name = myCriticalFile Then
myEx.Workbooks(I).Close savechanges:=False
Exit For
End If
Next I
Else
'non c'e', creo l' applicazione
Set myEx = CreateObject("Excel.Application")
myEx.Visible = True
End If
'
'procedi con la tua macro
Ciao