Возникли проблемы с циклом в большом диапазоне в Excel - PullRequest
2 голосов
/ 08 апреля 2020

Этот код перебирает заданный диапазон и преобразует каждое значение в короткое название месяца. Он отлично работает на небольших диапазонах, но я написал его для набора данных, который я получаю на регулярной основе, который составляет более 100 000 строк. Он по-прежнему работает на полном диапазоне, но занимает очень много времени и выглядит так, как будто он дает сбой, но если я подожду около 5 минут, он сработает.

Есть идеи, как мне это улучшить?

Sub ConvertToMonth()

Dim selectedRange As Range

Set selectedRange = Application.Selection

Application.ScreenUpdating = False

For Each Cell In selectedRange
       Cell.Value = MonthName(Cell.Value, True)
Next

Application.ScreenUpdating = True

End Sub

Ответы [ 3 ]

3 голосов
/ 08 апреля 2020

Вам вообще не нужно l oop здесь. Просто примените формат ко всему диапазону одновременно


SelectedRange.NumberFormat = "mmm"
2 голосов
/ 08 апреля 2020

За исключением случаев, когда вам действительно нужно сделать это в VBA, я думаю, вам лучше использовать встроенные функции Excel. На снимке экрана ниже я использовал следующую формулу для C3-C31, чтобы получить Сокращенное имя месяца, в котором указывается дата:

=TEXT(A3,"MMM")

enter image description here

It Это очень быстро и избежать сложностей VBA, если его разработка все еще является проблемой.

Дайте мне знать, если это соответствует вашим потребностям!

NB: то, что я видел с вашей функцией VBA также опасно то, что это разрушительно , я имею в виду , у вас нет возможности отменить его после того, как вы запустите его и оно перезаписывает выбор независимо от того, его содержания . Однако из Excel вы все еще можете отменить его. Но это зависит от вас

1 голос
/ 08 апреля 2020

Ваша проблема связана со скоростью чтения / записи в диапазоне внешнего интерфейса в Excel. Лучший способ приблизиться к обработке больших наборов данных - это использовать массив. Сначала сохраните ваш набор данных в массив, манипулируйте массивом, затем выведите массив. Как и то, что я сделал ниже:

Sub ConvertToMonth()

    Dim selectedRange As Range
    Dim arr() As Variant, i As Long

    Set selectedRange = Application.Selection

    arr = selectedRange.Value

    Application.ScreenUpdating = False

    For i = LBound(arr,1) To UBound(arr,1)
       arr(i,1) = MonthName(arr(i,1), True)
    Next i

    selectedRange.Value = arr

    Application.ScreenUpdating = True

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