2009-11-06 69 views

risposta

6

ne dite:

Dim appAccess As Object 
''acTable=0 

Set appAccess = CreateObject("Access.Application") 
appAccess.OpenCurrentDatabase "C:\Docs\LTD.mdb" 

appAccess.DoCmd.Rename "NewTableName", 0, "OldTableName" 

appAccess.Quit 
Set appAccess = Nothing 
+1

Sarebbe bello se il tuo codice fosse ripulito da solo, non credi? –

+2

@David W Fenton Ho avuto l'impressione che questo fosse un forum in cui le idee dovrebbero essere sufficienti, per la maggior parte e che anche le risposte su una sola riga sarebbero sufficienti. – Fionnuala

+1

@David W Fenton se pensi davvero che sia così importante, modifica la risposta e correggi te stesso –

9

Ecco un esempio di uno dei miei programmi (che è ancora in uso quotidiano in azienda). È preso da un programma vb6, ma viene eseguito anche in vba. L'ho provato per essere sicuro.

In questo esempio abbiamo una tabella temporanea con il nome "mytable_tmp", che viene aggiornato con nuovi dati e vorremmo salvare questo nella tabella "mytable" sostituendolo.

dal vostro editor di Excel VBA è necessario impostare un riferimento alle seguenti due librerie dei tipi:

  • "Microsoft ActiveX Data Objects 2.8 Library"
  • "Microsoft ADO Ext 2,8 per DDL e. Sicurezza "

Il primo è per lo spazio dei nomi ADODB e il secondo per lo spazio dei nomi ADOX. (Forse hai una versione precedente di MDAC come 2.5 o precedenti, anche questo dovrebbe funzionare).

Private Sub RenameTable() 
Dim cn   As New ADODB.Connection 
Dim cat  As ADOX.Catalog 
Const sDBFile As String = "c:\et\dbtest.mdb" 

    On Error GoTo ErrH 

    With cn 
     .Provider = "Microsoft.Jet.OLEDB.4.0" 
     .Mode = adModeShareDenyNone 
     .Properties("User ID") = "admin" 
     .Properties("Password") = "" 
     .Open sDBFile 
    End With 

    Set cat = New ADOX.Catalog 
    cat.ActiveConnection = cn 
    cat.Tables("mytable").Name = "mytable_old" 
    cat.Tables("mytable_tmp").Name = "mytable" 
    cat.Tables("mytable_old").Name = "mytable_tmp" 

ExitHere: 
    If Not cn Is Nothing Then 
     If Not cn.State = adStateClosed Then cn.Close 
     Set cn = Nothing 
    End If 
    Set cat = Nothing 
    Exit Sub 

ErrH: 
Dim sMsg As String 
    sMsg = "Massive problem over here man." 
    sMsg = sMsg & vbCrLf & "Description : " & cn.Errors.Item(0).Description 
    MsgBox sMsg, vbExclamation 
    GoTo ExitHere 
End Sub 

Sperando di essere utile.

+1

Mi sembra che l'unico valore di questo codice esteso lungo le tre righe di codice di Remou riguardi quando non hai installato Access . –

+0

Offre anche la possibilità di fare più di una semplice copia nello stesso codice - e chissà, l'utente di Excel potrebbe non avere accesso ad Access. Comunque, in generale, devo riconoscere che l'aspetto di Remou è più utilizzabile. – mavnn

+0

;) Come osi includere la gestione degli errori e i messaggi degli utenti. E che cos'è tutta questa formattazione! (Molto più divertente se lo fai nella voce di Stewie). +1 – JeffO

0

Ecco una piccola alternativa al codice di Remou sopra. Uso la funzione shell per aprire il database di cui ho bisogno e quindi la funzione GetObject per accedere alle sue proprietà e ai suoi metodi. I vantaggi di farlo in questo modo sono 1) È possibile selezionare il modo in cui si aprirà la finestra per l'applicazione Access. Per i miei scopi, voglio che sia nascosto. 2) Ho installato sia Access 2003 che 2007 e il metodo di Remou causa l'apertura del 2003, che non desidero. Il mio metodo (penso) apre il file in qualsiasi versione di Access che Windows avrebbe usato per aprirlo se l'utente avesse fatto doppio clic su di esso.

Lo svantaggio è che è necessario assicurarsi che il database sia aperto prima di tentare di manipolarlo. Io uso una subroutine di attesa semplice per affrontare questo, ma ci sono cose più sofisticate che puoi fare.

Sub Rename() 
    Dim ObjAccess As Object, MDB_Address As String, TaskID As Integer 

    MDB_Address = "C:\example.mdb" 

    TaskID = Shell("msaccess.exe " & Chr(34) & MDB_Address & Chr(34), vbHide) 
    Call Wait 
    Set ObjAccess = GetObject(MDB_Address) 
    ObjAccess.DoCmd.Rename "NewTableName", 0, "OldTableName" 
    ObjAccess.Quit 
    Set ObjAccess = Nothing 

End Sub 

Sub Wait() 

    Dim nHour As Date, nMinute As Date, nSecond As Date, waitTime As Date 

    nHour = Hour(Now()) 
    nMinute = Minute(Now()) 
    nSecond = Second(Now()) + 5 
    waitTime = TimeSerial(nHour, nMinute, nSecond) 
    Application.Wait waitTime 

End Sub