联合两个excel表的更好方法

时间:2016-05-16 09:20:56

标签: excel excel-vba vba

我有两张桌子

A B C
姓氏地址

A B C D
id地址名字姓氏

我需要联合表并匹配cols,所以
table1,colA = table2,colC
table1,colC = table2,colB
等等

我使用这个代码,它工作正常,但对于大数据来说很慢

Sub unionrep()

Dim lastRow As Long

Sheets("decl").Select
With ActiveSheet
    lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row
End With

With Sheets("onl")
    tlastRow = .Cells(.Rows.Count, "b").End(xlUp).Row
End With

 For i = 1 To lastRow
 Sheets("onl").Range("a" & tlastRow + i + 1).Value = Range("a" & i).Value
 Sheets("onl").Range("b" & tlastRow + i + 1).Value = Trim(Range("b" & i).Value)
 Sheets("onl").Range("c" & tlastRow + i + 1).Value = "*" & Range("c" & i).Value
 Sheets("onl").Range("d" & tlastRow + i + 1).Value = Range("g" & i).Value
 Sheets("onl").Range("e" & tlastRow + i + 1).Value = Range("d" & i).Value
 Sheets("onl").Range("f" & tlastRow + i + 1).Value = ""
 Sheets("onl").Range("g" & tlastRow + i + 1).Value = ""
 Sheets("onl").Range("h" & tlastRow + i + 1).Value = ""
 Sheets("onl").Range("i" & tlastRow + i + 1).Value = Range("e" & i).Value
 Sheets("onl").Range("j" & tlastRow + i + 1).Value = Range("i" & i).Value
 Sheets("onl").Range("k" & tlastRow + i + 1).Value = Range("f" & i).Value

 Next

 Sheets("onl").Select
 End Sub

2 个答案:

答案 0 :(得分:0)

您可以复制并粘贴整个范围,而不是循环遍历行。例如,要从“decl”工作表中的A列复制到“onl”工作表中的C列,请执行以下操作:

Sheets("decl").Range(Cells(1, 1), Cells(lastRow, 1)).Copy
Sheets("onl").Range("C" & tlastRow + 1).PasteSpecial

答案 1 :(得分:0)

尝试使用数组:

Sub unionrep()

    Dim lastRow               As Long
    Dim vDataIn, vDataOut

    With Sheets("decl")
        lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row
        vDataIn = .Range("A1:I" & lastRow).Value
    End With

    ReDim vDataOut(1 To lastRow, 1 To 11)

    With Sheets("onl")
        tlastRow = .Cells(.Rows.Count, "b").End(xlUp).Row + 1
    End With

    For i = 1 To lastRow
        vDataOut(i, 1) = vDataIn(i, 1)
        vDataOut(i, 2) = Trim(vDataIn(i, 2))
        vDataOut(i, 3) = "*" & vDataIn(i, 3)
        vDataOut(i, 4) = vDataIn(i, 7)
        vDataOut(i, 5) = vDataIn(i, 4)
        vDataOut(i, 9) = vDataIn(i, 5)
        vDataOut(i, 10) = vDataIn(i, 9)
        vDataOut(i, 11) = vDataIn(i, 6)

    Next
    Sheets("onl").Range("a" & tlastRow).Resize(UBound(vDataOut, 1), UBound(vDataOut, 2)).Value = vDataOut
    Sheets("onl").Select
End Sub