【问题标题】:VBA Currency NumberFormat Error - ExcelVBA 货币 NumberFormat 错误 - Excel
【发布时间】:2014-08-13 12:48:06
【问题描述】:

我有许多单元格格式为货币的工作表,我想通过组合框修改货币格式,

首先我使用此代码获取初始货币类型/格式,

Private Sub ComboBox1_DropButtonClick()

inicial = Me.ComboBox1.Value

Select Case inicial

Case "EUR"

oldFormat = "#.##0 €"

Case "GBP"

oldFormat = "[$£-809]#.##0"

Case "USD"

oldFormat = "#.##0 [$USD]"

End Select

End Sub

oldformat 变量是全局变量,

Public oldformat As String

之后我想使用 oldformat 变量进行查找并使用 newformat 变量进行替换,

 Private Sub ComboBox1_Change()

 Dim ws As Worksheet
 Dim newFormat As String

'On Error Resume Next

 newValue = Me.ComboBox1.Value

 Select Case newValue

 Case "EUR"

 newFormat = "#.##0 €"

 Case "GBP"

 newFormat = "[$£-809]#.##0"

 Case "USD"

 newFormat = "#.##0 [$USD]"

 End Select

 'Set rNextCell = Application.FindFormat

 For Each ws In ActiveWorkbook.Worksheets

 Application.FindFormat.Clear
 Application.FindFormat.NumberFormat = oldFormat
 Application.ReplaceFormat.Clear
 Application.ReplaceFormat.NumberFormat = newFormat

 ws.Cells.Replace What:="", Replacement:="", LookAt:=xlPart, SearchOrder _
 :=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True

Next ws
End Sub

我通过组合框上的用户选择读取了新值。

但这根本不起作用,变量 oldformat 和 newformat 接收到正确的值但我得到了一个错误,

Application.FindFormat.NumberFormat = oldformat
Application.ReplaceFormat.NumberFormat = newFormat

运行时错误“1004”:应用程序定义或对象定义错误

有没有办法将 newformat 和 oldformat 值传递给 Numberformat 属性?

或者有人有另一个人来做这件事?

示例文件的链接, https://www.dropbox.com/s/sdyfbddxy08pvlc/Change_Currency.xlsm

感谢任何帮助,我对 VBA 有点陌生。

如果英文有任何错误,我很抱歉,这不是我的自然语言。

【问题讨论】:

  • 我已经在自定义格式框中设置了格式,但仍然出现错误。您可以在示例文件中看到。
  • 您的系统中设置了哪些十进制分隔符和数字组分隔符? VBA 将永远使用英文格式代码,因此如果十进制分隔符是逗号且数字组分隔符是点,“#.##0,00”将正常工作。然后必须使用“#,##.00”,如果结果应该是 1.000,00。
  • 这里是我的区域设置 dropbox.com/s/4u44a8l1snsqr6b/Regional.png 和 VBA 上的错误 dropbox.com/s/aysyyc1smcphslf/VBA.png 我将格式更改为 "#,##.0 €" "[$£-809]#,##.0 " 和 "#,##.0 [$USD]"。我将它们添加到自定义格式框中,dropbox.com/s/ad8vanm2hwtsudb/Formatbox.png
  • 不,您不应该更改自定义格式框中的格式代码。您应该在 VBA 代码中使用英文代码。

标签: object currency number-formatting


【解决方案1】:

我已经下载了文件。然后将代码更改为:

Public oldFormat As String

Private Sub ComboBox1_Change()

    Dim ws As Worksheet
    Dim newFormat As String

    'On Error Resume Next

newValue = Me.ComboBox1.Value

Select Case newValue

Case "EUR"

    newFormat = "#,##0 $"

Case "GBP"

    newFormat = "[$£-809]#,##0"

Case "USD"

    newFormat = "#,##0 [$USD]"

End Select

'Set rNextCell = Application.FindFormat

    For Each ws In ActiveWorkbook.Worksheets

     ws.Range("XFD1048576").NumberFormat = oldFormat
     ws.Range("XFD1048576").NumberFormat = newFormat
     ws.Range("XFD1048576").NumberFormat = "General"

     Application.FindFormat.Clear
     Application.FindFormat.NumberFormat = oldFormat
     Application.ReplaceFormat.Clear
     Application.ReplaceFormat.NumberFormat = newFormat

     ws.Cells.Replace What:="", Replacement:="", LookAt:=xlPart, SearchOrder _
     :=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True

    Next ws
End Sub

Private Sub ComboBox1_DropButtonClick()

inicial = Me.ComboBox1.Value

Select Case inicial

Case "EUR"

    oldFormat = "#,##0 $"

Case "GBP"

    oldFormat = "[$£-809]#,##0"

Case "USD"

    oldFormat = "#,##0 [$USD]"

End Select

End Sub

现在它运行没有错误。

但还有一个问题。如果用户定义格式等于默认货币格式,则 Excel(Excel!不是 VBA)将不会设置用户定义格式而是默认货币格式。这适用于 VBA "#,##0 $" 中的德国。对我来说,#.##0 € 就是这种情况,它是一种德国货币格式。所以对我来说是 VBA 中的 EUR "#,##0 $"。

问候

阿克塞尔

【讨论】:

  • 我稍后会托盘,然后我说点什么。感谢您的帮助。
  • 抱歉耽搁了,我正在度假。我在我的文件上使用了你的代码,没有任何反应……没有错误没有结果,什么都没有。你能帮我吗?
  • 我来自葡萄牙。 #.##0,00[$€-816]
  • 然后尝试在 oldFormat 中使用 "#,##0[$€-816]" 获取欧元。或者先用 $USD #.##0 [$USD] 格式化这些值,然后再尝试。该程序首先查看它是否在其中一个 oldFormat 设置中找到值。如果没有找到,它什么也不做。
猜你喜欢
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多