Как оптимизировать эту простую, но ужасную реализацию? - PullRequest
2 голосов
/ 27 июля 2011

Я в основном хочу удалить формулу из ячеек, но хочу сохранить вычисленные значения.

ТАК, я реализовал ее легко, и она прекрасно работает, но ДЕЙСТВИТЕЛЬНО МЕДЛЕННО. (около 2 минут для 1800 ячеек)

У меня есть:

Dim col As Excel.Range = getRange()
For Each cell In col
    cell.Value = cell.Value
Next

Я попытался сделать это с первой ячейкой, а затем автоматически заполнить остальные, но это скопировало значение1-я ячейка для остальных ячеек в столбце.

Итак, что мне делать, чтобы сделать это быстро ..

Я думаю, что должно быть что-то, связанное с автозаполнением, которое должно делатьхитрость.

Пожалуйста, помогите !!

Ответы [ 7 ]

8 голосов
/ 27 июля 2011

Если вам случайно известен точный адрес вашего диапазона, или вы можете его получить (может быть, с помощью getRange ()?), Мне показалось, что это удаляет формулу из ячеек, сохраняя результат:

Worksheets("Sheet1").Range("A1:F15").Value = Worksheets("Sheet1").Range("A1:F15").Value
8 голосов
/ 27 июля 2011

Иногда Excel пересчитывает весь лист после внесения изменений.Временное отключение автоматического пересчета во время выполнения таких операций может значительно сократить время выполнения.

Согласно этому сообщению на форуме это можно сделать с помощью:

Application.Calculation = xlManual 
 ' code here
Application.Calculation = xlAutomatic
6 голосов
/ 27 июля 2011

Я заметил, играя с Excel VBA, что действительно больше, чем несколько строк кода, можно перетаскивать, но, безусловно, наибольшее увеличение «скорости выполнения»:

Sub NoScreenRePainting()
    Application.ScreenUpdating=False

    'Your code here.

    Application.ScreenUpdating=True
End Sub

Другие предложения: http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm

4 голосов
/ 27 июля 2011

Как упомянуто @Stuart ... вставьте Special как значения ...

Dim oRange As Excel.Range

Set oRange = getRange()

oRange.Copy
oRange.PasteSpecial xlPasteValues

Обратите внимание, что использование буфера обмена может быть сложным ... надеюсь, кто-то еще знает (быстрый) способ сделать это без его использования.

3 голосов
/ 27 июля 2011

Убедитесь, что все ваши формулы вычислили свои значения, затем скопируйте и вставьте их как значения, чтобы удалить формулы и оставить только вычисленные значения. Вот пример:

Public Sub RemoveFormulas()

    Dim RangeWithFormulas As Range

    Set RangeWithFormulas = ThisWorkbook.Sheets("Test").Range("A1:A1800")

    RangeWithFormulas.Copy

    RangeWithFormulas.Range("A1").PasteSpecial xlPasteValues

End Sub
3 голосов
/ 27 июля 2011

Не проще ли выбрать диапазон значений, Copy, а затем Paste Special / Values? Это заменяет формулу значением и должно быть более или менее мгновенным.

0 голосов
/ 27 июля 2011

Я рекомендую вам выбрать все ячейки с формулами и вставить значения, попробуйте это:

Sub RemoveFormula()
Dim cell As Range
    'Excel function to select cells with formulas
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select 

    For Each cell In Selection
        cell.Value = cell.Value
    Next cell
End Sub

Чистые и простые результаты.

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