Excel VBAでセル内の改行データを指定行数ごとに別セルへ分割するマクロ方法

Excel

Excelでは、1つのセル内に複数行の文章を入力することがあります。特にAlt+Enterによる改行や、セルの折り返し表示を含むデータを一定の行数ごとに分割したい場合、手作業では大変な作業になります。

この記事では、セル内の改行データを実際の行単位で取得し、5行ごとなど指定した行数で別セルへ分割するExcel VBAマクロの作成方法を解説します。行数が変動するデータにも対応できる方法です。

セル内データを一定行数ごとに分割する考え方

Excelのセル内改行は、通常の文章とは異なり「改行コード」として保存されています。そのため、まずセルの内容を改行ごとに分割し、配列として扱う必要があります。

例えばA1セルに12行分のデータがある場合、改行単位で分割すると以下のような配列になります。

配列番号 内容
1~5 A1へ出力
6~10 B1へ出力
11~15 C1へ出力

このように配列を5個ずつ取り出して、別セルへ書き込む処理をVBAで行います。

5行ごとに分割するExcel VBAマクロ

以下のマクロでは、A1セルの内容を取得し、改行ごとに分割した後、5行単位で右方向のセルへ出力します。

セル内の行数が増減しても、自動的に必要な分だけセルを作成します。

Sub SplitCellByFiveLines()    Dim txt As String    Dim lines As Variant    Dim result As String    Dim i As Long    Dim col As Long    Dim count As Long    txt = Range("A1").Value    lines = Split(txt, vbLf)    col = 1    result = ""    count = 0    For i = LBound(lines) To UBound(lines)        result = result & lines(i)        count = count + 1        If count = 5 Or i = UBound(lines) Then            Cells(1, col).Value = result            col = col + 1            result = ""            count = 0        Else            result = result & vbLf        End If    Next iEnd Sub

このマクロを実行すると、A1セルのデータは5行ずつ区切られ、B1、C1へ順番に出力されます。

マクロ実行後の表示例

例えばA1セルに以下のような12行のデータがある場合を考えます。

1行目 ああああ
2行目 いい
3行目 う
4行目 ええ
5行目 お
6行目 かか
7行目 き
8行目 く
9行目 け
10行目 こ

マクロ実行後は以下のようになります。

セル 内容
A1 1~5行目の内容
B1 6~10行目の内容
C1 11行目以降の内容

最後のグループが5行未満の場合でも、そのまま出力されるため、データ数が一定でなくても利用できます。

セル内の折り返し表示と実際の改行の違いに注意

Excelでは「折り返して全体を表示する」と「Alt+Enterで入力した改行」は別のものです。

今回のようなマクロでは、実際にセル内へ入力された改行コードだけを認識します。そのため、見た目だけ2行や3行に表示されている場合は分割対象になりません。

例えば、長い文章が自動的に折り返されて2行に見えていても、セルの中では1行のデータとして扱われます。

分割する行数を変更したい場合

5行ではなく10行ごと、3行ごとなどに変更したい場合は、マクロ内の「count = 5」の部分を変更します。

例えば10行ごとに分割したい場合は以下のように変更します。

If count = 10 Or i = UBound(lines) Then

このように指定行数を変数化すれば、用途に応じて柔軟に利用できます。

まとめ

Excel VBAを使えば、セル内の改行データを指定した行数ごとに分割し、別々のセルへ自動出力できます。

ポイントは、セルの内容を改行コードで分割し、配列として処理することです。今回の方法なら、データ量が変動する場合でも5行単位、10行単位など自由に調整できます。

大量の文章データやリスト整理を行う場合は、手作業でコピーするよりもVBAで自動化することで大幅な作業時間短縮につながります。

コメント

タイトルとURLをコピーしました