连接目标列中的值

时间:2015-10-04 21:43:51

标签: excel vba excel-vba loops concatenation

我遇到了VBA代码的麻烦:有一张Excel表格(Sheet1)包含两个基本列(姓氏和名字)

name list

我要做的是,无论何时向列表中添加另一个姓氏和名字,它们都会自动在另一个表格中连接并形成一个新列表(该列表的起始位置为Sheet11.Range("AB3") ,位置AB2是列表标题“客户”)。

因此我的代码已输入Sheet1

Private Sub Worksheet_Change(ByVal Target As Range)

Dim tmp As Range
For Each tmp In Sheet1.Range("C4:C100")
If tmp.Value <> "" And tmp.Offset(0, 1).Value <> "" Then
Sheet11.Cells(Cells(Rows.Count, "AB").End(xlUp).Row + 1, "AB").Value = tmp.Value & " " & tmp.Offset(0, 1).Value
End If
Next tmp

End Sub

不幸的是,只要我先进入&amp;此代码处于活动状态时,姓氏不会一个接一个地列出,但列表中的姓氏将替换AB2中的列表标题。

concatenated name list

我想问题出在循环过程中的某个地方,但我似乎无法弄清楚它背后的逻辑。我会感谢任何解决这个问题的建议!

3 个答案:

答案 0 :(得分:0)

问题在于以下说明

Sheet11.Cells(Cells(Rows.Count, "AB").End(xlUp).Row + 1, "AB").Value
每次循环重复时,

返回相同的单元格。您可以替换此整行,例如:

Range("AB" & tmp.Row).Value = tmp.Value & " " & tmp.Offset(0, 1).Value

答案 1 :(得分:0)

每当您使用Worksheet_Change事件宏来更改同一工作表上的单元格值时,您需要关闭事件处理,否则值更改将触发新事件,而Worksheet_Change将尝试在顶部运行本身。对于包含Worksheet_Change的其他工作表,这也适用,除非您希望更改值以强制执行该事件。同样,目标可以代表多个单元格(例如粘贴操作),因此您需要处理相交中的单个单元格,而不是整个交叉点。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns("B:C")) Is Nothing Then
        On Error GoTo bm_Safe_exit
        Application.EnableEvents = False
        Dim bc As Range
        For Each bc In Intersect(Target, Columns("B:C"))
            Sheet11.Cells(bc.Row, "AB") = _
              Join(Array(Cells(bc.Row, "B").Value2, Cells(bc.Row, "C").Value2))
        Next bc
    End If
bm_Safe_exit:
    Application.EnableEvents = True
End Sub

我已使用Join Function作为字符串连接机制。虽然任何字符都可以作为加入中的连接器提供,但默认为空格。

答案 2 :(得分:0)

我建议更快的更改事件 - 您不需要为每次更新循环遍历所有行

这将添加新条目并更新现有条目:

Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If .CountLarge = 1 And .Row >= 3 And (.Column = 3 Or .Column = 4) Then
            Dim cel As Range
            Set cel = Cells(.Row, 3)
            If Len(cel) > 0 And Len(cel.Offset(0, 1)) > 0 Then
                Worksheets("Sheet11").Range("AB" & .Row) = cel & " " & cel.Offset(0, 1)
            End If
        End If
    End With
End Sub