【问题标题】:Convert string to double in word (vba)将字符串转换为双精度字(vba)
【发布时间】:2019-12-18 11:52:11
【问题描述】:

我正在尝试将 word 文档中的文本转换为双精度文本,以便对其进行货币格式化。我从邮件合并中收到此文本。我将如何创建一个可以接收此文本并将其作为数字返回的宏? 我不熟悉单词和 VBA 脚本。到目前为止我所做的是

Function stringToDouble(baseString As String)
    Dim num As Double

    num = Val(baseString)

    stringToDouble = num

End Function

我不确定如何调用这个宏。因为它需要一个参数,所以它不会出现在宏表中。 我可能完全不知道如何将文本转换为单词中的双精度词,但感谢您提供任何帮助。 谢谢。如有任何澄清,请发表评论。

【问题讨论】:

  • 你能提供一个示例字符串吗?您是否正在转换看起来像“$1,500.99”的字符串?
  • 这和 Excel 有什么关系?
  • 你的问题不是很清楚。要将数字字符串格式化为货币,您只需要 VBA 中的 Format 函数:Format("123456.789", "$#,##0.00") --> 123,456.79
  • 一个示例字符串是从邮件合并收到的值,它是«Service Product View.Total»。如何在 Microsoft Word 文档中的这个特定字符串上调用该格式函数?不是要标记excel。
  • 如何调用宏是你的主要问题?您必须告诉我们更多关于如何使用它的信息。例如,用户是否选择文本然后运行宏?或者这是另一个过程的一部分?

标签: vba ms-word


【解决方案1】:

您不需要为此使用宏!!!您需要做的就是学习如何在 Word 字段中使用格式开关。

要控制 Word 中的数字和货币格式,请将数字图片开关添加到合并字段。为此:

  • 选择合并域;
  • 按 Shift-F9 显示字段编码。它应该类似于 {MERGEFIELD MyData};
  • 编辑该字段以获得 {MERGEFIELD MyData # $,0.00}(或您喜欢的任何其他数字格式 - 见下文);
  • 将光标置于该字段中的任意位置,然后按 F9 进行更新。

注意1:字段中的'#$,0.00'称为数字图片开关。其他可能性包括:

  • #0 表示四舍五入的整数
  • # ,0 表示带有千位分隔符的四舍五入整数
  • # ,0.00 表示精确到小数点后两位的数字,带有千位分隔符
  • # $,0 表示带千位分隔符的整数美元
  • # "$,0.00;($,0.00);'-'" 表示货币,用括号括住负数,用连字符表示 0 值

注2:显示值的精度由'0.00'控制。您可以使用从“0”到“0.000000000000000”的任何值。 如果你使用最后的';'在没有任何后续的格式化开关中,(例如 # "$,0.00;($,0.00);") 零值将被抑制。请注意,这会抑制由空字段和包含 0 的字段产生的 0。

注意 3: 如果您使用小数制表符或右对齐制表符来对齐值,请将开关括在引号中(即 #"$,0.00")并在字段中插入制表符$ 符号后的代码,您可以在 $ 符号后输出十进制对齐的值。

有关更多邮件合并提示和技巧,请参阅:https://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html

【讨论】:

    【解决方案2】:

    如果您想将数字转换为 Double 数据类型,请尝试以下操作:

    Function StringToDouble(ByVal baseString As String) As Double
        StringToDouble = VBA.CDbl(baseString)
    End Function
    

    如果您只关心格式化货币,请将字符串转换为 Currency 数据类型,如下所示:

    Function StringToCurrency(ByVal baseString As String) As Currency
        StringToCurrency = VBA.CCur(baseString)
    End Function
    

    您仍然需要格式化数字,但两个函数都会为您提供一个可以格式化的数字。

    这是一个示例,它还为您提供了格式为 USD 的字符串(例如 $4,999.75)。它需要上面的StringToCurrency 函数。

    Sub test()
        Dim stringNum As String
        stringNum = "4,999.754501"
        Debug.Print "stringNum=" & stringNum                ' outputs 4,999.754501
    
        Dim currencyNum As Currency
        currencyNum = StringToCurrency(stringNum)           ' outputs 4999.7545
        Debug.Print "currencyNum=" & currencyNum
    
        Dim formattedString As String
        formattedString = Format$(currencyNum, "$#,##0.00")
        Debug.Print "formattedString=" & formattedString    ' outputs $4,999.75
    End Sub
    

    【讨论】:

    • 货币不是双精度数,它是一个 64 位整数,计算 10,000 美元/卢比。来自 VBA 语言规范 - 在 -922,337,203,685,477.5808 到 +922,337,203,685,477.5807 范围内具有 4 个小数位的货币数字 64 位有符号二进制二进制补码整数隐式缩放 10-4
    • 国际化注意事项:CCur 从给定字符串(而不是双精度字符串)转换使用有关小数点的区域语言设置,这可能会产生不需要的结果,例如在大多数中欧国家(“,”而不是小数点“。”)
    • 如何让 stringNum 动态改变 word 文档中的文本?我从邮件合并字段收到我的金额/号码。
    • 源是 Excel 文件吗?您可以选择更改源上的数据吗?
    猜你喜欢
    • 2017-07-18
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多