Jamesは、一連の行に含まれるワークシートにいくつかのデータを持っています。データの列の1つには、セルごとに複数の行があるセルが含まれています。 (セル内のデータは、アイテム間でAlt + Enterを押すことによって行に分割されました。)Jamesは、このデータを複数の行に分割したいと考えています。たとえば、行の1つのセルに3行のデータがある場合、そのセルのデータは3つの行に分割する必要があります。

Excelは、Text toColumnsツールを使用してデータを個別の列に分割する便利な方法を提供します。これを使用して、Alt + Enterを押したときにExcelが挿入するASCII10文字の存在に基づいてデータを分割できます。問題は、これによりデータが別々の列に正常に分割される一方で、Jamesが要求したように、データが別々の行に分割されないことです。

つまり、この問題の解決策にはマクロの使用が含まれている必要があります。 1つのアプローチを次のコードに示します。この例では、マクロは、ワークシート内のすべてを「展開」すること、およびワークシート内のデータが行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変数を使用して、分割するセルを含む列を指定する必要があることに注意してください。

ここに書かれているように、マクロは4番目の列の情報を分割します。さらに、セルの分割バージョンは新しいワークシートに保存されるため、元のワークシートはまったく影響を受けません。

マクロは、Split関数を使用して複数行のセルを分解することに依存しています。この機能はExcel2000以降でのみ使用可能であり、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_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(3263)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。