zoukankan      html  css  js  c++  java
  • 干掉烦人的Office粘贴复制

    Trouble:

    在office使用过程中,我们为了让多个文件表示某一个具体信息的内容一致,经常会产生很多烦人的Copy Paste工作.如在A.doc文件中,存在这样的文字"由小红,小白和小张负责整个项目策划和执行",当在一个*.doc文件中或者多个word文档中同时提到这一信息时,这就带来了一个潜在的麻烦,那就是当负责人变化时,如小白因为忽然情况,不能作为整个项目的一个负责人,怎么办,通常工作人员需要找到所有提到这个项目负责人的文档,然后do a lot of Copy And Paste.这无疑是一个灾难性的工作,这样的事情无声无响的发生在我们周围.心细一点你会发现,这种现象发生的平率如此之高.高到搞行政的朋友想要自杀.本文从技术的角度记录如何解放那些office工作人员,要做成具体的解决方案还需要加上其他的花壳.

    Solution:

    有句话叫Where there is a trouble,there is a solution.LOL

    OK,开个玩笑.针对上面提出的问题,我们来来设想我们的解决方案.不知道大家是否清楚office里面的模版机制.也就是*.dot和*.dotm文件,我们在电脑上建的每一个文件都有基于模版的派生品,通常情况下是normal.dotm,在office2010里面我们可以从File选项卡中的Info属性,然后点击Show All Properties里面,你就会看到Template.dotm,这就是word默认的模版.如果我们需要所有的文档能够远离上面提出来的Trouble,那么你只需要改一下你们公司创建文件所使用的模版就可以了.

    关于office模版等等其他的东西这里不做阐述,本文只提供解决方案.要解决这个问题,我们可以分两步走,第一步就是实现替换,然后就是跨文件操作.

    一.替换:

    关于替换我曾经选型使用模版法,如<<姓名>>然后通过VBA使用正则表达式来替换,正则式使用的是<<([^\>>]+)>>,可能是因为我是个程序员的缘故,我没有首先考虑使用书签,当然也夹杂从用户的角度考虑,毕竟使用书签比加个<<符号麻烦.最后做到一半发现了一个问题,那就是我的一个.doc文档,在经历过一次替换后就不能二次替换了,因为替换一次后,符号"<<"会消失.最后,在经历了无数挣扎后,终于用书签实现了,使用书签法进行替换我们很直接的想到

    ActiveDocument.Bookmarks("BookmarkName").Range.Text = "Hello world"

    可是神奇的office虽然把BookmarkName下的文本替换了,但是BookmarkName这个书签就不见了,也就是说不能进行二次替换.在

    尝试使用了Range后发现还是解决不了,最后在一篇老外的文章上终于找到了解决方案,

    Dim bmRange As Range
    Set bmRange = ActiveDocument.Bookmarks("BookmarkName").Range
    bmRange.Text = "Inserted Text"
    ActiveDocument.Bookmarks.Add _
       Name:="BookmarkName", _
       Range:=bmRange

    这段代码能改让你在不删除书签的前提下替换书签内容,这是本解决方案的一个核心功能.Ok,方案通了就OK了.

    二.跨文件操作:

    跨文件操作我原来设想的情况是当我们替换别的问件时,word程序界面会一个一个的起来,并且内存的占用一步一步加大,当文件数>10时基本就会奔溃,但是当我实践的时候,我惊奇的发现,word application的窗口没有弹出来,资源的占用也不高,天哪,居然这么平滑的就实现了多文件的替换工作,太nice了!!

    下面我贴一段跨文件操作的代码,ReplaceBookMark(location As String, bookmarkname As String, value As String)其中location可以是一个文件夹,这个方法会找到此文件夹下的所有*.doc文件(如果你存的是*.docx,需要改下源代码),然后根据你提供的书签名来替换内容,并且可以n次替换,这个书签永远不会丢失.

    'location 如 "C:\Users\administrator\Desktop\testpro\"
    Sub ReplaceBookMark(location As String, bookmarkname As String, value As String)
      Dim sFileName As String
      Dim sPath As String
      Dim wAppli As Object
      Dim worDoc As Document
      On Error Resume Next
      sPath = location  '设置文件夹路径
      sFileName = Dir(sPath & "*.doc")  '指定文件夹里的文件格式
      Application.ScreenUpdating = False
      Set wAppli = CreateObject("Word.Application")  '创建WORD对象
        Do While sFileName <> ""  '如果找到指定文件
          Set worDoc = wAppli.Documents.Open(sPath & sFileName)  '将此文件打开
              Set bmRange = worDoc.Bookmarks(bookmarkname).Range
              bmRange.Text = value
              worDoc.Bookmarks.Add _
              Name:=bookmarkname, _
             Range:=bmRange
              worDoc.Save  '保存文件
              worDoc.Close  '关闭文件
              sFileName = Dir  '重新指定文件名
        Loop
          Set worDoc = Nothing  '清除对象内容
              wAppli.Quit
          Set wAppli = Nothing
      Application.ScreenUpdating = True
    End Sub

    上面的代码逻辑肯定是对的,可能会有需要改的地方,不过应该问题不大,我在公司测试是可以通过的,刚为了写文章改动了一下,也不知道还work不work,不过基本的东西全在这了.

    基于上面这两个步骤,其实我们可以开发更多的运用,可以让这个过程更加的平滑.可能是后知后觉,我发现office的二次开发真的可以do everything.

  • 相关阅读:
    bzoj3531[Sdoi2014]旅行
    bzoj3212 Pku3468 A Simple Problem with Integers 线段树
    bzoj1858[Scoi2010]序列操作 线段树
    bzoj2243[SDOI2011]染色 树链剖分+线段树
    bzoj3038上帝造题的七分钟2
    bzoj1036[ZJOI2008]树的统计Count 树链剖分+线段树
    bzoj3211花神游历各国 线段树
    bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
    bzoj3129[Sdoi2013]方程 exlucas+容斥原理
    刷题总结——寻宝游戏(bzoj3991 dfs序)
  • 原文地址:https://www.cnblogs.com/Creator/p/2010988.html
Copyright © 2011-2022 走看看