Как очистить ячейки в диапазоне, которые имеют формат валюты без зацикливания - PullRequest
4 голосов
/ 03 октября 2019

Я не уверен, что это вопрос здесь, так что застрелите меня, если это не так!

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

Я могу сделать это с помощью простого цикла For Each, однако из-за размера электронной таблицы это неэффективно.

Option Explicit

Sub ClearCurrency()

    Dim myRange As Range
    Dim cell As Range

    Set myRange = Selection

    For Each cell In myRange
        If cell.NumberFormat = "$#,##0.00" Then
            cell.ClearContents
        End If
    Next cell

End Sub

Я прочитал о VarTypes и .NumberFormat , но я не могу собрать более эффективное решение.

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

Ответы [ 2 ]

4 голосов
/ 03 октября 2019

Как предлагается в комментариях, вы можете использовать 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, как предлагается в текущем решении.

1 голос
/ 03 октября 2019

Это будет делать:

Set myRange = Selection

Application.FindFormat.NumberFormat = "$#,##0.00"
myRange.Replace What:="*", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...