2016-07-08 3 views
0

Итак, я написал довольно простой макрос в VBA, который обновляет набор переменных, а затем копирует и вставляет обновленные значения в новый лист. Проблема в том, что объем становится немного подавляющим сейчас, достигнув в Excel максимального предела строки 1 048 576, в результате чего происходит сбой кода.Excel VBA копирует диапазон на новый лист после 1,048,576 строк

Я хотел бы обновить его так, чтобы всякий раз, когда ограничение строк достигнуто, скрипт начинает копировать ячейки на новый лист (скажем, «FinalFile2», «FinalFile3» и т. Д.), Пока он не будет полностью выполнен.

Sub KW() 
' 
' Exact KWs 
' 
Dim i, j, LastRow As Long 
Dim relativePath As String 

i = 2 
j = 2 

'LastRowValue' 
Sheets("Output").Select 
LastRow = Rows(Rows.Count).End(xlUp).Row - 1 

'Clean final output' 
    Sheets("FinalFile").Select 
    Range("A2").Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Selection.ClearContents 
    Range("A1").Select 

'Set Variables in Variables sheet' 

Do 

'Var 1' 
    Sheets("Names").Select 
    Range("A" & i).Select 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("A2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

'Var 2' 
    Sheets("Names").Select 
    Range("B" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("B2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

'Var 3' 
    Sheets("Names").Select 
    Range("C" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("C2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

'Var 4' 
    Sheets("Names").Select 
    Range("D" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("D2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 


'Var 5' 
    Sheets("Names").Select 
    Range("E" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("E2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 


    'Var 6' 
    Sheets("Names").Select 
    Range("F" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("F2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

    'Var 7' 
    Sheets("Names").Select 
    Range("G" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("G2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 


    'Var 8' 
    Sheets("Names").Select 
    Range("H" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("H2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 



    'Var 9' 
    Sheets("Names").Select 
    Range("I" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("I2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 



    'Var 10' 
    Sheets("Names").Select 
    Range("J" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("J2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 



    'Var 11' 
    Sheets("Names").Select 
    Range("K" & i).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("K2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 


'Copy and Paste' 

    Sheets("Output").Select 
    Range("A2:AP2").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Selection.Copy 
    Sheets("FinalFile").Select 
    Range("A" & j).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

'update counters' 

i = i + 1 
j = j + LastRow 

'end of loop condition' 

Sheets("Names").Select 

Loop Until IsEmpty(Cells(i, 1)) 



End Sub 
+0

Как долго это продлится до листа заполнена? Похоже, вам нужно использовать переменный лист и создать новый, один 'j' достигает 1 048 576 и сбросить' j'. Также вы обязательно должны удалить выбор http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros – arcadeprecinct

+0

Также вы не переписываете значения в лист переменных? Все это вставлено в строку 2. – arcadeprecinct

+0

Чем дольше я смотрю на это, тем больше я смущен. Вы копируете много разных строк листа «« Имена »в одну и ту же строку листа« «Переменные» и одну и ту же строку из «Выходного» «листа» в «Окончательный File» 'снова и снова, всегда пропуская Строки 'lastRow' – arcadeprecinct

ответ

0

Вы можете добавить

j = j + lastRow 
If j = 1048576 Then j = 2 

НО вы должны определенно очистить этот код. .selections - очень медленный способ делать такие вещи. Посмотрите на this и старайтесь избегать .Copy & .Paste. Просто установите целевые ячейки в значения вашего источника с помощью =. Это также экономит много времени.

Edit: И, безусловно, посмотрите на ссылку разместил @arcadeprecinct

2

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

  1. Удалить Selection с. Общая картина вместо

    something.Select 
    Selection.Dosomenthing 
    

    использовать

    something.Dosomething 
    

    В вашем случае:

    Sheets("Names").Select 
    Range("A" & i).Select 
    Selection.Copy 
    Sheets("Variables").Select 
    Range("A2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
    

    становится

    Sheets("Names").Range("A" & i).Copy 
    Sheets("Variables").Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
    
  2. Используйте переменные для ссылки на ваши таблицы, как это :

    Dim nameSheet as Worksheet 
    Dim varSheet as Worksheet 
    Dim finalSheet as Worksheet 
    
    Set nameSheet = Sheets("Names") 
    Set varSheet = Sheets("Variables") 
    Set finalSheet = Sheets("FinalFile") 
    

    Теперь вы можете использовать

    finalSheet.Range(...).Pastespecial ... 
    

    и использовать Set finalSheet = Sheets("FinalFile2") когда вы бежите из космоса

  3. Не копируйте клетки рядом друг с другом по одному. Вы копируете ячейку Ai в A2, затем Bi - B2. Просто скопируйте диапазон Ai:Ki в A2:K2 (хотя я не вижу в этом никакого смысла)

  4. Не используйте Copy, если вам это не нужно.Вместо

    someRange.Copy 
    someOtherRange.PasteSpecial Paste:=xlPasteValues 
    

    вы можете использовать

    someOtherRange.Value = someRange.Value 
    

    (убедитесь, что размеры одинаковы)

  5. Screenupdating Отключить с помощью Application.Screenupdating = False (установите его в True после того как вы сделали), когда вам «Делает много вставок. Это может ускорить макрос.

  6. Как ваш фактический вопрос, сделать как следует Том, добавить

    If j > 1048576 Then 
        j = 2 
        Set finalSheet = Sheets("FinalFile2") 'maybe create the new sheet at this point 
    End If