如何修复VBA宏以进行格式循环

时间:2019-07-07 14:17:03

标签: excel vba

我正在尝试创建一个宏,只需按一下其相应的快捷方式即可在不同格式之间循环。我创建的代码如下:

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)。

我出了什么问题?

2 个答案:

答案 0 :(得分:0)

要在括号中显示负数,请尝试用引号引起来,例如NumberFormat =“ 0;(”“ $ 0,000”“)”

答案 1 :(得分:0)

我也看到-12.00Selection.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 ElseCase分支,则只需将新条目添加到数组中。 / p>

另一方面,如果您当前的方法还可以,并且这只是一个快速宏,则无需修复未损坏的内容。