我正在尝试创建一个宏,只需按一下其相应的快捷方式即可在不同格式之间循环。我创建的代码如下:
Option Explicit
Sub FormatCycle()
'
' FormatCycle Macro
'
' Keyboard Shortcut: Ctrl+Shift+E
'
If Selection.NumberFormat = "General" Then
Selection.NumberFormat = "#,##0.00_);(#,##0.00)"
ElseIf Selection.NumberFormat = "#,##0.00_);(#,##0.00)" Then
Selection.NumberFormat = "0.00%_);(0.00%)"
ElseIf Selection.NumberFormat = "0.00%_);(0.00%)" Then
Selection.NumberFormat = "#,##0.00""x"";(#,##0.00""x"")"
ElseIf Selection.NumberFormat = "#,##0.00""x"";(#,##0.00""x"")" Then
Selection.NumberFormat = "General"
Else
Selection.NumberFormat = "General"
End If
End Sub
除具有负值(即(#,## 0.00))的第二种格式外,其他所有内容都可以正常运行。当我单独使用此格式时,例如通过自定义格式设置通用单元格,它将完成其工作并在括号中显示负数。但是,在宏中,当我运行它时,它会以“常规”格式显示数字,例如-12.00而不是(12.00)。
我出了什么问题?
答案 0 :(得分:0)
要在括号中显示负数,请尝试用引号引起来,例如NumberFormat =“ 0;(”“ $ 0,000”“)”
答案 1 :(得分:0)
我也看到-12.00
和Selection.NumberFormat
,但是一旦我切换到(12.00)
就开始看到Selection.NumberFormatLocal
。因此,建议您将代码中的Selection.NumberFormat
替换为Selection.NumberFormatLocal
。
类似的东西:
Option Explicit
Sub FormatCycle()
'
' FormatCycle Macro
'
' Keyboard Shortcut: Ctrl+Shift+E
'
Dim currentCell As Range
On Error Resume Next
Set currentCell = Selection
On Error GoTo 0
If currentCell Is Nothing Then Exit Sub ' Could probably check if TypeName is a range
With currentCell
Select Case .NumberFormatLocal
Case "General"
.NumberFormatLocal = "#,##0.00_);(#,##0.00)"
Case "#,##0.00_);(#,##0.00)"
.NumberFormatLocal = "0.00%_);(0.00%)"
Case "0.00%_);(0.00%)"
.NumberFormatLocal = "#,##0.00""x"";(#,##0.00""x"")"
Case "#,##0.00""x"";(#,##0.00""x"")"
.NumberFormatLocal = "General"
Case Else
.NumberFormatLocal = "General"
End Select
End With
End Sub
另一件事是,您正在有效地循环浏览数字格式的预定义列表(IF
语句中的每个分支都是上一个分支中分配的)。因此,最好将要循环遍历的所有数字格式存储在一个数组中,然后查找当前数字格式的位置(在数组中)并返回其后的数字格式。这样,如果您想在循环中引入更多的数字格式,而不是手动添加更多的If Else
或Case
分支,则只需将新条目添加到数组中。 / p>
另一方面,如果您当前的方法还可以,并且这只是一个快速宏,则无需修复未损坏的内容。