EXCEL VBA |细胞等于选择

时间:2016-12-22 08:04:28

标签: excel vba excel-vba excel-formula

我有一个关于在我的工作表中的特定单元格内显示选择值的问题。(现在我们称之为J1) 因此,如果用户拖动选择(通过鼠标)A1,A2,A3,A4J1值将显示"A1:A4",之后使用某些VBA代码我将这些单元格连接起来,以显示以“;”分隔的单元格值。 问题是,当用户选择不按顺序的单元格(通过按住CTRL)时,像A1,A5,A11一样。 J1值会在我连接时显示"A1,A5,A11",它会给出“#VALUE”错误。

我们可以用单元格值替换每个单元格引用吗? 然后保留“逗号”。 然后我们可以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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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