美文网首页
VBA实例05:建立excel与word的映射关系

VBA实例05:建立excel与word的映射关系

作者: michaelxwang | 来源:发表于2022-06-08 22:06 被阅读0次

一、需求

在利用word编写各种论文、报告以及招股书时,往往会需要插入一堆表格数据。由于数据更新频繁,每次更新报告,粘数就会让人非常疲惫。
因此如果能将excel里的数据映射到word文档中,每次数据更新时,word报告里的数据也可以同步更新,就十分方便。

二、实现原理

  1. 建立excel数据与word 文档中表格之间的映射关系(链接)
  2. 可以实现word文档中数据跟随excel数据同步更新功能

2.1 单文本操作演示

  • 复制excel单元格数据,选择性粘贴为链接
  • 更新excel单元格数据内容,查看word中数据同步更新
粘贴为链接.gif
更新数据.gif

2.2 表格数据操作演示

  • 表格数据需选择性粘贴为富文本格式 (RTF) 或者html格式,这样word才识别为表格样式
  • word里表格样式可以调整,只要不改变链接就可以


    链接表格数据.gif

2.3 映射关系查看

查看链接信息.gif

三、代码实现

3.1 初步实现

3.1.1 粘贴链接表

Sub paste_table_link()
'
' 建立EXCEL数据源与WORD报告之间的数据链接

Application.ScreenRefresh
With Selection
    .PasteExcelTable True, True, True '完成复制动作
End With

End Sub

官方文档:Selection.PasteExcelTable 方法 (Word) | Microsoft Docs

3.1.2 粘贴链接文本


Sub paste_text_link()
'
' 建立EXCEL数据源与WORD报告之间的数据链接

Application.ScreenRefresh
With Selection
    '完成复制动作
    .PasteSpecial Link:=True, DataType:=wdPasteText, Placement:= _
     wdInLine, DisplayAsIcon:=False     
End With

End Sub

官方文档:Selection.PasteSpecial 方法 (Word) | Microsoft Docs

3.2 进一步需求

由于报告往往需要cast数,且有定版的需求。因此有以下需求:

  1. 设置数据自动更新为手动更新。
  2. 每次更新后,已经更改的样式不变
  3. ![vba执行演示.gif](https://img.haomeiwen.com/i15431530/4adf425937b981ee.gif?imageMogr2/auto-orient/strip)

    交付版本需要删除报告中所有的链接。

3.2.1 锁定链接单元格

1)粘贴表:

Sub paste_table_link()
'
' 建立EXCEL数据源与WORD报告之间的数据链接

Application.ScreenRefresh

With Selection
    .PasteExcelTable True, True, True '完成复制动作
End With

'数据设置为锁定
ActiveDocument.Fields.Locked = True

End Sub

2)粘贴数字

Sub paste_text_link()
'
' 建立EXCEL数据源与WORD报告之间的数据链接

Application.ScreenRefresh

With Selection
    '完成复制动作
    .PasteSpecial Link:=True, DataType:=wdPasteText, Placement:= _
     wdInLine, DisplayAsIcon:=False      
End With

'数据设置为锁定
ActiveDocument.Fields.Locked = True

End Sub

3.2.2 更新链接

1)更新所有链接

Sub update_link()

'更新word中所有的link
Application.ScreenRefresh
Dim f As Field
For Each f In ActiveDocument.Fields
f.Locked = False
f.Select
f.Update
f.Locked = True
Next f

End Sub

2)更新选中部分链接

Sub update_selection_link()
'更新选中区域的link
Dim f As Field
 For Each f In Selection.Range.Fields
 f.Locked = False
 f.Select
 f.Update
 f.Locked = True
 Next f

End Sub

3.2.3 删除链接

Sub break_link()

ActiveDocument.Fields.Unlink

End Sub

四、代码演示

vba执行演示.gif

代码:

Sub paste_table_link1()
'
' 建立EXCEL数据源与WORD报告之间的数据链接
' 1. 确保excel表格和word表格形式一致
' 2. 复制excel左上角第一个数据
' 3. 将光标放到word表格中对应的单元格中,点击宏按钮即可

Application.ScreenRefresh
On Error Resume Next
Set reg = CreateObject("vbscript.regexp")

With Selection
    table_C = .Information(wdMaximumNumberOfColumns)
    table_r = .Information(wdMaximumNumberOfRows)
    current_c = .Information(wdEndOfRangeColumnNumber) '或者这个table的信息和当期位置的信息
    current_r = .Information(wdEndOfRangeRowNumber)
    .PasteExcelTable True, True, True '完成复制动作
    .SelectCell
End With

Code = Selection.Fields(1).Code.Text  '先根据第一个贴过来的link获取excel的信息
MsgBox (Code)
reg.Pattern = "!R(\d+)C"
Set temp = reg.Execute(Code)
exl_rn = Val(temp(0).submatches.Item(0))
reg.Pattern = "!R\d+C(\d+)"
Set temp = reg.Execute(Code)
exl_cn = Val(temp(0).submatches.Item(0))


counter_i = 0
For i = current_c To table_C
    counter_j = 0
    For j = current_r To table_r
    new_code = Replace(Code, Replace("R" & exl_rn, " ", ""), Replace("R" & Str(exl_rn + counter_j), " ", ""))
    new_code = Replace(Replace(new_code, Replace("C" & exl_cn, " ", ""), Replace("C" & Str(exl_cn + counter_i), " ", "")), "\a", "")
    With Selection
    .Tables(1).Cell(j, i).Select
    .Delete
    .Collapse Direction:=wdCollapseStart
    .Range.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:=new_code
    End With
    counter_j = counter_j + 1
    Next j
    counter_i = counter_i + 1
Next i

ActiveDocument.Fields.Locked = True

End Sub

演示

vba执行演示.gif

相关文章

网友评论

      本文标题:VBA实例05:建立excel与word的映射关系

      本文链接:https://www.haomeiwen.com/subject/asfpmrtx.html