Как исправить макрос VBA для цикла форматирования - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь создать макрос, который циклически перебирает различные форматы, просто нажимая соответствующий ярлык.Код, который я создал, выглядит следующим образом:

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 голосов
/ 07 июля 2019

Я тоже видел -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, вам нужно будет только добавить новую запись (и) в массив.

С другой стороны, если ваш текущий подход хорош, и это просто быстрый макрос, нет необходимости исправлять то, что не нарушено.

0 голосов
/ 07 июля 2019

Чтобы отрицательные числа отображались в скобках, попробуйте заключить их в кавычки, например: NumberFormat = "0; (" "$ 0,000" ")"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...