2015-10-16 63 views
1

Per @ ScottHoltzman的建議。我從一本書到另一本書設置了某些專欄。 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)轉化爲

的解決方案「從第1列和2 200個多萬行」,你發現效果很好,但它不是動態的(硬編碼的最後一行)

這是怎麼了我會設置列的副本:

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

當然,如果可能的話,儘量避免使用'Union',因爲它在幕後做了很多工作(檢查每個範圍中的每個單元格以組合起來看看是否有行或列重疊;與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