Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 连接目标列中的值_Vba_Excel_Loops_Concatenation - Fatal编程技术网

Vba 连接目标列中的值

Vba 连接目标列中的值,vba,excel,loops,concatenation,Vba,Excel,Loops,Concatenation,我在VBA代码方面遇到了问题:有一个Excel工作表(Sheet1),其中包含两个基本列(姓和名) 我想做的是,每当你向列表中添加另一个姓和名时,它们都会自动连接到另一个表中,并形成一个新的列表(该列表的起始位置是Sheet11.Range(“AB3”),在位置AB2上是列表标题“Clients”) 因此,我的代码被输入到表1: Private Sub Worksheet_Change(ByVal Target As Range) Dim tmp As Range For Each tmp

我在VBA代码方面遇到了问题:有一个Excel工作表(
Sheet1
),其中包含两个基本列(姓和名)

我想做的是,每当你向列表中添加另一个姓和名时,它们都会自动连接到另一个表中,并形成一个新的列表(该列表的起始位置是
Sheet11.Range(“AB3”)
,在位置
AB2
上是列表标题“Clients”)

因此,我的代码被输入到
表1

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
Private子工作表\u更改(ByVal目标作为范围)
调暗tmp作为范围
对于表1.范围(“C4:C100”)中的每个tmp
如果tmp.Value“”和tmp.Offset(0,1).Value“”,则
表11.单元格(单元格(Rows.Count,“AB”).End(xlUp).行+1,“AB”).Value=tmp.Value&“&tmp.Offset(0,1).Value
如果结束
下一个tmp
端接头
不幸的是,在代码处于活动状态时,只要输入名字和姓氏,串联的名字就不会一一列出,但列表中的姓氏将替换
AB2
中的列表标题


我猜问题出在循环过程的某个地方,但我似乎无法理解它背后的逻辑。如果有任何解决这个问题的建议,我将不胜感激

问题在于以下指令

Sheet11.Cells(Cells(Rows.Count, "AB").End(xlUp).Row + 1, "AB").Value
每次重复循环时返回相同的单元格。例如,您可以将整行替换为:

Range("AB" & tmp.Row).Value = tmp.Value & " " & tmp.Offset(0, 1).Value
无论何时使用事件宏更改同一工作表上单元格的值,都需要关闭事件处理,否则值更改将触发新事件,工作表的更改将尝试在其自身上运行。这也适用于包含工作表更改的其他工作表,除非您希望更改值以强制事件。类似地,目标可以表示多个单元格(例如粘贴操作),因此您需要处理交集中的单个单元格,而不是整个交集

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

我使用了字符串连接机制。虽然任何字符都可以作为连接中的连接器提供,但默认值是空格。

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

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

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