Я пишу простой код, показанный ниже, однако excel, похоже, не использует формат чисел [Red] и меняет его на "#. ## 0,00". Есть мысли о том, как это исправить? Я пробовал другие числовые форматы, и мне всегда кажется, что [Красный] не распознается.

Кроме того, есть ли способ сократить код, не копируя каждый раз «Or c.NumberFormat»?

Благодарность!

КОД НИЖЕ

Dim c As Range

For Each c In Selection

    If Not c.NumberFormat = "0%" Or c.NumberFormat = "0%;(0)" Or c.NumberFormat = "0%;[Red](0%)" Then c.NumberFormat = "#.##0,00"

Next

End Sub
0
JROB 26 Ноя 2021 в 14:29
Вы хотите изменить числовой формат, только если это не один из трех форматов?
 – 
FunThomas
26 Ноя 2021 в 14:38
Правильно, так что в основном, если это не%, дайте мне этот числовой формат "#. ## 0,00", у меня действительно есть%, которые являются отрицательными и выделены КРАСНЫМ, но код меняет эти% на "#. ## 0,00 "Но я не понимаю почему.
 – 
JROB
26 Ноя 2021 в 15:01

1 ответ

Лучший ответ

Я почти уверен, что ваша проблема не связана с форматированием Red.

В вашем текущем операторе If - оператор Not отрицает только первую часть, поэтому формат "#.##0,00" установлен для всех ячеек, которые не имеют формата "0%"

Вы имеете в виду

If Not (c.NumberFormat = "0%" Or c.NumberFormat = "0%;(0)" Or c.NumberFormat = "0%;[Red](0%)") Then 

Который можно изменить (используя простую логическую алгебру, это не VBA) на

If c.NumberFormat <> "0%" And c.NumberFormat <> "0%;(0)" And c.NumberFormat <> "0%;[Red](0%)" Then 

В операторе If - нет ярлыка вроде If c.NumberFormat = "0%" Or "0%;(0)" Or "0%;[Red](0%)"

Вы можете назначить формат переменной, чтобы сделать оператор If короче. Это также имеет то преимущество, что код немного быстрее, так как он сокращает кругооборот между VBA и Excel.

Dim nf As String
nf = c.NumberFormat
If nf <> "0%" And nf <> "0%;(0)" And nf <> "0%;[Red](0%)" Then

Или вы можете использовать оператор Select case -

Select Case c.NumberFormat
    Case "0%", "0%;(0)", "0%;[Red](0%)"
    Case Else
        c.NumberFormat = "#.##0,00"
End Select
0
FunThomas 26 Ноя 2021 в 15:18
Большое спасибо, вы абсолютно правы, проблема вовсе не в КРАСНОМ. В итоге я использовал метод SELECT CASE, но у него есть некоторые недостатки, верно? С тех пор как я впервые разместил сообщение, я включил другие условия и форматы и поиграл с кейсами, но столкнулся с ошибками: Select Case c.NumberFormat Case «0%», «0%; (0)», «0%; [Red] ( 0%) "then" 0%; (0) "Case" 0,00x "," 0,0x "," 0x "Case Else c.NumberFormat =" #, ## 0.00 "
 – 
JROB
26 Ноя 2021 в 16:08