2015-06-30 5 views
0

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

Function CopyData() 

sws.Activate 
Range("C4:GF4").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Selection.Copy 

tws.Activate 
Range("A12").Select 
ActiveSheet.Paste 

Range("D12:GD12").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 

End Function 
+0

Сколько времени занимает в настоящее время? Вы пробовали это время? Это не похоже, что это займет много времени. Есть ли другие причины? – L42

+0

Вы попробовали 'application.calculation = xlmanual' перед вставкой? Не забудьте снова включить его в авто. Фактически вы вставляете его в качестве значений, но я предположил, что на листе могут быть другие формулы, которые используют эти значения. – Dubison

+0

Вообще говоря, работа с 'Select' будет замедлять ваш код, поскольку вы изменяете лист excel. Первым шагом, мешающим этому замедлить ваш код, будет 'Application.ScreenUpdating = False' в начале функции. – EngJon

ответ

1

Это должно повысить производительность, и это то, о чем @EngJon говорил о том, что вы не используете select.

Function CopyData() 
    Dim rng As Range 

    Application.ScreenUpdating = False 
    sws.Activate 
    Range("C4:GF" & Range("GF" & Rows.Count).End(xlUp).Row).Copy 
    tws.Activate 
    Range("A12").PasteSpecial Paste:=xlPasteAll 
    Set rng = Range("D12:GD" & Range("GD" & Rows.Count).End(xlUp).Row) 
    rng.Value = rng.Value 
    Application.ScreenUpdating = True 
End Function 
+0

Работает отлично. Большое спасибо! – Victor

+1

Можете ли вы также избавиться от 'Activate'? 'sws.Range (« C4: GF »и sws.Range (« GF »& Rows.Count) .End (xlUp) .Row) .Copy' и' tws.Range («A12»). PasteSpecial Paste: = xlPasteAll 'и' Set rng = tws.Range («D12: GD» & tws.Range («GD» & Rows.Count) .End (xlUp) .Row) '? – ChipsLetten

+0

Вы правы. Благодаря! Работает также! – Victor

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