Word表公式的科学格式

时间:2016-07-29 14:20:23

标签: ms-word format

我最近在Word表格上学习了公式,它虽然不像Excel那样通用,但它可以用于我的大型数据集。到目前为止我唯一的问题是格式化。

我想用科学记数法格式化。我没有运气就尝试了Excel中的格式:

  • ## 0.0E + 00

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Word的字段代码语言没有格式说明符,所以你必须采取另一种方法,例如

  1. 在Word文档中嵌入Excel表格而不是使用Word 表
  2. 使用VBA代替字段代码来计算表值
  3. 使用字段代码计算格式化数字
  4. 将DATABASE字段与Access数据库结合使用 格式化数字
  5. (1)可能是你最好的选择,特别是如果计算很复杂,因为与Excel相比,Word表公式真的有限

    (2)意味着你失去了Word的域代码所带来的好处。

    (3)很笨重,但我认为可以做到。但是,最大的问题是,与Excel不同,Word不区分单元格的值和单元格的格式化值。例如,假设一个单元格计算要显示的中间结果1234.5678,并且您将结果显示为2DP。然后你必须在单元格中进行计算,这将导致1.23E + 3。但是,当您现在在另一个计算中引用该单元格时,其值将为1230,而不是1234.5678。因此,如果您需要这样做,我认为您必须使用一个单元格用于实际的中间结果,而另一个单元格用于显示。此外,这里描述的方法不能正确处理可变精度。

    (4)非常笨重。它仅适用于Windows版本的Word。它实际上只适用于格式化表外的值,因为DATABASE字段不能在Word表中使用。这意味着您必须创建一个外部Access / Jet .mdb并将其放在Word可以打开它的地方。如果您想分发您的解决方案,那可能很困难。然后使用Jet SQL format()函数格式化每个数字。每次要格式化数字时,Word都会执行查询。

    (3)的方法最初是由macropod创建的 - 你可以在" Word Field Maths"上找到他的教程。 here(您可能需要注册才能获得)。

    我实际上没有教程的当前版本,但我看到的版本只处理从1.E-9到大约1.0E + 10的正数(和0)。它有这样的字段:

    {QUOTE
    {SET a {SourceVal}}
    {SET
    b{=9-(a<10^9)-(a<10^8)-(a<10^7)-(a<10^6)-(a<10^5)-(a<10^4)-(a<10^3)-(a<10^2)
    -(a<10^1)-(a<10^0)-(a<10^-1)-(a<10^-2)-(a<10^-3)-(a<10^-4)-(a<10^-5)-(a<10^-
    6)-(a<10^-7)-(a<10^-8)}}
    {SET c{=int(a/10^b)+mod(a,10^b)/10^b}}
    {c \# 0.00}E{b \# +00;-00}}
    

    所有{}都是可以使用 ctrl - F9 在Windows Word中插入的特殊字段代码括号对。对于表字段,您要做的是将整个字段集复制到表格单元格中,并将{SourceVal}字段替换为您在单元格中实际需要的{=}字段。

    但是,我认为我引用的公式版本存在一些问题,例如

    1. 显然是在尝试创建一个标准化结果,但是如果 SourceVal是10> = 100000的幂,公式将计算 错误的10的权力 - 例如100000转换为10.00E + 04时 应该是1.00E + 05
    2. 如果该数字将导致9.99xEy的标准化值,其中 &#34; X&#34;是5,6,7,8,9,该数字将被舍入到10并且将再次 没有得到适当的规范化。
    3. 我认为该公式旨在提供一个&#34; +&#34;从权力登录 当它是正数时为10,如果为0则没有符号,并且为&#34; - &#34;如果它是负数,即0.1将是1.00E-01,10将是1.00E + 01而1将是1.00E 00.这没有任何问题,但是如果你还希望Word 识别将格式化的值作为数字,您必须将格式1格式化为1.00E + 00(1.00E-00也不起作用)
    4. 0的格式为0.00E-09,这也是有效的,但未规范化。由于归一化的定义并不适用于0,因此不是一个正确的选择,但也许它应该是0.00E + 00
    5. 我认为问题(1)是因为当Word计算10 ^ 6(例如)时,结果不完全是1000000.(您可以使用{= 10 ^ 6-1000000#0。}来检查

      最后,macropod显然有理由使用int和mod函数计算c的值。我不知道为什么,但是对你来说可能很明显,在这种情况下你可能需要修改我给出的版本。

      虽然不太清楚,但我认为以下编码可能会解决所有这些问题,但你应该检查一下。

      首先,在文档的开头(或者可能在标题中),您需要输入以下字段并执行它们:

      { SET p_1 100000000000000000 }{ SET p_2 10000000000000000 }{ SET p_3 1000000000000000 }
      { SET p_4 100000000000000 }{ SET p_5 10000000000000 }{ SET p_6 1000000000000 }
      { SET p_7 100000000000 }{ SET p_8 10000000000 }{ SET p_9 1000000000 }{ SET p_10 100000000 }
      { SET p_11 10000000 }{ SET p_12 1000000 }{ SET p_13 100000 }{ SET p_14 10000 }
      { SET p_15 1000 }{ SET p_16 100 }{ SET p_17 10 }{ SET p_18 1 }{ SET p_19 .1 }
      { SET p_20 .01 }{ SET p_21 .001 }{ SET p_22 .0001 }{ SET p_23 .00001 }{ SET p_24 .000001 }
      { SET p_25 .0000001 }{ SET p_26 .00000001 }{ SET p_27 .000000001 }{ SET p_28 .0000000001 }
      { SET p_29 .00000000001 }{ SET p_30 .000000000001 }{ SET p_31 .0000000000001 }
      { SET p_32 .00000000000001 }{ SET p_33 .000000000000001 }{ SET p_34 .0000000000000001 }
      

      通过使用这些,我们避免计算10的幂。

      然后使用以下字段执行格式:

      { QUOTE
      { SET w { SourceVal } }
      { SET x { =abs(w) }
      { SET y { =1+(x<p_1)+(x<p_2)+(x<p_3)+(x<p_4)+(x<p_5)+(x<p_6)+(x<p_7)+(x<p_8)+(x<p_9)+(x<p_10)+(x<p_11)+(x<p_12)+(x<p_13)+(x<p_14)+(x<p_15)+(x<p_16)+(x<p_17)+(x<p_18)+(x<p_19)+(x<p_20)+(x<p_21)+(x<p_22)+(x<p_23)+(x<p_24)+(x<p_25)+(x<p_26)+(x<p_27)+(x<p_28)+(x<p_29)+(x<p_30)+(x<p_31) +(x<p_32) +(x<p_33) +(x<p_34) }
      { IF w = 35 "0.00E+00" 
      "{ =w \#;- }{ SET z "p_{ y }" }{ IF { =x/{ z } \#0.00 } = 10 
      "{ SET y { =y-1 } }{ SET z "p_{ y }" }"
      }{ =x/{ z } \#0.00 }{ =18-w \#'+'00;00 }" } }
      

      (我可能已经错过了一个大括号或#34;标记出该批次)

      你可以把所有这些都放在一行上。如果您愿意,也可以留出很多空间:

      {QUOTE
      {SET w {SourceVal}}
      {SET x {=abs(w)}
      {SET y {=1+(x<p_1)+(x<p_2)+(x<p_3)+(x<p_4)+(x<p_5)+(x<p_6)+(x<p_7)+(x<p_8)+(x<p_9)+(x<p_10)+(x<p_11)+(x<p_12)+(x<p_13)+(x<p_14)+(x<p_15)+(x<p_16)+(x<p_17)+(x<p_18)+(x<p_19)+(x<p_20)+(x<p_21)+(x<p_22)+(x<p_23)+(x<p_24)+(x<p_25)+(x<p_26)+(x<p_27)+(x<p_28)+(x<p_29)+(x<p_30)+(x<p_31)+(x<p_32)+(x<p_33)+(x<p_34)}
      {IF w = 35 "0.00E+00" 
      "{=w \#;-}{SET z "p_{y}"}{IF {=x/{z} \#0.00} = 10 
      "{SET y {=y-1}}{SET z "p_{y}"}"}{=x/{z} \#0.00}{=18-w \#'+'00;00}"}}
      

      显然,您可以通过一些小的修改来修改精度。

      最后,如果您想尝试使用DATABASE字段方法,您需要将DATABASE字段放在表格之外,然后将其结果复制回表格中的相应单元格。例如假设您希望E5包含E2 * E3 * E4的格式化结果。然后,一种方法是将表格加入书签(让我们调用书签&#34; mytable&#34;)。在表格之外,您可以引用单元格,但只能将它们的引用括在一个合适的函数中。

      在这种情况下,您可以

      { =PRODUCT(mytable E2:E4) }
      

      { =PRODUCT(mytable E2,mytable E3, mytable E4) }
      

      但是如果你需要E2 +(E3 / E4),你可能需要像

      这样的东西
      { =SUM(mytable E2,{=SUM(mytable E3)}/{=SUM(mytable E4)})}
      

      或者您可以在单元格中进行计算,例如F4,然后使用以下字段代码来使用表外的结果:

      { =SUM(mytable F4) }
      

      对于格式化,我们假设您在c:\ a中有一个名为a.mdb的数据库。然后你可以使用(比方说)

      { SET result { QUOTE { DATABASE \d "c:\\a\\a.mdb" \s "SELECT format({ =SUM(mytable F4) },'Scientific')" } } }
      

      然后在E5中你可以放

      { =result }
      

      您可以修改格式选项 - 例如,请参阅the MS documentation for the format function