ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2702|回复: 0

[转帖] 自动刷新链接 Microsoft Access 表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-7 14:10 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

      在这篇文章中我们将向您展示即使当数据库文件已被移动到不同的文件夹时,如何可以用少量的代码调用一个过程,自动重新链接您的后台数据库的表。该过程还将可以用于有多个后台数据库的情况。最重要的是,你不需要了解很多完成这项工作的有关代码。
              自动刷新链接表是很有意义的,尤其是在你把数据库文件分享给其他人的时候,它可以节省您大量的麻烦、操作和时间。您不需要自己操作,你也无需远程访问另一台计算机。此外,您还不必输入您的后台数据库或链接的表的名称。

      那么,它到底是如何工作的?
      这段代码可以从前台TableDefs集合中获取重要的信息。包括您链接表的名称和后台数据库的名称。然后使用此信息,以及现有路径的前台数据库来获取所需设置的TableDef 连接属性的字符串。接着遍历TableDefs集合,并使用TableDef中重新链接方法来刷新链接。

        下面是代码将执行的操作:
1.后台文件和前台文件必须在同一个文件夹中,重新链接所有链接的 Access 数据库表。
2.当数据库移动到另一个文件夹或另一台计算机时,重新链接表。
3.重新链接多个后台 Access 数据库中的表。
4.不要求您输入或存储数据库或表的名称。
5.与一些方法不同,这段代码是如果有错误也不会丢失您的链接表或 TableDef 。

        这段代码做不到的几件事:
1.它不会重新链接Access数据库表,除非他们已被链接。
2.它不会刷新表已被重命名或移动到其他后台的链接。
3.它不会重新链接表中已重命名的后台数据库。
4.它不会重新链接 ODBC、 Excel、 Outlook、 dBASE、 Paradox或任何其他类型的链接表或对象。

        有几个要求:
1)前台文件和后台的表必须是相同的文件夹中。
        这个要求允许文件被移动到其他任何文件夹中或另一台计算机中,那么这段代码将自动重新链接表。
2) 如果有窗体加载了或者运行了宏,调用 RefreshTableLinks 过程的代码必须添加到第一个窗体的打开事件中。
更准确地说,运行该代码之前,必须加载绑定表的窗体。所以您可以在非绑定窗体中使用其他程序,比如在调用RefreshTableLinks过程之前启动窗体。

        重新链接表的函数:
Procedure: RefreshTableLinks
' Purpose: Refresh table links to back-ends in the same folder as front end.
' Note: Linked Tables can be in more than one back-end.
' Return: Returns a zero-length string if all tables are relinked.
' Return: or returns a string listing tables not relinked and errors.
'----------------------------------------------------------------------------
' 程序: RefreshTableLinks
' 目的: 刷新后台表链接到前台的同一文件夹中。
' 注: 链接的表可以在多个后台。
' 返回: 如果所有表都重新都链接,则返回一个零长度的字符串。
' 返回: 如果有错误没有链接则返回一个表清单的字符串。
'----------------------------------------------------------------------------
Public Function RefreshTableLinks() As String
On Error GoTo ErrHandle
        Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strCon As String
Dim strBackEnd As String
Dim strMsg As String
Dim intErrorCount As Integer
        Set db = CurrentDb

' 遍历TableDefs集合。
For Each tdf In db.TableDefs
' 验证表是链接的表。
If Left$(tdf.Connect, 10) = ";DATABASE=" Then
' 获取现有的连接字符串。
strCon = Nz(tdf.Connect, "")
' 获取使用字符串函数的后台数据库的名称。
strBackEnd = Right$(strCon, (Len(strCon) - (InStrRev(strCon, "\") - 1)))
' 如果后台数据库有
If Len(strBackEnd & "") > 0 Then
        Set tdf = db.TableDefs(tdf.Name)
' 建立新的连接属性值
tdf.Connect = ";DATABASE=" & CurrentProject.Path & strBackEnd
' 刷新链接表。
tdf.RefreshLink
Else
        intErrorCount = intErrorCount + 1
strMsg = strMsg & "Error getting back-end database name." & vbNewLine
strMsg = strMsg & "Table Name: " & tdf.Name & vbNewLine
strMsg = strMsg & "Connect = " & strCon & vbNewLine
End If
End If
Next tdf
        ExitHere:
On Error Resume Next
If intErrorCount > 0 Then
strMsg = "There were errors refreshing the table links: " _
& vbNewLine & strMsg & "In Procedure RefreshTableLinks"
RefreshTableLinks = strMsg
End If
Set tdf = Nothing
Set db = Nothing
Exit Function
        ErrHandle:
intErrorCount = intErrorCount + 1
strMsg = strMsg & "Error " & Err.Number & " " & Err.Description
strMsg = strMsg & vbNewLine & "Table Name: " & tdf.Name & vbNewLine
strMsg = strMsg & "Connect = " & strCon & vbNewLine
Resume ExitHere
        End Function

              上面的过程是如果发生了一个错误则返回一个消息字符串。这使您可以静静地在立即窗口中的记录成功的重新链接表信息,而不是每次打开数据库时突然弹出令人讨厌的 MsgBox提示框。但是,如果当一个或多个表未能重新链接或有错误时,你需要通知用户,则可以使用 MsgBox 。

      下面的代码演示了一种方法来调用该过程并使用 MsgBox 显示错误。
Dim strMsg As String
        ' 得到的消息赋值给strMsg。
strMsg = RefreshTableLinks()
        ' strMsg 将是一个零长度的字符串,则显示“所有的表已被成功链接”。
If Len(strMsg & "") = 0 Then
Debug.Print "All Tables were successfully relinked."
Else
        ' 通知用户有错误。
MsgBox strMsg, vbCritical
End If

              它是一个让每次运行数据库的程序打开的好主意。你可以把 RefreshTableLinks 函数放在一个标准模块中,添加代码,在你的做的程序中调用该过程,在没有出现一个不能链接的表之前,你都可以忽略它的存在。除非数据库损坏,不过这应该在几率非常小的情况下 ,除非是有人要将一个文件移动到一个不同的文件夹或重命名的后台数据库。

      此代码将只连接到前台数据库中已链接的 Access 数据库表。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 20:41 , Processed in 0.036575 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表