2016-11-21 5 views
0

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

Sheet1.Range("A1").Value = Sheet1.Range("B1").Value 

или

Sheet1.Range("A1").Copy Destination:=Sheet1.Range("B1") 

быстрее:

Sheet1.Range("A1").Copy 
Sheet1.Range("A1").PasteSpecial xlPasteValues 
Application.CutCopyMode=False'Clear Clipboard 

сейчас , Мне необходимо сделать копию со следующими параметрами:

Range("A1").Select 
Selection.Copy 

Range("B1").Select 
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ 
     False, Transpose:=False 

Можно ли перевести это в код, похожий на один из предыдущих?

Также, что касается циклов. Как правило, быстрее избегать их (если это возможно) или как оптимизируется компилятор? Позвольте мне привести вам пример, чтобы вы меня не поняли:

Допустим, я хочу скопировать значения из «A1: A200» в «B1: B200». Какой метод тогда будет лучше вообще?

Dim counter As Integer 
For counter = 1 To 200 
Sheet1.Range("A" & CStr(counter)) = Sheet1.Range("B" & CStr(counter)) 
End counter 

Или лучше просто использовать код:

Sheet1.Range("A1:A200").Copy Destination:=Sheet1.Range("B1:200") 

Эти примеры являются причиной чрезвычайно упрощенной, но если кто-то может помочь мне понять принципы, примененные, это будет иметь большое значение для меня!

+3

Самый быстрый способ скопировать весь диапазон будет использовать 'Таблицы (« Лист1 »). Диапазон (« A1: A200 »). Значение = Листы (« Лист1 »). Диапазон (« B1: B200 »). ', если вы хотите только скопировать значения –

+0

A с циклом - это просто группировка команд, применяемых к подобному листу, например. Поэтому это технически быстрее, чем выписывать каждый код за строкой и выполнять их. – user1

+0

Копирование диапазона будет меня быстрее, чем циклическое копирование. Но истинная функция, которая уменьшит время копирования, должна быть деактивацией обновления экрана (Application.ScreenUpdating = False перед копией и Application.ScreenUpdating = True после копирования). –

ответ

0

Прежде всего не используйте Select и Selection. Это действительно замедляет ваш код. Особенно в петлях.

Самый быстрый способ копирования значения это просто сделать это Range("B1:B99").Value=Range("A1:A99").Value

Кроме того, вы должны отключить ScreenUpdating и особенно, если формулы referr в области пасты отключить автоматический расчет листа: Application.ScreenUpdating=False Application.Calculation=xlCalculationManual

В общей сложности это должно выглядеть примерно так:

Sub CopyFast() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    ActiveSheet.Range("B1:B99") = ActiveSheet.Range("A1:A99") 

    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 
End Sub 

Но это действительно важно при копировании огромных количеств значений, например в цикле вместо простой задачи копирования в этом примере.

+0

Спасибо за ваш ответ. Я закончил работу с отключенным интерфейсом и прямыми командами копирования. Лист теперь занимает 1 минуту для выполнения вместо 5 минут (на быстром компьютере). Он включает в себя циклы, различные вызовы функций и множество листов. Это очень помогло! – bgaard

Смежные вопросы