我将来自其他软件的值以如下格式引入到 Word 中:
例 1: 2 000,00 $ 例 2: 50,00 $ 例 3: 211,50 $
由于 Word 不允许对该格式的数字进行数学运算,因此我必须将数字转换为句点格式,例如 1、2000.00 或例如 3、211.50
我这样做的方式是:
{ REF DataName \# "0.00" }
对于上面的示例 1 和 2,它可以正常工作。但是,当数字为小数时,如示例 3,输出为 261.00,这是不正确的。
希望得到帮助,因为我已经测试了多种方法,例如 { =DataName } 甚至 SET 命令。
答案1
如果 VBA(或其他编程方法)是一种选择,那么我认为这是解决这个问题的最佳和最通用的方法。
有一种方法可以使用 DATABASE 字段来重新格式化数字。它通常可以在安装有 Office 的 Windows 台式电脑上运行,但它可能无法在您的 Citrix 环境中运行,因为
它需要能够访问外部文件,我猜想在 Citrix 环境中该文件应该位于某台服务器上。下面有更多详细信息。
它使用 Jet/ACE OLE DB 提供程序 - 通常在桌面环境中可用,但我不知道 Word 是否能够在 Citrix 环境中执行此操作。
最后,如果这些数字可以采用各种不同的国家数字格式,我认为编写能够处理所有这些数字的字段(甚至可能不是 VBA 代码)并不容易。
因此,我假设数字按照您提到的方式输入,并且最终结果中没有空格或“$”,小数点为“.” 。(一旦您得到这些,您就可以使用 Word 的数字格式来格式化它们)。
如果您的数字中有引号,则此 DATABASE 字段技术可能不起作用。例如,我认为瑞士人可能会使用单引号字符“'”作为千位分隔符。
如果用户可以通过“g:”驱动器或 \myserver\myshare 访问文件系统,那么您需要的是位于该文件系统中已知位置的小型纯文本文件。例如,假设您有一个名为
g:\standard\i.udl
或者
\\myserver\myshare\standard\i.udl
包含以下文本:
[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.;Jet OLEDB:Engine Type=96;
如果你有旧版本的 Word,则需要指定旧版 Jet 提供程序,例如使用
[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.;Jet OLEDB:Engine Type=96;
.udl 文件是一种“通用数据链接”文件,允许您指定 ODBC 或 OLEDB 数据源。Word 仍可识别它们,使用此文件,您可以发出 Jet/ACE SQL 查询,而无需实际拥有 .mdb 或 .accdb 数据库。
如果用户系统只能通过 HTTP 访问文件,那么您将需要一个最小的 Access .mdb 文件,而不是 .udl 文件。您可以在 Access 中创建一个。它不需要任何用户表或查询。假设它位于
http://192.168.200.200/standard/i.mdb
(我只能在这里使用 http: 进行测试,而不能使用 https:,所以我不确定这是否可以与 https: 一起使用)
现在确保您可以通过在文档中插入以下示例 DATABASE 字段来执行 Jet/ACE 查询(对所有特殊字段代码括号使用 ctrl-F9,并在它们之间输入所有其他内容):
{ DATABASE \d "g:\\standard\\i.udl" \s "SELECT 1" }
(以下方法可能也有效:
{ DATABASE \d "g:/standard/i.udl" \s "SELECT 1" }
)
或者
{ DATABASE \d "\\\\myserver\\myshare\\standard\\i.udl" \s "SELECT 2" }
或者
{ DATABASE \d "http://192.168.200.200/standard/i.mdb" \s "SELECT 3" }
取决于你放置文件的位置。确保路径文字中的反斜杠是双倍的,正如我所展示的那样。
选择该字段,通过 F9 更新它,然后查看结果。如果出现错误消息,并且您的路径/访问权限等都正常,则此方法无效。如果您看到查询的结果(第二个段落中有几段 1、2 或 3,则到目前为止一切顺利。
此时我应该指出,您不能将 DATABASE 字段放在 Word 表中。如果您需要将这些值放在表中,则必须将这些 DATABASE 字段放在表外,然后使用 SET 字段将结果分配给书签,然后您可以在表中使用 { REF }。
接下来你需要验证是否可以将数字转换为可以使用的格式。我将逐步说明,以第一个示例数字为例
2 000,00 $
首先改变你的领域,使它看起来像这样,无论上面的路径在哪里起作用。
{ DATABASE \d "<thatpath>" \s "SELECT replace('2 000,00 $',' ','')" }
确保 '' 是两个单垂直引号,而不是 " 双引号字符。
更新它,结果应该包含不带空格的数字:
2000,00$
现在尝试
{ DATABASE \d "<thatpath>" \s "SELECT replace(replace('2 000,00 $',' ',''),'$','')" }
应该删除“$”
最后
{ DATABASE \d "<thatpath>" \s "SELECT replace(replace(replace('2 000,00 $',' ',''),'$',''),',','.')" }
这应该给你
2000.00
但实际上,你的号码在一个名为 DataName 的书签中,所以你确实需要
{ DATABASE \d "<thatpath>" \s "SELECT replace(replace(replace('{ REF DataName }',' ',''),'$',''),',','.')" }
其中 { } 是正确的字段代码括号,您可以使用 ctrl-F9 输入。
(通常最好省略 REF,只使用
{ DATABASE \d "<thatpath>" \s "SELECT replace(replace(replace('{ DataName }',' ',''),'$',''),',','.')" }
如果需要替换其他字符,可以添加更多替换函数,但 SELECT 语句的总长度是有限制的(可能是 255 个字符)。
如果一切正常,下一步是删除 Word 在 Word 2000 之后开始插入的多余段落标记。幸运的是,您可以通过将所有内容嵌套在 QUOTE 字段中来实现这一点,例如
{ QUOTE "{ DATABASE \d "<thatpath>" \s "SELECT replace(replace(replace('{ DataName }',' ',''),'$',''),',','.')" }" }
如果需要,您还可以向 QUOTE 字段添加数字格式,例如
{ QUOTE "{ DATABASE \d "<thatpath>" \s "SELECT replace(replace(replace('{ DataName }',' ',''),'$',''),',','.')" }" \#"$,0.00"}
如果您需要在其他地方引用该值(例如在表格内,那么您可以这样做
{ SET mynumber "{ QUOTE "{ DATABASE \d "<thatpath>" \s "SELECT replace(replace(replace('{ DataName }',' ',''),'$',''),',','.')" }" }" }
然后例如
{ mynumber \#"$,0.00 }
如果文档中有很多这样的数字,那么就会有很多 DATABASE 字段,执行起来可能需要一些时间。据我所知,Word 会缓存数据库/.udl 数据,因此在更新第一个 DATABASE 字段后,执行速度可能会加快,但您应该验证 Word 是否确实挂起或似乎挂起。
同样,如果有很多数字需要格式化,您可以将所有“通用文本”放入其他书签中,这将有助于缩短这些字段并提高可维护性。例如你可以这样做
(文件开头)
{ SET dbpath "g:\standard\ia.udl" } (single backslashes here will work OK later)
{ SET qhead "SELECT replace(replace(replace('" }
{ SET qtail "',' ',''),'$',''),',','.')" }
{ SET format "$,0.00" }
然后使用
{ QUOTE "{ DATABASE \d "{ dbpath }" \s "{ qhead }{ DataName }{ qtail }" }" \#"{ format }" }
有些人喜欢删除不必要的空格和引号。我个人更喜欢保留这些东西,需要测试才能确定到底可以省略什么,但例如,你当然可以将其简化为
{QUOTE "{DATABASE \d "{dbpath}" \s "{qhead}{DataName}{qtail}"}" \#"{format}"}