Uso essa sem problemas:
'Iniciamos o tratamento de erros.
'Se algo der errado, vamos para a linha indicada.
On Error GoTo ErroCompactar
'Declaramos as variáveis
Dim JR As New JRO.JetEngine
Dim S_DbNome As String, S_DbTemp As String
S_DbNome = C:OndeEstaSuaBaseDeDados '"C:BaseDeDadosBD.mdb"
S_DbTemp = App.Path & "BDTemporario.mdb"
'Descobrimos se o Arquivo Temp existe...
If Dir$(S_DbTemp) <> "" Then
'Se existe, deletamos (vide *Kill lá em baixo)
Call Kill(S_DbTemp)
End If
'Compactamos o banco de dados com o
'nome de Arquivo Temp
JR.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & S_DbNome & ";", _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & S_DbTemp & ";Jet." & _
"OLEDB:Engine Type = 5;"
'Este "Engine Type" no final indica a versão do Access que está
'sendo usada. Veja os valores e as versões correspondentes:
'5 (Defaut) para Access 2000
'4 para Access 97
'3 para Access 95/6
'2 para Access 2
'1 para Access 1
'Se Arquivo Original existir...
If Dir$(S_DbNome) <> "" Then
'deleta
Call Kill(S_DbNome)
End If
'Aqui, vc poderia usar a instrução
'Name (vide *Name lá em baixo)
JR.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & S_DbTemp & ";", _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & S_DbNome & ";Jet." & _
"OLEDB:Engine Type = 5;"
'Se chegamos até aqui, avisa ao usuário que
'tudo correu bem...
' MsgBox "Compactação do Banco de Dados " & _
S_DbNome & " executada com sucesso.", _
vbOKOnly + vbInformation, "Compactação"
Set JR = Nothing
Call Kill(S_DbTemp)
Exit Sub
ErroCompactar:
'Se caiu aqui, é porque houve erro. Avise ao usuário.
MsgBox "Houve um erro inesperado ao compactar a " & _
"Base de Dados. Pode haver usuários conectados a ela.", vbOKOnly + vbInformation, _
"Compactação"
'Limpa o erro. Não é obrigatório mais é de bom
'costume fazer.
Err.Clear