División de información en filas (Microsoft Excel)
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]
.