VBA--word模板标签替换操作

   最近项目中有个需求,就是用word生成word,把一份标签对组成的word源材料,放到word模板中。所以就想到用vba来做,可是之前就没有接触过这些啊,连个word排版用的都不怎么好,于是就到下载频道搜索关键词vba。从搜索的结果来看,几乎全都是用Excel VBA的资料,word少之又少啊,最后找了几篇比较好的经验和word vba的api下载下来了。

   可能是之前没有遇到过那么急的开发任务,所以开始的时候就到网上搜索啊,百度啊,google啊,新浪共享,文库,还有我们的下载频道。。。当发现资料少,并且重复率又是那么高的时候真的有些失落。到后来去看别人的资料的时候又头大了,闷着头不停的看,看语法,看例子,就是找不到相似功能的东西。最后不得已去office的论坛发了个帖子,结果还没人回复。这已经过去了2天了。。。。

    今天上午来到公司的时候我就想不能再照着原来的路子走了,于是我就拿着需求好好的分析了下,这个程序具体要实现那几个逻辑,分析如下:

材料:1. 模板word1 里面含有如此样的标签

      

  
  
  
  
  1. ${111} 
  2.  
  3. ${112} 

      2 存放标签对的word2中,把资源都放在标签对中

     3 我要做的不就是吧标签对中的东西替换掉标签吗,几个主要的逻辑就出来了

         

  
  
  
  
  1. *对标签的定位,怎么找打标签对,就是个查找的方法 
  2. *取出标签对的内容,怎么截取这之间的内容放到粘贴板 
  3. *再次在word1中找到标记,替换掉,也就是个粘贴操作 

    后来想想真的挺简单的,只要能完成几个小方法就能做出来,于是我就按照这个几个小功能开始百度google了。参照着别人的程序把这几个小功能个完成后,在一点一点的集成,每次都进行测试和记录,最后一个相对可用的雏形就出现了。

     

  
  
  
  
  1. '这个版本开始对模板中所有标签批量替换 
  2. '用数组,记录所有标记,然后再用循环的方式替换 
  3. Sub 实现循环V3() 
  4.     Dim arr() 
  5.     Dim str As String 
  6.     arr = Array("111""112")                    '把需要查找的标签的号写到数组里 
  7.     For i = 0 To 1 
  8.         str = arr(i) 
  9.         Documents("src.docx").Activate 
  10.         Selection.Find.ClearFormatting           '这里的word2为因子文件,去这里取标签对 
  11.         With Selection.Find 
  12.              strM = "<%" + str + "%>" 
  13.             .Text = strM 
  14.             .Wrap = wdFindContinue 
  15.         End With 
  16.         Selection.Find.Execute 
  17.         a = Selection.End                         'Selection 对象就是选中的意思,例如选中文档的一部分 
  18.      
  19.         Selection.Find.ClearFormatting 
  20.         With Selection.Find 
  21.             strJ = "<%" + str + "%/>" 
  22.             .Text = strJ 
  23.             .Wrap = wdFindContinue 
  24.         End With 
  25.         Selection.Find.Execute 
  26.         b = Selection.Start 
  27.      
  28.         Selection.Start = a + 1 
  29.         Selection.End = b 
  30.      
  31.         Selection.Copy                       '把取到的内容放到粘贴板中 
  32.          
  33.         Documents("test.doc").Activate 
  34.         With Selection.Find 
  35.             .Forward = True 
  36.             .ClearFormatting 
  37.             .MatchWholeWord = True 
  38.             .MatchCase = False 
  39.             .Wrap = wdFindContinue 
  40.             strH = "${" + str + "}" 
  41.             .Execute FindText:=strH 
  42.         End With 
  43.      
  44.         Selection.Range.Paste                '在模板文件word1中找到标记并粘贴 
  45.     Next 
  46. End Sub 

    虽然说程序比较粗劣,但是通过这个过程让我觉得程序还是要慢慢的写出来,一点一点的构造,把小模块组装成大功能,而不是一上来就要怎样怎样,急功近利反而更耗时耗力。 这就是今天的一点收获。

 附:这是后来写的相对完善的一个脚本,只不过标记是用硬编码的,如果有需要的话引用vb的正则表达匹配特定格式的标记。

     

  
  
  
  
  1. Sub 模板提取() 
  2.     Dim p As String 
  3.     Dim fname As String 
  4.     Dim tname As String 
  5.     tname = ActiveDocument.Name 
  6.  
  7.     fname = "保监会文件因子上传示例.doc"                       '因子文件的名称 
  8.     p = ActiveDocument.Path 
  9. 'MsgBox tname 
  10. 'MsgBox fname 
  11.     ps = p + "\" + fname                                       '找到同一级目录并且得到要打开文件的路径,资源文件的名称!!! 
  12.     Set wrd = GetObject(, "Word.Application"
  13.     wrd.Visible = True 
  14.     For Each doc In Documents 
  15.      If doc.Name = fname Then Found = True               '判断是否打开,如果没有打开就打开 
  16.     Next 
  17.      
  18.     If Found <> True Then 
  19.         wrd.Documents.Open ps 
  20.     End If 
  21.     Dim arr() As Variant 
  22.     Dim str As String 
  23.     Dim num As Integer 
  24.     '把需要查找的标签的号写到数组里,!!!需要修改的!!! 
  25.     arr = Array("8000008""8000130""8000147""8000148""8000149""8000150""8000153""8000154""8000157""8009448""8009449""8009451""8009446""8011322"
  26.     num = UBound(arr)                                  '获取数组长度 
  27. 'MsgBox num 
  28.     For i = 0 To num 
  29.         str = arr(i) 
  30.         Documents(fname).Activate 
  31.         Selection.Find.ClearFormatting           '这里的word2为因子文件,去这里取标签对 
  32.         With Selection.Find 
  33.              strM = "<%" + str + "%>"            '标签对的样式,需要修改!!! 
  34.             .Text = strM 
  35.             .Wrap = wdFindContinue 
  36.         End With 
  37.         Selection.Find.Execute 
  38.         a = Selection.End                         'Selection 对象就是选中的意思,例如选中文档的一部分 
  39.      
  40.         Selection.Find.ClearFormatting 
  41.         With Selection.Find 
  42.             strJ = "</%" + str + "%>"            '标签对的样式,需要修改!!! 
  43.             .Text = strJ 
  44.             .Wrap = wdFindContinue 
  45.         End With 
  46.         Selection.Find.Execute 
  47.         b = Selection.Start 
  48.      
  49.         Selection.Start = a + 1 
  50.         Selection.End = b 
  51.      
  52.         Selection.Copy                       '把取到的内容放到粘贴板中 
  53.          
  54.         Documents(tname).Activate 
  55.         With Selection.Find 
  56.             .Forward = True 
  57.             .ClearFormatting 
  58.             .MatchWholeWord = True 
  59.             .MatchCase = False 
  60.             .Wrap = wdFindContinue 
  61.             strH = str                      '模板标记的样式,需要修改!!! 
  62.             .Execute FindText:=strH 
  63.         End With 
  64.      
  65.         Selection.Range.Paste                '在模板文件中找到标记并粘贴 
  66.     Next 
  67.      
  68. End Sub 

 

你可能感兴趣的:(替换,模板,word,格式,VBA)