【发布时间】:2009-11-06 22:18:57
【问题描述】:
我正在尝试使用 Excel 中的 VBA 重命名访问表...有什么帮助吗?
【问题讨论】:
-
您为什么要这样做?除非是临时数据表。
我正在尝试使用 Excel 中的 VBA 重命名访问表...有什么帮助吗?
【问题讨论】:
这是我的一个程序中的一个示例(该程序仍在公司日常使用)。它取自 vb6 程序,但也在 vba 中执行。我已经测试过它可以确定。
在本例中,我们有一个名为“mytable_tmp”的临时表,该表已更新为新数据,我们希望通过替换将其保存到表“mytable”中。
您需要在 Excel vba 编辑器中设置对以下两个类型库的引用:
第一个用于 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
希望对您有所帮助。
【讨论】:
怎么样:
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
【讨论】:
这里是上面 Remou 代码的一个小替代方案。我使用 shell 函数打开我需要的数据库,然后使用 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
【讨论】: