2015-10-04 45 views
0

我有一个VBA代码的麻烦:有包含什么我想两个基本列(最后&名字)串联值

name list

一个Excel工作表(Sheet1)做的是,每当你添加另一个姓氏和名字的名单,他们都自动获得在另一片串联,形成一个新的列表(启动该列表中的位置是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 

不幸的是,当我进入第一&姓氏,而这段代码被激活,连在一起的名称未列出一个又一个,但最后的名字在列表中替换列表标题AB2

concatenated name list

我想问题出在循环过程中的地方,但我似乎无法找出一个道理。我会很感激任何建议来解决这个问题!

+1

如上所述这似乎是一个简单的公式就足够了。 – pnuts

回答

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 
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作为字符串连接机制。虽然任何字符都可以在加入作为连接器提供,但默认值为空格。

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