2015-10-04 19 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