2013-04-10 2 views
1

Я писал макрос, который вставляет новую строку в праздничный лист для нового рекрута, теперь он отлично работает, но теперь он останавливается и занимает огромное количество времени, чтобы вставьте новую строку. Вот пораженный код:Макро работает очень медленно

For f = 1 To Worksheets.Count - 1 

    Worksheets(f).Select 

    Range("A1").Select 

    If Worksheets(f).Name = "FLEXI" Then 

     Range("A1").Select 
     N = Range("A2").Value 
     Range("A" & NewRow).Select 
     Selection.EntireRow.Insert 
     Range("A" & NewRow + N + 1).Select 
     Selection.EntireRow.Insert 
     GoTo flexidivert 
    End If 

Range("A" & NewRow).Select 
Selection.EntireRow.Insert 

flexidivert: 
Next f 

Я ScreenUpdating инвалидов, enableevents инвалидов и расчеты в ручной режим, так что обычные подозреваемые не на работе здесь. Это такая простая процедура, я не могу понять, почему для вычисления требуется несколько минут. NewRow - это строка, которую нужно вставить, и workheets.count = 5, чтобы прокручивалось огромное количество.

+2

Использование .select действительно С.Л. ows вниз код ... См. эту ссылку http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select/10718179#10718179 –

+0

Почему вам нужно прокручивать листы, если вы знаете name, почему бы просто не ссылаться на рабочий лист напрямую и не выбирать его. –

+0

Кроме того, я думаю, что каждый раз, когда вы вставляете строку, механизм расчета Excels проверяет все ячейки, и все имена диапазонов переопределены ... поэтому, если у вас есть какие-либо формулы, сначала отключите автоматический расчет –

ответ

1

В дополнение к моим замечаниям выше, это то, что вы пытаетесь сделать?

For f = 1 To Worksheets.Count - 1 
    With Worksheets(f) 
     .Range("A" & NewRow).EntireRow.Insert 

     If .Name = "FLEXI" Then 
      N = .Range("A2").Value 
      .Range("A" & NewRow + N + 1).EntireRow.Insert 
     End If 
    End With 
Next f 

Я предполагаю, что вы указали все свои переменные правильно, а Cell A2 имеет числовые значения.

+0

. Я знаю, что использование select может замедлить его, но не в той степени, в которой оно выполняется, для его завершения требуется несколько минут. Благодарим вас за решение, я вернусь к предыдущей версии, но имеет тот же код, но не имеет скорости. – user1545643

+0

Вы попробовали вышеуказанный код? –

0

попробуйте ниже

Worksheets("FLEXI").select 
N = Range("A2").Value 
Range("A" & NewRow).EntireRow.Insert shift:=xldown 
Range("A" & NewRow + N + 1).EntireRow.Insert shift:=xldown 
Range("A" & NewRow).EntireRow.Insert shift:=xldown 

нет необходимости, чтобы выбрать ячейку перед использованием INSERT

также, если вы знаете имя woreksheet нет необходимости в цикле, просто ссылаться на него непосредственно через коллекцию

НТН

Филипп

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