2015-10-16 4 views
1

По предложению Скотта Хольцмана. Я устанавливаю определенные столбцы из одной книги в другую книгу. resize оказывается очень медленным. Что такое более быстрый метод? Вероятно, мне нужно всего 200 строк максимум от каждого столбца.Быстрая альтернатива `resize`?

With ws 
     .Columns(Start).Resize(, 2).Value = book.Worksheets(wsName & "-F").Columns("A:B").Value 
     .Columns(Start + label).Resize(, cols).Value = book.Worksheets(wsName & "-F").Columns(Start + label).Resize(, cols).Value 
End With 

ответ

1

Это утверждение ws.Columns(1).Resize(, 2) переводит «2 миллиона + строки из колонки 1 и 2»

решение, которое вы нашли хорошо работает, но это не динамический (жестко последняя строка)

Это как Я бы установил копию колонок:

Option Explicit 

Public Sub copyCols() 
    Dim ws1 As Worksheet, ws2 As Worksheet, rng1 As Range, rng2 As Range 
    Dim cols As Long, lr As Long 

    Dim col1 As Long 'renamed from "Start" (VBA keyword - property) 
    Dim lbl As Long  'renamed from "label" (VBA keyword - Control object) 

    Set ws1 = Sheet1 'ws 
    Set ws2 = Sheet2 'book.Worksheets(wsName & "-F") 

    col1 = 1 
    cols = 2 
    lbl = 1 

    lr = ws2.Cells(ws2.UsedRange.Row + ws2.UsedRange.Rows.Count, "A").End(xlUp).Row 

    Set rng1 = ws1.Range(ws1.Cells(1, col1), ws1.Cells(lr, col1 + 1)) 
    Set rng2 = ws2.Range("A1:B" & lr) 

    rng1.Value2 = rng2.Value2 

    Set rng1 = ws1.Range(ws1.Cells(1, col1 + lbl), ws1.Cells(lr, col1 + lbl + cols)) 
    Set rng2 = ws2.Range(ws2.Cells(1, col1 + lbl), ws2.Cells(lr, col1 + lbl + cols)) 

    rng1.Value2 = rng2.Value2 
End Sub 
+0

Можете ли вы объединить диапазоны? 'set rng1 = Range (ws1.Cells (1, col1), ws1.Cells (lr, col1 + 1)) & Range (ws1.Cells (1, x), ws1.Cells (lr, x + 1))'? Может быть, «союз» впереди? – findwindow

+0

Конечно, но старайтесь избегать «Союза», если это возможно, потому что он выполняет много работы за кулисами (проверяя каждую ячейку каждого диапазона, которая должна быть объединена, чтобы увидеть, перекрываются ли какие-либо строки или столбцы, то же самое с 'Intersect()') , «Союз» наиболее удобен, когда диапазоны (столбцы) не смежны, как столбцы 1, 3, 20, 35. Но если они находятся в одной области, используйте более быструю стандартную нотацию, такую ​​как «A1: C200». Я бы использовал 'Union' для чего-то вроде этого: Set rng = Union (Range (« A1: C200 »), Range (« E1: E200 »), Range (« H1: I200 »))' (я бы заменил 200 с переменной, удерживающей последнюю строку в UsedRange) –

+0

Сброс идеи объединения. Он не работал:/Просто установите два диапазона вместо XD – findwindow

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