This site will look better if you upgrade to a browser that supports web standards.
As with the hard-coded version, this macro will merge the values in each row of the Selection, if no range is provided. However, it will also accept a range to merge , and a delimiter, as arguments.
If called from VBA, a delimiter string can be inserted between values by specifying it in the second argument.
Note, this Sub uses optional arguments to provide flexibility. That, however, prevents the macro from being listed in the macro list. You can still type the name of the macro in and click , or, you can create a wrapper that you can attach to a button, menu item or keyboard shortcut (see below).
'************************************************************************** 'Purpose: Merge values in a multi-column array into the first column 'Inputs: rRng (optional): the range to merge. If not provided, the Selection. ' sDelim (optional): A delimiter string to go between values. 'Returns: Merged values in column 1 of rRng '************************************************************************** Public Sub ColumnsToText(Optional rRng As Range, _ Optional sDelim As String = "") 'J.E. McGimpsey http://www.mcgimpsey.com/excel/mergedata1.html Dim vTxtArr As Variant Dim nTop As Long Dim i As Long Dim j As Integer If rRng Is Nothing Then Set rRng = Selection Set rRng = Intersect(rRng, rRng.Parent.UsedRange) vTxtArr = rRng.Value nTop = UBound(vTxtArr, 1) For i = 1 To nTop For j = 2 To UBound(vTxtArr, 2) vTxtArr(i, 1) = vTxtArr(i, 1) & sDelim & vTxtArr(i, j) Next j Next i ReDim Preserve vTxtArr(1 To nTop, 1 To 1) rRng.Resize(, 1).Value = vTxtArr End Sub
An example of a wrapper macro might be
Public Sub CTT_Button_Click() ColumnsToText Selection, " " End Sub
which you could place in your Personal Macro Workbook (Personal.xls for WinXL) and attach to a toolbar button to merge with spaces in between cell entries.
Again, like the hard-coded macro, this macro merges the entire Selection or other range you specify into one cell (and again, since there are optional arguments, it won't show up in your dialog, but you can still type the name MergeToOneCell in the textbox and click , or you can attach the macro to a toolbar button, menu item, or keyboard shortcut). If run from code, it can insert a delimiter between cells:
'************************************************************************** 'Purpose: Merge cells, retaining all data 'Inputs: rRng (optional): the range to merge. If not provided, the Selection. sDelim (optional): A delimiter string to go between values. 'Returns: Merged values in the first cell of rRng '************************************************************************** Public Sub MergeToOneCell(Optional rRng As Range, _ Optional sDelim As String = "") 'J.E. McGimpsey, http://www.mcgimpsey.com/excel/mergedata1.html Dim rCell As Range Dim sMergeStr As String If rRng Is Nothing Then Set rRng = Selection With rRng For Each rCell In .Cells sMergeStr = sMergeStr & sDelim & rCell.Text Next rCell Application.DisplayAlerts = False .Merge Across:=False Application.DisplayAlerts = True .Item(1).Value = Mid(sMergeStr, 1 + Len(sDelim)) End With End Sub
As above, you could use a wrapper macro to merge the selected cells with a space or other delimiter.
This page last updated
© Copyright 2001 - 2004 McGimpsey and Associates. Except where noted, all code on this site may be distributed under the Gnu GPL. Acknowledgement is appreciated.
Unfamiliar with macros? Check out David McRitchie's Getting Started with Macros and User Defined Functions