James tiene algunos datos en una hoja de trabajo que está contenida en una serie de filas. Una de las columnas de los datos incluye celdas que tienen varias líneas por celda. (Los datos de la celda se separaron en líneas presionando Alt + Intro entre los elementos). A James le gustaría dividir estos datos en varias filas. Por ejemplo, si hubiera tres líneas de datos en una sola celda en la fila, entonces los datos en esa celda deben dividirse en tres filas.

Excel proporciona una forma práctica de dividir datos en columnas separadas utilizando la herramienta Texto a columnas. Esto se puede usar para dividir los datos según la presencia del carácter ASCII 10, que es lo que Excel inserta cuando presiona Alt + Enter. El problema es que si bien esto divide correctamente los datos en columnas separadas, no los coloca en filas separadas, como solicitó James.

Eso significa que la solución a este problema debe incluir el uso de una macro. Un enfoque se muestra en el siguiente código. En este ejemplo, la macro asume que desea «expandir» todo en la hoja de trabajo, y que los datos en la hoja de trabajo comienzan en la fila 1.

Sub CellSplitter1()

Dim Temp As Variant     Dim CText As String     Dim J As Integer     Dim K As Integer     Dim L As Integer     Dim iColumn As Integer     Dim lNumCols As Long     Dim lNumRows As Long

iColumn = 4

Set wksSource = ActiveSheet     Set wksNew = Worksheets.Add

iTargetRow = 0     With wksSource         lNumCols = .Range("IV1").End(xlToLeft).Column         lNumRows = .Range("A65536").End(xlUp).Row         For J = 1 To lNumRows             CText = .Cells(J, iColumn).Value             Temp = Split(CText, Chr(10))

For K = 0 To UBound(Temp)

iTargetRow = iTargetRow + 1                 For L = 1 to lNumCols                     If L <> iColumn Then                         wksNew.Cells(iTargetRow, L) _                           = .Cells(J, L)

Else                         wksNew.Cells(iTargetRow, L) _                           = Temp(K)

End If                 Next L             Next K         Next J     End With End Sub

Tenga en cuenta que para ejecutar la macro, deberá especificar, utilizando la variable iColumn, la columna que contiene las celdas que se dividirán.

Como está escrito aquí, la macro divide la información en la cuarta columna. Además, las versiones separadas de las celdas se almacenan en una nueva hoja de trabajo, por lo que la hoja de trabajo original no se ve afectada en absoluto.

La macro se basa en el uso de la función Split para dividir las celdas de varias líneas. Esta función solo está disponible a partir de Excel 2000 y no está disponible en Excel para Mac. Además, es posible que desee ejecutar la macro solo en una selección particular de celdas. Para superar todos estos problemas potenciales, querrá considerar la siguiente macro, en su lugar:

Sub CellSplitter2()

Dim iSplitCol As Integer     Dim iEnd As Integer     Dim sTemp As String     Dim iCount As Integer     Dim i As Integer     Dim wksNew As Worksheet     Dim wksSource As Worksheet     Dim lRow As Long     Dim lRowNew As Long     Dim lRows As Long     Dim lRowOffset As Long     Dim iTargetRows As Integer     Dim iCol As Integer     Dim iCols As Integer     Dim iColOffset As Integer     Dim AWF As WorksheetFunction

On Error GoTo ErrRoutine     Application.ScreenUpdating = False

'Set Column to split     iSplitCol = 4

iCols = Selection.Columns.Count     lRows = Selection.Rows.Count

iColOffset = Selection.Column - 1     lRowOffset = Selection.Row - 1     lRowNew = lRowOffset          Set wksSource = ActiveSheet     Set wksNew = Worksheets.Add

Set AWF = Application.WorksheetFunction     With wksSource         For lRow = (lRowOffset + 1) To (lRowOffset + lRows)

sTemp = .Cells(lRow, iSplitCol)

If Right(sTemp, 1) <> vbLf Then                 sTemp = sTemp & vbLf             End If             iCount = (Len(sTemp) - _               Len(AWF.Substitute(sTemp, vbLf, "")))



For iTargetRows = 1 To iCount                 lRowNew = lRowNew + 1                 For i = (iColOffset + 1) To (iColOffset + iCols)

If i <> iSplitCol Then                         wksNew.Cells(lRowNew, i) _                           = .Cells(lRow, i)

Else                         iEnd = InStr(sTemp, vbLf)

wksNew.Cells(lRowNew, i) _                           = Left(sTemp, iEnd - 1)

sTemp = Mid(sTemp, iEnd + 1)

End If                 Next i             Next iTargetRows         Next lRow     End With

ExitRoutine:

Set wksSource = Nothing     Set wksNew = Nothing     Set AWF = Nothing     Application.ScreenUpdating = True     Exit Sub

ErrRoutine:

MsgBox Err.Description, vbExclamation     Resume ExitRoutine End Sub

La macro todavía se basa en el uso de una variable para indicar la columna que se dividirá. En este caso, la variable es iSplitCol y se establece en la columna 4. La macro solo funciona en las celdas seleccionadas cuando se ejecuta por primera vez, y las celdas separadas se transfieren a una nueva hoja de trabajo. La dirección de la celda superior izquierda en la nueva hoja de trabajo es la misma que la celda superior izquierda seleccionada cuando se ejecuta la macro.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (3263) se aplica a Microsoft Excel 97, 2000, 2002 y 2003. Puede encontrar una versión de este consejo para la interfaz de cinta de Excel (Excel 2007 y posterior) aquí:

link: / excelribbon-Splitting_Information_into_Rows [División de información en filas].