2009-11-06 3 views

ответ

6

Как насчет:

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

Было бы неплохо, если бы ваш код очистился после себя, вам не кажется? –

+2

@David W Fenton У меня создалось впечатление, что это был форум, на котором идей должно быть достаточно, по большей части, и что даже однострочных ответов было бы достаточно. – Fionnuala

+1

@ David W Fenton, если вы действительно думаете, что это так важно, отредактируйте ответ и исправьте его самостоятельно. –

9

Вот пример одного из моих программ (которые по-прежнему находится в ежедневном использовании на предприятии). Это взято из программы vb6, но также выполняется в vba. Я проверял это, чтобы быть уверенным.

В этом примере у нас есть временная таблица с именем «mytable_tmp», которая обновляется новыми данными, и мы хотели бы сохранить ее в таблице «mytable», заменив ее.

С редакторе Excel VBA вам необходимо установить ссылку на следующие два типа библиотек:

  • "Microsoft ActiveX Data Objects 2.8 Library"
  • «Microsoft ADO Ext 2.8 для DDL и. Безопасность "

Первый - это пространство имен ADODB, второе - пространство имен ADOX. (Возможно, у вас есть более ранняя версия MDAC, например, 2.5 или более ранняя, это тоже должно работать).

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 

В надежде быть полезными.

+1

Мне кажется, что единственное значение этого длинноволнового кода по трем строкам кода Remou - это когда у вас нет доступа , –

+0

Он также дает возможность делать больше, чем просто прямую копию внутри одного и того же кода - и кто знает, пользователь Excel может не иметь доступа к Access. Тем не менее, в общем, я должен согласиться, что взгляды Рему более пригодны для использования. – mavnn

+0

;) Как вы смеете включать обработку ошибок и сообщения пользователя. И о чем все это форматирование! (Очень смешно, если вы делаете это в голосе Стьюи). +1 – JeffO

0

Ниже приведена небольшая альтернатива приведенному выше методу Remou. Я использую функцию оболочки, чтобы открыть нужную мне базу данных, а затем функцию GetObject для доступа к ее свойствам и методам. Преимущества для этого метода: 1) Вы можете выбрать способ открытия окна для приложения Access. Для моих целей я хочу, чтобы это было скрыто. 2) У меня установлены оба Access 2003 и 2007, и метод Remou вызывает открытие 2003 года, чего я не хочу. Мой метод (я думаю) открывает файл в любой версии окон Access, которые бы использовались для его открытия, если бы пользователь дважды щелкнул по нему.

Недостатком является то, что вы должны убедиться, что база данных открыта, прежде чем пытаться ее манипулировать. Я использую простое подпрограмму ожидания, чтобы справиться с этим, но есть более сложные вещи, которые вы можете сделать.

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 
Смежные вопросы