2017-02-17 3 views
0

Я использую цикл вместо copyfromrecordset для двух столбцов, которые прерывают copyfromrecordset по неизвестной причине. Когда я прохожу через это, требуется более двух минут, чтобы сделать 800 строк, которые кажутся очень медленными. Copyfromrecordset может ввести 800 строк в 10 раз больше столбцов менее чем за 20 секунд. Может ли кто-нибудь сказать, что делает цикл настолько медленным?Slow VBA Loop - Paste from Recordset

Set rng = Activesheet.Range("P2") 
Row = 0 
Do While Not Rs1.EOF 
    For col = 0 To Rs1.Fields.Count - 1 
      rng.Offset(Row, col).Value = Rs1(col) 
    Next col 
    Row = Row + 1 
    Rs1.MoveNext 
Loop 
+1

Это медленный, потому что он обращается к каждому отдельному полю в наборе записей и обновляет рабочий лист для каждого отдельного поля. ('CopyFromRecordset' просто переносит весь набор записей на рабочий лист за один шаг передачи.) – YowE3K

+1

Используете ли вы один адрес ячейки при попытке« CopyFromRecordset »? 'CopyFromRecordset' лучше всего работает, когда диапазон относится к левой левой ячейке, независимо от размера набора записей. Если 'CopyFromRecordset' вызывает проблемы, вы можете рассмотреть функцию« GetRows », которая вернет данные в виде массива, тогда вам нужно будет перенести массив и вставить массив * whole * за один шаг. – ThunderFrame

+0

Я большой поклонник этого предложения ^^^^^^^ –

ответ

1

Благодаря @ThunderFrame мне удалось решить мою проблему. Как сказал @ YowE3k, мой запрос делал все по одному. Поэтому я меняю код на использование .getrows.

'Pasting data Headings then Values 
    ArrRs1 = Rs1.GetRows 
    For intColIndex = 0 To Rs1.Fields.Count - 1 
     Range("A1").Offset(0, intColIndex).Value = Rs1.Fields(intColIndex).Name 
    Next 

    Dim PasteArray As Variant 

    ReDim PasteArray(1 To UBound(ArrRs1, 2), 0 To UBound(ArrRs1, 1)) 
    For i = 1 To UBound(ArrRs1, 2) 
     For j = 0 To UBound(ArrRs1, 1) 
      PasteArray(i, j) = ArrRs1(j, i) 
     Next 
    Next 

'This is pasting the data 
     ActiveSheet.Range("A2").Resize(UBound(PasteArray, 1) + 1, UBound(PasteArray, 2) + 1) = PasteArray 
0

У меня нет большого опыта работы с copyfromrecordset; однако, если в каждой строке появляется всплывающее окно, вы можете отключить его и, вероятно, увидеть некоторое улучшение скорости. Это помогло мне с «Do Until»/«Loop», ранее.

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

application.screenupdating = false 
Application.Calculation = xlCalculationManual 

'your code' 

application.screenupdating = true 
Application.Calculation = xlCalculationAutomatic