用WORD编写自动计算与自动更新的表格(转帖) - Hicome

时间:2024-03-02 21:07:07
    一般情况下,我们都采用EXCEL编写表格,因为EXCEL具有容易计算、公式简单清晰、编排方便等特点。如果要在WORD文档中插入表格,从EXCEL中复制表格到WORD是一个办法,可是复制过来的表格会被转换为文字,原有的公式特性不复存在,而且直接粘贴的EXCEL表格还面临表格样式、文字格式等需要调整的麻烦,因此,对一些较简单的计算表格,不如直接在WORD中编写更为容易。
 
一、利用域在Word中实现计算功能 
转载自:http://www.yanr.cn/Feature/Word/word/18.html#1
1.计算表格行或列
   (1)计算表格行
   假如需要计算表格行数据的平均值,如果存放计算结果的空白单元格在数据行的右边,可以把光标插入紧靠数据右端的空白单元格。按下Ctrl+F9组合键把域特征字符“{}”插入单元格,然后在大括号中间输入“=Average(left)”,完成后按下F9键更新,即可获得计算结果。
   如果存放计算结果的空白单元格位于数据行的左边,只须按上述方法在紧靠数据左边的单元格中插入公式“=Average(right)”即可。
   (2)计算表格列
   计算表格列的方法和计算表格行非常相似,如果我们要计算某列中所有数据的平均值,而存放计算结果的空白单元格位于数据上面。只要按上述方法在其中插入公式“=Average(above)”,然后更新即可获得结果。如果存放计算结果的空白单元格位于数据下面,只要把公式修改为“=Average(below)”即可。
   如果需要执行的计算是求和、寻找最大值、最小值等,只要把上述公式(域代码)中的函数名称改为Sum、Max和Min等即可。如果所计算的行或列中含有英文字母和汉字,则计算中均把它们当作“0”处理。
2.计算任意单元格
   假如计算对象不是存放在连续的数据行或列中,我们可以把表格看成一个Excel表格,也就是表格左边第一列是A列、第二列是B列……,表格自上而下分别是第1行、第2行……。再按照类似Excel的公式构造原则进行计算,下面以Sum函数和If函数为例进行介绍。
   (1)对任意单元格求和
   假设表格第一行左起第一至三单元格(即A1、B1、C1)存放着“36 580”、“18 580”和“26 980”,第二行第三个单元格(即C3)存放着“52 360”,第四行第五个单元格(即E4)存放着“36 190”。你只需在存放计算结果的单元格中输入“{=Sum(A1:C1,D2,E4)}”,更新域后即可获得计算结果。如果被计算的数据发生了变化,只要对域进行更新就可以获得正确的结果。
   (2)If函数的判断求和
   表格的第一列(A)存放着“姓名”,第二列(B)存放着“岗位工资”的数值,第三列(C)存放着“技能工资”的数值。假如“岗位工资”高于1 800元的员工需要额外加上200元的补贴,可以在第四列的空白单元格中输入“{=If(B2>1800,Sum(B2:C2,200),Sum(B2:C2))}”。该公式经过更新以后,若B2、B3等单元格中的数值大于1 800,则执行“Sum(B2:C2,200)”,也就是将B2、C2中的数值和200相加;若B2、B3等单元格中的数值小于1 800,则执行“Sum(B2:C2)”,也就是将B2、C2中的数值相加。
   注意:除上面介绍的方法在单元格中插入公式(域代码)以外,还可以单击“表格→公式”菜单命令,在出现的对话框中进行设置;或者打开“域”对话框选中“域名”下的“Formula”项,再单击“公式”按钮,都可以打开“公式”对话框插入所需的公式。
 
二、实例
    如下表所示,表中蓝色数据表示填入的数据,数据填入后要在合计和总计中进行价格计算。

 单价是在B列,数量在C列,则第一个合计单元格的计算公式为B2×C2。将光标放至第一个合计单元格中,点击“插入”菜单>>“域”,在域对话框中点击“公式”,在“公式”对话框中输入“=B2*C2”,然后按确定按钮。
 


插入域后的结果如下表所示:

第二个合计单元格的计算公式为“=B3*C3”;总计单元格的计算公式为“=SUM(D1:D2)”。 最后效果如下表所示。
三、自动更新
表格编完了,但是还有一个问题:WORD不能象EXCEL那样自动进行域更新,手动更新的话要点中域,然后按F9键一个一个更新,这样非常麻烦。而且如果有哪个数据忘了更新,结果就会出错。看来,还得编个自动更新的代码。
 
自动更新代码(1):每次打开文档时自动更新所有域;或者在文档编辑过程中运行该宏也能自动更新。
转载自:http://blog.hanguofeng.com/read.php 444
        Sub AutoOpen()
          Dim aStory As Range
          Dim aField As Field
          For Each aStory In ActiveDocument.StoryRanges
             For Each aField In aStory.Fields
                aField.Update
             Next aField
          Next aStory
       End Sub
 
每分钟自动更新一次的代码(2):每隔1分钟自动更新一次。
转载自:http://redwin.bokee.com/37531.html
Dim pTime As Date
Sub Runtimer()
   pTime = Now + TimeValue("00:01:00")
   Application.OnTime pTime, "AutoUpdate"
End Sub
Sub AutoUpdate()
 \'自动更新域公式
\'By redwin  2003-12-29
On Error Resume Next
r = Selection.Information(wdFirstCharacterLineNumber)
With Selection
  .WholeStory
  .Fields.Update
  \'返回至原光标所在位置
  .GoTo What:=wdGoToLine, Which:=wdGoToFirst, Count:=r, Name:=""
 End With
Runtimer
End Sub
Sub BeforeCloseA()
 \'On Error Resume Next
 \'Application.OnTime pTime, "AutoUpdate", , False
End Sub
 
    两种代码各有优点。代码(1)的优点是想更新时就更新;代码(2)的优点是不用管它,它会不断的更新,缺点是每次更新时文档都会刷的闪一下。所以我比较喜欢代码(1)。
 
四、代码的输入与加载
    编写完表格后按ALT+F11键,进入MICROSOFT VISUAL BASIC编辑器,按F7键打开代码窗口,在窗口中粘贴或输入代码,然后关闭编辑器。
    代码设完后还不算完,WORD为了防止宏病毒,会禁止宏运行。点击“工具”菜单>>“”>>“安全性”,把安全性设为中,然后把“可靠发行商”的“信任所有安装的加载项和模版”选中,保存文件,再次打开的时候就会提示你是否启动宏。不建议把安全性设为低,安全第一。
    这样,每当重新打开文档时,域就会自动更新。如果使用代码(2),则会每分钟自动更新一次。如果使用代码(1),当你需要把所有域自动更新时,按ALT+F8键,选择AUTOOPEN并点击运行,则域进行更新。