2009-11-06 25 views

Respuesta

6

¿Qué tal:

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

Sería bueno si tu código se limpiara después de sí mismo, ¿no crees? –

+2

@David W Fenton Tenía la impresión de que este era un foro donde las ideas deberían ser suficientes, en su mayor parte, y que incluso las respuestas de una línea serían suficientes. – Fionnuala

+1

@David W Fenton si realmente crees que es tan importante, edita la respuesta y soluciónalos tú mismo –

9

He aquí un ejemplo de uno de mis programas (que todavía está en el uso diario en la empresa). Se toma de un programa vb6, pero también se ejecuta en vba. Lo he probado para estar seguro.

En este ejemplo, tenemos una tabla temporal con el nombre "mytable_tmp", que se actualiza con nuevos datos y nos gustaría guardar esto en la tabla "mytable" reemplazándolo.

Desde su editor de Excel VBA que necesita para establecer una referencia a los siguientes dos bibliotecas de tipos:

  • "Microsoft ActiveX Data Objects 2.8 Library"
  • "Microsoft ADO Ext 2.8 para DDL y. Seguridad "

La primera es para el espacio de nombres ADODB y la segunda para el espacio de nombres ADOX. (Tal vez tenga una versión anterior de MDAC como 2.5 o anterior; esto debería funcionar también).

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 

Espero ser útil.

+1

Me parece que el único valor de este código longing sobre las tres líneas de código de Remou es cuando no tienes Access instalado . –

+0

También ofrece la opción de hacer más que solo una copia directa dentro del mismo código, y quién sabe, el usuario de Excel podría no tener acceso a Access. Aún así, en general, tengo que aceptar que el aspecto de Remou es más útil. – mavnn

+0

;) ¿Cómo te atreves a incluir el manejo de errores y los mensajes de los usuarios? ¡Y de qué se trata todo ese formato! (Mucho más gracioso si lo haces en la voz de Stewie). +1 – JeffO

0

Aquí hay una pequeña alternativa al código de Remou anterior. Utilizo la función de shell para abrir la base de datos que necesito y luego la función GetObject para acceder a sus propiedades y métodos. Las ventajas de hacerlo de esta manera son 1) Puede seleccionar cómo se abrirá la ventana de la aplicación de Acceso. Para mis propósitos, quiero que esté oculto. 2) Tengo ambos Access 2003 y 2007 instalados y el método de Remou hace que se abra 2003, que no quiero. Mi método (creo) abre el archivo en cualquier versión de acceso que las ventanas hubieran utilizado para abrirlo si el usuario hubiera hecho doble clic en él.

El inconveniente es que debe asegurarse de que la base de datos esté abierta antes de intentar manipularla. Uso una subrutina de espera simple para tratar con esto, pero hay cosas más sofisticadas que puedes hacer.

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 
Cuestiones relacionadas