Excel 2010 VBA。从Sheet中连接2列并将它们粘贴到另一列中

时间:2013-11-13 14:36:52

标签: excel vba excel-2010 concatenation

使用Excel 2010,我正在尝试创建一个脚本,用于连接Sheet1中的两个文本列(A和B),并将结果粘贴到Sheet2的A列中。

工作簿使用外部数据源来加载两列,因此行数不固定。

我尝试过以下代码,但无法正常工作。变量lRow没有任何价值。

Sub Concat()
Sheets("Sheet1").Select
Dim lRow As Long
lRow = Range("A" & Rows.count).End(xlUp).Row
For i = 2 To lRow
    ActiveWorkbook.Sheets("Sheet2").Cells(i, 1) = Cells(i, 1) & Cells(i, 2)
Next i

End Sub

我做错了什么。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

至于你做错了什么,我建议你用

Sub Concat()
    Sheets("Sheet1").Select
    Dim lRow As Long, i As Long
    Dim rng As Range
    Set rng = Range("A" & Rows.Count).End(xlUp)
    Debug.Print rng.Address(External:=True)
    lRow = rng.Row
    For i = 2 To lRow
        ActiveWorkbook.Sheets("Sheet2").Cells(i, 1) = Cells(i, 1) & Cells(i, 2)
    Next i
End Sub

看看发生了什么。我尝试了你所使用的,它对我有用(Excel 2010)。

指定“变量lRow没有取任何值”的意思会有所帮助。

您也可以尝试

Sub Concat2()
    Sheets("Sheet1").Select
    Dim lRow As Long, i As Long
    Dim rng As Range
    Set rng = Range("A2").End(xlDown)
    Debug.Print rng.Address(External:=True)
    lRow = rng.Row
    For i = 2 To lRow
        ActiveWorkbook.Sheets("Sheet2").Cells(i, 1) = Cells(i, 1) & Cells(i, 2)
    Next i
End Sub

如果您在源列A的中间没有空白单元格,则应该给出相同的结果。

答案 1 :(得分:0)

我建议退出XL VBA编程的.Select方法,转而采用直接寻址方式,不会让您误入歧途。

Sub Concat()
    Dim i As Long, lRow As Long
    With Sheets("Sheet1")
        lRow = .Range("A" & Rows.Count).End(xlUp).Row
        For i = 2 To lRow
            Sheets("Sheet2").Cells(i, 1) = .Cells(i, 1) & .Cells(i, 2)
        Next i
    End With
End Sub

请注意前缀.Cells.Range的句点(又名。或句号)。告诉.Cells和.Range它们属于With ... End With块中引用的工作表;在此示例中为Sheets("Sheet1")

如果要将很多行串在一起,最好从Sheet1创建值数组并处理内存中的串联。拆分连接值并将它们返回到Sheet2。

Sub concat2()
    Dim c As Long, rws As Long, vCOLab As Variant
    With Sheets("Sheet1")
        rws = .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Rows.Count
        vCOLab = .Range("A2").Resize(rws, 3)
        For c = LBound(vCOLab, 1) To UBound(vCOLab, 1)
            'Debug.Print vCOLab(c, 1) & vCOLab(c, 2)
            vCOLab(c, 3) = vCOLab(c, 1) & vCOLab(c, 2)
        Next c
    End With
    Sheets("Sheet2").Range("A2").Resize(rws, 1) = Application.Index(vCOLab, , 3)
End Sub

与工作表交互时,批量操作每次都会打圈;唯一的问题是多少。