将信息拆分为行(Microsoft Excel)
James在工作表中有一些数据,这些数据包含在一系列行中。数据中的列之一包括每个单元具有多行的单元。 (通过在项目之间按Alt + Enter将单元格中的数据分成几行。)James希望将此数据分成多行。例如,如果该行中的单个单元格中有三行数据,则该单元格中的数据应分为三行。
Excel提供了一种方便的方法,可以使用“文本到列”工具将数据拆分为单独的列。这可用于根据ASCII 10字符的存在来分割数据,这是Excel在您按Alt + Enter时插入的内容。问题是,尽管这成功地将数据拆分为单独的列,却没有像James要求的那样将其拆分为单独的行。
这意味着该问题的解决方案必须包括使用宏。以下代码显示了一种方法。在本示例中,宏假定您要“扩展”工作表中的所有内容,并且工作表中的数据从第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
请注意,为了运行宏,您将需要使用iColumn变量指定包含要拆分的单元格的列。
如此处所写,宏在第四列中拆分信息。此外,单元格的拆分版本存储在新的工作表中,因此原始工作表完全不受影响。
宏依赖于使用拆分功能来拆分多行单元格。此功能仅在Excel 2000开始可用,而在Mac的Excel中根本不可用。此外,您可能只想在特定的单元格选择上运行宏。为了克服所有这些潜在的问题,您将需要考虑以下宏:
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
宏仍然依赖于使用变量来指示要拆分的列。在这种情况下,变量是iSplitCol,并将其设置为第4列。该宏仅在第一次运行时对选定的单元格起作用,并将拆分的单元格转移到新的工作表中。新工作表中左上单元格的地址与运行宏时选择的左上单元格的地址相同。
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(3263)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本:
链接:/ excelribbon-Splitting_Information_into_Rows [将信息拆分为行]。