【发布时间】:2015-02-12 08:40:34
【问题描述】:
用户可以通过用户表单插入一个数值(比如1,000,000)和一个ISO 代码(比如USD)。当他验证时,该值将打印在 A1 范围内,并通过使用以下宏记录的代码行将其格式化为货币:
.Range("A1").NumberFormat = _
"_-[$" & Me.ISOTextBox.Value & "] * #,##0.00_-;-[$" & Me.ISOTextBox.Value & "] * #,##0.00_-;_-[$" & Me.ISOTextBox & "] * ""-""??_-;_-@_-"
基本上,上面是分配.NumberFormat属性的字符串;例如,在“USD”的情况下,字符串将如下所示:
"_-[$USD] * #,##0.00_-;-[$USD] * #,##0.00_-;_-[$USD] * ""-""??_-;_-@_-"
我的问题是:如果我用上面的字符串设置数字格式,我怎么能得到呢? 我可以清楚地进行字符串解析,这是我目前用于提取 3 个字母 ISO 代码的“可怕”解决方案:
ISOcode = Left(Replace(Split(Range("A1").NumberFormat, "[")(1), "$", ""), 3)
注意:上述代码将所有NumberFormat 拆分为[,因此采用第二个元素(以$USD 开头),将$ 替换为"" 和取前三个字母,符合始终为 3 个字母长的 ISO 代码标准。
文档在这方面很差:有谁知道是否有办法从货币格式中正确获取 ISO 代码(不会变成不雅的字符串解析)?
【问题讨论】:
-
也许还有一种更优雅的方法可以将货币代码设置为 NumberFormat?
-
由于格式只是一个字符串,您似乎无法逃避解析该字符串,除非您还将该 ISO 代码存储在其他地方(例如,在单元格的注释中)
-
@TimWilliams 不幸的是,没有,ISO 代码通过表单输入并存储到单元格中作为数字格式,而不是作为字符串存储到单独的单元格中。我希望那时代码会稳定,在这种情况下我不喜欢过多地信任字符串解析。
-
在这种情况下,你能做的最好的可能是实现一个基于正则表达式的解析器来提取 ISO 代码(尽管这会将你限制在 Windows...)