Как предлагается в комментариях, вы можете использовать SearchFormat
и ReplaceFormat
, чтобы сделать это, что-то вроде следующего:
Sub ClearCurrency()
If Not TypeOf Selection Is Excel.Range Then Exit Sub
With Application
.FindFormat.Clear
If .DecimalSeparator = "." Then .FindFormat.NumberFormat = "$#,##0.00"
If .DecimalSeparator = "," Then .FindFormat.NumberFormat = "\$#,##0.00"
End With
Selection.Replace What:="*", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=False
End Sub
Примечательно
При работе с локальными настройками не en_US и использовании пользовательского числового формата "$#,##0.00"
может появиться предупреждение Error 1004
. Формат не распознается и выдает ошибку. Чтобы предотвратить это вы можете либо;используйте NumberFormatLocal
:
Application.FindFormat.NumberFormatLocal = "$#.##0,00"
Обратите внимание на разницу в десятичной запятой и символе группировки. Вторым вариантом будет экранирование последовательности с обратной косой чертой, которая указывает, что следующий символ должен использоваться буквально как есть:
Application.FindFormat.NumberFormat = "\$#,##0.00"
Теперь десятичная точка и символ группировки могут оставаться на месте. Поэтому нам нужна проверка для проверки локальных настроек, которую можно выполнить с помощью Application.DecimalSeparator
, как предлагается в текущем решении.