2016-12-22 173 views
2

我有一個關於在我的工作表中顯示特定單元格內的選擇值的問題(現在我們稱之爲J1) 那麼,如果用戶通過拖動選擇(通過鼠標)A1,A2,A3,A4J1值將顯示"A1:A4",之後用某些VBA代碼連接這些單元格以顯示由「;」分隔的單元格值。 問題是,當用戶選擇的單元格不按順序時(通過按住CTRL鍵),就像A1,A5,A11一樣。 J1值連接時會顯示"A1,A5,A11",它會給出「#VALUE」錯誤。EXCEL VBA |單元格等於選擇

我們可以用單元格值來替換這裏的每個單元格引用嗎? 並將「逗號」保持原樣。 後來我們可以用Subtitute逗號加上「;」

原諒我,如果我的問題似乎有點有點懵:)

我的選擇代碼:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim rng As Range 
Dim s As String 
Set rng = Application.Selection 
If rng.Count < 2 Then 
Range("H1").Value = Cells(Target.Row, Target.Column).Value 
Else 
Range("H1").Value = rng.Address 
End If  
End Sub 

代碼串聯:

Function ConcatenateRange(ByVal cell_range As Range, _ 
        Optional ByVal seperator As String) As String 

Dim cell As Range 
Dim lastrow 
Dim choice 
Dim lastrowmodified 
Dim rangy 

Dim newString As String 
Dim cellArray As Variant 
Dim i As Long, j As Long 

cellArray = cell_range.Value 

For i = 1 To UBound(cellArray, 1) 
    For j = 1 To UBound(cellArray, 2) 
     If Len(cellArray(i, j)) <> 0 Then 
      newString = newString & (seperator & cellArray(i, j)) & ";" 
     End If 
    Next 
Next 

If Len(newString) <> 0 Then 
    newString = Right$(newString, (Len(newString) - Len(seperator))) 
End If 

ConcatenateRange = newString 

End Function 

回答

3

如果我理解正確的話,你想一個單元格,例如J1包含選定單元格的所有,用分號分隔?如果是這樣,你可以修改你的第一個sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    Dim rng As Range 
    Set rng = Application.Selection 
    Dim vCell as Range 

    Range("J1").Value = "" 

    ' Cycle through cells in range 
    For each vCell in rng 

     ' Use if so that J1 doesn't start with a semi colon 
     If Range("J1").Value = "" Then 
      Range("J1").Value = vCell.Value 
     Else 
      Range("J1").Value = Range("J1").Value & ";" & vCell.Value 
     End If 


    Next vCell 

End Sub 
+0

是的!確切地說,這是我想要實現的。像魅力一樣工作。非常感謝你的配偶:) –

+0

@MohamedHussien沒問題,歡呼回饋 – Wolfie

3

另一種方法是結合使用一個字符串數組與JOIN功能。這適用於非連續的選擇:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

Dim c as Range, i as Integer 
Dim arr() As String 
ReDim arr(0 To Selection.Count - 1) As String 

If Selection.Count < 2 Then 
    Range("J1").Value = Selection.Value 
Else 
    For Each c In Selection.Cells 
     arr(i) = c.Value 
     i = i + 1 
    Next c 
    Range("J1").Value = Join(arr, ";") 
End if 

End Sub 
+1

那也和我一起工作,看起來比我想象的要容易得多。感謝您的時間伴侶:) –