ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 批量自动修改LINK域地址

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-5-23 23:26 | 显示全部楼层 |阅读模式
在WORD中使用LINK域的都知道,如果被链接的Excel文件的存放位置发生变化,更新域后就会出现错误,有什么办法呢?
经过反复研究守柔版主的域代码相关知识及《Word非常接触》后,写了如后的代码,并测试成功,现与广大域代码爱好者分享。
要求:
一、插入域代码时,不要加“\a”开关(不自动更新);
二、设置Word选项,使之打开时不自动更新域(Word选项->高级->常规->打开时更新自动链接:不勾选)。
捕获.PNG
'* +++++++++++++++++++++++++++++
'* Created By qxnljx, 2012-5-23 23:15
'仅测试于System: Windows 7 Word: 14.0 Language: 2052
'^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Option Explicit
Sub AutoOpen()
    If MsgBox("是否进行数据更新?", vbQuestion + vbYesNo + vbDefaultButton2, "温馨提示") = vbYes Then
        Application.ScreenUpdating = False
        Call UpdateLinkPath
        Application.ScreenUpdating = True
    End If
End Sub

Private Sub UpdateLinkPath()
    '默认:链接表与Word文档在同一目录下
    Dim UserFileName As Variant
    Dim fd As FileDialog
    Dim sField, c, cPath As String
    Dim i, n As Integer
    ActiveDocument.Fields(1).Select
    sField = ActiveDocument.Fields(1).Code
    i = InStr(1, sField, "房产销售与客户关系管理系统.xls", vbTextCompare)
    If i > 0 Then
        For n = 1 To i
            c = Mid(sField, n, 1)
            If c = ":" Then
                cPath = Mid(sField, n - 1, i - n + 1)
                If Dir(VBA.Replace(cPath, "\\", "\") & "房产销售与客户关系管理系统.xls", vbDirectory) = "" Then '当前目录下指定的表不存在
                    Set fd = Application.FileDialog(msoFileDialogFilePicker)
                    Dim vrtSelectedItem As Variant
                    With fd
                        If .Show = -1 Then
                            For Each vrtSelectedItem In .SelectedItems
                                UserFileName = vrtSelectedItem
                            Next vrtSelectedItem
                        Else
                        End If
                    End With
                    Set fd = Nothing
                    If UserFileName <> False Then
                        If InStr(1, UserFileName, "房产销售与客户关系管理系统.xls", vbTextCompare) > 0 Then
                            Call FindandReplace(cPath, VBA.Replace(Mid(UserFileName, 1, InStr(1, UserFileName, "房产销售与客户关系管理系统.xls", vbTextCompare) - 1), "\", "\\"))
                        Else
                            MsgBox "您打开的文件不是指定的表格文件!"
                            Exit Sub
                        End If
                    Else
                        MsgBox "您没有打开任何表格文件!"
                        Exit Sub
                    End If
                Else    '当前目录下指定的表存在
                    If StrComp(VBA.Replace(cPath, "\\", "\"), ThisDocument.Path & "\", vbTextCompare) <> 0 Then
                        '链接中的路径不是当前目录
                        Call FindandReplace(cPath, VBA.Replace(ThisDocument.Path & "\", "\", "\\"))
                    End If
                End If
                Exit For
            End If
        Next
    End If
    ActiveDocument.Fields.Update '执行更新动作
End Sub

Private Function FindandReplace(FindText As String, ReplaceText As String) As String
    Selection.WholeStory
    ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes '显示所有的域代码(切换方式):One Times!
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = FindText
        .Replacement.Text = ReplaceText
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes '显示所有的域结果(切换方式):Two Times!
End Function

注:默认Word档中的所有Link域均链接于同一个excel表。
欢迎测试,并发表您的测试结果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-25 22:49 | 显示全部楼层
对UpdateLinkPath函数做了一下优化和调整:
Private Sub UpdateLinkPath()
    '默认:链接表与合同文档在同一目录下!
    Dim UserFileName As Variant
    Dim fd As FileDialog
    Dim sField, c, cPath As String
    Dim i, n As Integer
    ActiveDocument.Fields(1).Select
    sField = ActiveDocument.Fields(1).Code
    i = InStr(1, sField, "房产销售与客户关系管理系统.xls", vbTextCompare)
    If i > 0 Then
        For n = 1 To i
            c = Mid(sField, n, 1)
            If c = ":" Then
                cPath = Mid(sField, n - 1, i - n + 1)
                If Dir(VBA.Replace(cPath, "\\", "\") & "房产销售与客户关系管理系统.xls", vbDirectory) = "" Then 'Link目录下指定的表不存在
                    If Dir(ThisDocument.Path & "\房产销售与客户关系管理系统.xls", vbDirectory) <> "" Then '当前目录下指定的表存在
                        '链接中的路径不是当前目录
                        Call FindandReplace(cPath, VBA.Replace(ThisDocument.Path & "\", "\", "\\"))
                    Else
                        If MsgBox("是否手动查找 Excel 文件?", vbQuestion + vbYesNo + vbDefaultButton1, "温馨提示") = vbYes Then
                            Set fd = Application.FileDialog(msoFileDialogFilePicker)
                            Dim vrtSelectedItem As Variant
                            With fd
                                If .Show = -1 Then
                                    For Each vrtSelectedItem In .SelectedItems
                                        UserFileName = vrtSelectedItem
                                    Next vrtSelectedItem
                                Else
                                End If
                            End With
                            Set fd = Nothing
                            If UserFileName <> False Then
                                If InStr(1, UserFileName, "房产销售与客户关系管理系统.xls", vbTextCompare) > 0 Then
                                    Call FindandReplace(cPath, VBA.Replace(Mid(UserFileName, 1, InStr(1, UserFileName, "房产销售与客户关系管理系统.xls", vbTextCompare) - 1), "\", "\\"))
                                Else
                                    MsgBox "您打开的文件不是指定的表格文件!"
                                    Exit Sub
                                End If
                            Else
                                MsgBox "您没有打开任何表格文件!"
                                Exit Sub
                            End If
                        Else
                            Exit Sub
                        End If
                    End If
                End If
                Exit For
            End If
        Next
    End If
    ActiveDocument.Fields.Update '执行更新动作
End Sub

TA的精华主题

TA的得分主题

发表于 2012-6-13 14:34 | 显示全部楼层
留个位置,只明白大致意思,我的文档就是经常会使用大量link域,一旦文档位置变了,link域就会全部挂掉,很是头疼。

请问lz的帖子作用何在?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-21 22:50 | 显示全部楼层
就是要解决这个问题。打开文档后,会自动检查LINK域,如果指定的表不存在,会提示手动查找,并按您提供的表的地址来修改域。

TA的精华主题

TA的得分主题

发表于 2012-9-13 13:29 | 显示全部楼层
qxnljx 发表于 2012-8-21 22:50
就是要解决这个问题。打开文档后,会自动检查LINK域,如果指定的表不存在,会提示手动查找,并按您提供的表 ...

“如果指定的表不存在”
那我还想再请问下,如果指定的表存在,但我想把链接地址换到另外一个表,这样也行么?怎么操作呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-18 22:42 | 显示全部楼层
alw1000 发表于 2012-9-13 13:29
“如果指定的表不存在”
那我还想再请问下,如果指定的表存在,但我想把链接地址换到另外一个表,这样也 ...

当然可以。一、把指定的表改名,这样就变成了“指定的表不存在了”;二、当提示手动查找时,选择您想链接的表即可。诚然,格式需要一样哟,不然,就涉及修改域的内容了,这不是本函数的主要目的,本函数主要修改LINK域中的“地址”。

TA的精华主题

TA的得分主题

发表于 2012-9-21 09:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
qxnljx 发表于 2012-9-18 22:42
当然可以。一、把指定的表改名,这样就变成了“指定的表不存在了”;二、当提示手动查找时,选择您想链接 ...

再次请教下,我的文档是一整个word,其中报告中部分数据直接引用word表格中直接计算的数值,采取的引用方法为“选择性粘贴---粘贴链接----无格式文本”这种形式,也适合你的这种方式么?谢谢

TA的精华主题

TA的得分主题

发表于 2012-9-21 09:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
alw1000 发表于 2012-9-21 09:51
再次请教下,我的文档是一整个word,其中报告中部分数据直接引用word表格中直接计算的数值,采取的引用方 ...

我现在报告中很多部分的引用链接错误,就是因为我把word转移到了其他路径中,例如说拷贝到u盘里带回家做,家里文档的路径就和公司文档路径不一样了,这样链接就全部挂掉了。很是头疼
word的这种超链接引用,全部是绝对路径引用,有没有什么相对引用的方式呢?例如说链接只在该word文件中寻找,word任意移动都没问题。

TA的精华主题

TA的得分主题

发表于 2012-9-25 13:57 | 显示全部楼层
qxnljx 发表于 2012-9-18 22:42
当然可以。一、把指定的表改名,这样就变成了“指定的表不存在了”;二、当提示手动查找时,选择您想链接 ...

我今天又对域链接进行了测试,把几种方式放一起对比。发现word的链接域能够随着文本的位置变动自动修正,我没有用你的代码。哎真奇了怪了,我把附件上传给你看看,我的引用可能跟你的不大一样,我只是对word内部数据进行引用,而你的代码是用来修改word对excel中的数据进行引用的,我可以这么理解吧? 实验.zip (7.83 KB, 下载次数: 119)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-9 23:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
alw1000 发表于 2012-9-21 09:51
再次请教下,我的文档是一整个word,其中报告中部分数据直接引用word表格中直接计算的数值,采取的引用方 ...

这种方式的引用与本函数的目的是不相同的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 15:28 , Processed in 0.037482 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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