【问题标题】:VBA erases local currency number formatVBA 擦除本地货币数字格式
【发布时间】:2015-12-06 17:15:19
【问题描述】:

我正在尝试将命名单元格中的数字格式应用于另一个单元格,其中源单元格格式可以是百分比、货币(在我的情况下为欧元)或其他。我的代码使用.NumberFormat range 属性,如下所示:

For newCell in newCellsRange
    Range("newCell").Value = some_calculation()
    Range("newCell").NumberFormat = Range("sourceCell").NumberFormat
Next newCell

它适用于范围在工作表上的显示方式(无论是百分比、货币还是日期)。

但是,如果将这个相同的范围链接到条形图并将其值用作标签(没有花哨的格式,右键单击系列 > 添加数据标签,仅此而已),当我触发时标签格式会改变更新图表源范围的宏(在我的示例中为newCellsRange):格式将从欧元货币格式更改为不正确的美国货币格式:1 523€ 将变为1,523 $235 € 将变为,235 $ .

为了提供更多详细信息,我发现该范围的 .NumberFormat 属性是"#,##0 $"(显示€),而图表标签的属性是"# ##0 $"。我不知道:

  • 为什么宏会让逗号消失,因为我没有为此做任何事情
  • 为什么"#,##0 $" 会在电子表格中显示为€,而"# ##0 $" 会显示为$。

我能做些什么来避免这种奇怪的格式切换?

如果这有帮助(我对此表示怀疑):W7 Enterprise(英文版)上的 Excel 2013 32 位(英文版)

【问题讨论】:

    标签: vba excel number-formatting


    【解决方案1】:

    数字格式取决于两件事。首先是 Windows 操作系统的区域设置,其次是 Excel 中选择的格式。因此,“货币”格式可能因区域设置而异。用逗号或小数点作为小数点或使用不同的货币符号。但在英文 Excel 版本中,其名称始终为“货币”。

    在 VBA 中,默认语言始终是美国英语。这是数字格式的一个难题,因为美国英语的默认值是小数点,而 $ 作为货币符号。因此,取自 Range.NumberFormat 属性的“货币”格式在我的德语 Excel 中也是“#,##0.00 $”。

    如果我在德语 Excel 中指定 Range.NumberFormat = "#,##0.00 $",那么工作表会将其映射到区域设置“货币”。为什么图表有这个问题?我不知道。

    Microsoft 试图通过拥有...Local 属性来解决VBA 中的困境。所以

    For newCell in newCellsRange
        Range("newCell").Value = some_calculation()
        Range("newCell").NumberFormatLocal = Range("sourceCell").NumberFormatLocal
    Next newCell
    

    可能会解决您的问题。

    【讨论】:

    • 感谢您的解释。我刚刚尝试了 .NumberFormatLocal 但不幸的是结果完全一样...
    • 抱歉,我可以使用Range.NumberFormat 重现所描述的行为。然后图表在数据标签中获取用户定义的数字格式。但是Range.NumberFormatLocal 对我有用。
    • 感谢您的支持,我忘了回复 - 抱歉。我不知道为什么,但仍然无法使用 .NumberFormatLocal 属性。我最终选择手动格式化字符串,丑陋的解决方法,但足以满足我的需要。
    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多