我遇到了VBA代码的麻烦:有一张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
不幸的是,只要我先进入&amp;此代码处于活动状态时,姓氏不会一个接一个地列出,但列表中的姓氏将替换AB2
中的列表标题。
我想问题出在循环过程中的某个地方,但我似乎无法弄清楚它背后的逻辑。我会感谢任何解决这个问题的建议!
答案 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