Concatenate multiple ranges using vba

前端 未结 9 1269
臣服心动
臣服心动 2020-12-03 03:51

I have a number of ranges to concatenate independently and put the values of the concatenated ranges into different cells.

I want to:
concatenate values in Range

相关标签:
9条回答
  • 2020-12-03 04:47

    Thanks for everything guys, for my purpose I have modified your suggestions and amended my code as it didn't quite fit into a neat function as I needed it to be more dynamic. See my code below. It does exactly what I need.

    Sub concatenate()
    
    Dim x As String
    Dim Y As String
    
    For Q = 1 To 10 'This provides a column reference to concatenate - Outer For statement
    For T = 1 To 10 'This provides a rows reference to concatenate - Inner for statement
    
    For Each Cell In Cells(T, Q) 'provides rows and column reference
    If Cell.Value = "" Then GoTo Line1   'this tells the macro to continue until a blank cell is reached
    x = x & Cell.Value & ","   'This provides the concatenated cell value and comma separator
    Next ' this loops the range
    
    Next T  'This is the inner loop which dynamically changes the number of rows to loop until a blank cell is reached
    
    Line1:
    On Error GoTo Terminate 'Terminates if there are less columns (max 10) to concatenate
    
    ActiveCell.Value = Mid(x, 1, Len(x) - 1) 'This basically removes the last comma from the last concatenated cell e.g. you might get for a range 2,3,4, << this formula removes the last comma to
    'give 2,3,4
    
    ActiveCell.Offset(1, 0).Select 'Once the concatenated result is pasted into the cell this moves down to the next cell, e.g. from F1 to F2
    
    x = ""  'The all important, clears x value after finishing concatenation for a range before moving on to another column and range
    
    
    Next Q 'After one range is done the second column loop kicks in to tell the macro to move to the next column and begin concatenation range again
    
    Terminate: 'error handler
    End Sub
    
    0 讨论(0)
  • 2020-12-03 04:49

    Function ConcatenateRange to concatenate all cells in range if they are not empty and empty "" string.

      Function ConcatenateRange(cellRange As Range, Optional Delimiter As String) As String
        Dim cel As Range, conStr As String
    
        conStr = ""
        If Delimiter <> "" Then
          For Each cel In cellRange
            If VarType(cel) <> vbEmpty And Trim(cel) <> "" Then conStr = conStr & cel & Delimiter
          Next
          ConcatenateRange = Left(conStr, Len(conStr) - Len(Delimiter))
        Else
          For Each cel In cellRange
            If VarType(cel) <> vbEmpty And Trim(cel) <> "" Then conStr = conStr & cel
          Next
          ConcatenateRange = conStr
        End If
    End Function
    
    0 讨论(0)
  • 2020-12-03 04:50

    it is similar to the idea posted here already. However, I use a for each loop instead of an array setup with nested for loops.

    Function ConcRange(ByRef myRange As Range, Optional ByVal Seperator As String = "")
    
    ConcRange = vbNullString
    
    Dim rngCell As Range
    
    For Each rngCell In myRange
        If ConcRange = vbNullString Then
            If Not rngCell.Value = vbNullString Then
                ConcRange = CStr(rngCell.Value)
            End If
        Else
            If Not rngCell.Value = vbNullString Then
                ConcRange = ConcRange & Seperator & CStr(rngCell.Value)
            End If
        End If
    Next rngCell
    
    
    End Function
    

    This, I suppose would be faster than the array set up, as a new array is not created each time this function runs.

    0 讨论(0)
提交回复
热议问题