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 [将信息拆分为行]。