General

6.21 Compattare l'mdb in uso.
  Federico Luciani
(D)
Come posso compattare l'mdb in uso quando senza usare il Sendkey?

(R)
Ho preparato questo script che se eseguito da un mdb, lo chiude, lo compatta e lo riapre.
Prima di eseguire lo script e' consigliabile chiudere tutte le forms.

Per eseguirlo basta usare, da access, la shell in questo modo:
  Dim strPath As String
  strPath = "wscript.exe " & "C:\Temp\Compact.vbs " & Chr$(34) & CurrentDb.Name & Chr$(34)
  Call Shell(strPath, vbNormalFocus)
attenzione ad usare il giusto path per Compact.vbs

Naturalmente per funzionare, nel pc deve essere presente Windows Script Host! Per windows 98 seconda edizione, non ci sono problemi, per gli altri os non saprei; magari controllate che sul pc ci sia wscript.exe, altrimenti e' possibile scaricarlo dal sito MS.

Attenzione, lo script, cosi' come e', non funziona con gli mdb protetti da password; invece funziona benissimo se si usa la protezione a livello utente.

Copiate il codice seguente in un file di testo e salvatelo come Compact.vbs
'*******************************************************************
'start code
'*******************************************************************
'Nome:        Compact.vbs
'Descrizione: compatta e riapre l'mdb in uso
'Autore:      Federico Luciani
'Creato:      10/11/2000
'Utilizzo:    dall'mdb eseguire:
'   Dim strPath As String
'   strPath = "wscript.exe " & "C:\Temp\Compact.vbs " & Chr$(34) & CurrentDb.Name & Chr$(34)
'   Call Shell(strPath, vbNormalFocus)
'
'*******************************************************************

Set objArgs = WScript.Arguments
Call Init()

Dim objMDB
Dim objFSO
Dim strMdbFile
Dim strTmpFile

'nome e path dell'mdb passato come argomento allo script
strMdbFile = objArgs(0)
Set objFSO = CreateObject("Scripting.FileSystemObject")
'genera un nome file temporaneo
strTmpFile = objFSO.GetTempName
strTmpFile = Left(strMdbFile, InstrRev(strMdbFile, "\")) & strTmpFile
'si collega alla sessione access aperta
Set objMDB = WScript.GetObject(strMdbFile)
'minimizza la finestra di access
objMDB.RunCommand 11
'chiude l'mdb in uso
objMDB.CloseCurrentDatabase
'compatta l'mdb in un file temporaneo
objMDB.Dbengine.CompactDatabase strMdbFile, strTmpFile
'Msgbox strMdbFile & " -> " & strTmpFile
'elimina l'mdb originale
objFSO.DeleteFile(strMdbFile)
'copia il file tempraneo nel'mdb originale
objFSO.CopyFile strTmpFile, strMdbFile
'elimina il file temporaneo
objFSO.DeleteFile(strTmpFile)
'riapre l'mdb compattato
objMDB.OpenCurrentDatabase strMdbFile
'maximizza la finestra di access
objMDB.RunCommand 10
Set objFSO = nothing
Set objMDB = nothing

'*******************************************************************
'Controlla che il parametro sia un file mdb
'*******************************************************************
Sub Init()
 'controlla che l'argomento sia un mdb
  If objArgs.Count  < 1 Then WScript.Quit
  If Right(objArgs(0),4) <> ".mdb" Then
    Msgbox "Il file selezionato non e' un mdb.",  16, "Errore!"
    WScript.Quit
  End If
End Sub
'*******************************************************************
'end code
'*******************************************************************


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.