环境
我需要每周邮件合并以创建捐款的收据。我们使用的数据库程序生成一个Excel文件(xls),然后将其合并到Word文档(2010)中以打印收据。每次运行将收到3-6000张收据。我们收到许多不同货币的捐款。
问题
数据库程序使用货币符号导出货币金额,不带小数点。例如。: 5000美元(50美元) 要么 E500000(5000.00欧元) 要么 CHF1000(10瑞士弗兰克斯)
(我不知道为什么开发人员决定这样做!但总的来说这个程序非常好。)
使用合并字段中的简单公式,我可以取消美元和欧元符号,然后将金额除以100。
{ = { MERGEFIELD currency_amount \# 0.00} / 100 \# #,0.00}
然而,这个公式给我一个像CHF这样的货币的问题。我收到此错误:!Undefiend Bookmark, CHF1000
我尝试修改公式并在线搜索但到目前为止没有成功。
有没有人有解决方案或想法如何解决?如果可能的话我不想编辑原始的excel文件(例如运行宏,搜索和替换等)。
执行合并的用户也不是那个精通计算机的人。
谢谢!
答案 0 :(得分:1)
我希望有人有一个简洁的解决方案,但在我看来,这个问题的每个解决方案都可能引入复杂性,如果你可以改变提取软件就可以避免 - 将货币字符串和数量分成两列或者在至少,在" CHF"之间引入一个空间。和号码。
你认为你可以使用大量的域代码来做到这一点,但如果只有" CHF"它会更简单。导致问题。下面给出了另一种不需要编辑数据源的方法,但这在某些情况下可能很有用。
我认为您无法使用简单字段代码来执行此操作,因为尽管您可以编写代码来检测Word是否将金额视为数字或不是,当你发现它不是数字时仍然存在问题。
您可以使用以下字段集来确定Word是否将值视为数字:
{ SET tmp { MERGEFIELD currency_amount } }{ IF { tmp } = { =tmp } "it's a number" "it's not a number" }
这应该可以正常运行并在合并时不会出现任何错误。它不会像希望的那样工作的情况是,例如,你有一个CHF1000的值,你实际上有一个名为" CHF1000"的书签。
如果Word认为它是一个数字,那么您可以使用{= tmp#0}来获取数字并使用它来执行所需的操作。
如果不是,则必须考虑如何从字段中获取数字部分。
您无法以任何有用的方式使用{=}。 (有时可以使用算术"技巧"从数字中获取东西,但我不认为在这种情况下是可能的)。
您无法以任何有用的方式使用间接(例如,您使用
之类的内容){ DOCVARIABLE { REF tmp } }
访问一个名为CHF1000的变量,其值为1000.为此,您需要为每个可能的量使用一个这样的变量。实际上,如果你只能获得金额,比如9999瑞士法郎,它可能是可行的。
所以我认为你必须使用"蛮力"逐个提取数字。再说一次,如果它仅仅用于CHF并且数字总是以相同的格式(CHF1,CHF2,..,CHF1000等)并且您知道最大位数,那么您可以使用一大堆IF字段如下:
{ IF tmp = "CHF0*" { SET tmp2 "0" }
}{ IF tmp = "CHF1*" { SET tmp2 "1" }
}{ IF tmp = "CHF2*" { SET tmp2 "2" }
}{ IF tmp = "CHF3*" { SET tmp2 "3" }
}{ IF tmp = "CHF4*" { SET tmp2 "4" }
}{ IF tmp = "CHF5*" { SET tmp2 "5" }
}{ IF tmp = "CHF6*" { SET tmp2 "6" }
}{ IF tmp = "CHF7*" { SET tmp2 "7" }
}{ IF tmp = "CHF8*" { SET tmp2 "0" }
}{ IF tmp = "CHF9*" { SET tmp2 "9" }
}{ SET tmp1 { tmp2 }
}{ IF tmp = "CHF?0*" { SET tmp2 "{ tmp1 }0" }
}{ IF tmp = "CHF?1*" { SET tmp2 "{ tmp1 }1" }
}{ IF tmp = "CHF?2*" { SET tmp2 "{ tmp1 }2" }
}{ IF tmp = "CHF?3*" { SET tmp2 "{ tmp1 }3" }
}{ IF tmp = "CHF?4*" { SET tmp2 "{ tmp1 }4" }
}{ IF tmp = "CHF?5*" { SET tmp2 "{ tmp1 }5" }
}{ IF tmp = "CHF?6*" { SET tmp2 "{ tmp1 }6" }
}{ IF tmp = "CHF?7*" { SET tmp2 "{ tmp1 }7" }
}{ IF tmp = "CHF?8*" { SET tmp2 "{ tmp1 }8" }
}{ IF tmp = "CHF?9*" { SET tmp2 "{ tmp1 }9" }
}{ SET tmp1 { tmp2 }
}{ IF tmp = "CHF??0*" { SET tmp2 "{ tmp1 }0" }
}{ IF tmp = "CHF??1*" { SET tmp2 "{ tmp1 }1" }
}{ IF tmp = "CHF??2*" { SET tmp2 "{ tmp1 }2" }
}{ IF tmp = "CHF??3*" { SET tmp2 "{ tmp1 }3" }
}{ IF tmp = "CHF??4*" { SET tmp2 "{ tmp1 }4" }
}{ IF tmp = "CHF??5*" { SET tmp2 "{ tmp1 }5" }
}{ IF tmp = "CHF??6*" { SET tmp2 "{ tmp1 }6" }
}{ IF tmp = "CHF??7*" { SET tmp2 "{ tmp1 }7" }
}{ IF tmp = "CHF??8*" { SET tmp2 "{ tmp1 }8" }
}{ IF tmp = "CHF??9*" { SET tmp2 "{ tmp1 }9" }
}{ SET tmp1 { tmp2 }
}
并为你可能拥有的每个数字重复那个数字,icnreasing"?"每次一个字符。然后使用{= tmp1#0}获取值。
您可以考虑使用Excel数据源的另一种方法是编写使用Jet SQL修改数据的VBA(即,它不会修改'主数据')。如果只有一个用户,则表示您正在定义所有邮件合并主文档,并且您可以复制他们的环境,理论上您只需要运行一次VBA - 每次重新打开他们的邮件合并主文档时,相同的SQL将会被执行。在实践中,它很少这么简单。如果你只需要处理' CHF'你可以使用以下几行代码:
Sub SetupDataSource()
ActiveDocument.MailMerge.OpenDataSource _
Name:="c:\a\yourdatasource.xlsx", _
sqlstatement:="SELECT t.*, iif(ucase(left(t.currency_amount,3))='CHF',mid(t.currency_amount,4),t.currency_amount) AS new_amount FROM [Sheet1$] t"
End Sub
如果你必须发现更多"异常"或者你需要从几个货币领域中提取,事情可能会更难,因为