6/21/2019

Excel。こんなときこそ、マクロ!五十音順など一文字目が変わったら中見出し行を挿入したい【Excel VBA】

Excel。こんなときこそ、マクロ!五十音順など一文字目が変わったら中見出し行を挿入したい

<Excel VBA>

Excel関数一覧表を作ってみたけども、関数名が連続してわかりにくいので、最初の一文字目が変わったら、一行挿入して、中見出し行をいれると、わかりやすくなるかなぁ~と思ったとします。

NUMBERVALUEの次が、OCT2BINなので、OCT2BINの行の上に、Oという文字の入った行を挿入したいわけです。
完成させたいのは、次のような表。

たしかに、自力で作ろうとしても、たいした処理じゃないわけですよ。
一文字目が変わるところを視認したら、行を挿入して、先頭の一文字を入力すればいいわけですね。

だけど、A~Zまでの計26回同じ処理を繰り返すのは、はっきり言って、面倒なんですね。

このように、単純な処理の繰り返し。
そして、面倒な時こそ、マクロで処理させることができるといいですよね。

ということで、Excel VBAでマクロを作成してみましょう。比較的簡単に作成することができますよ。

Sub 先頭文字()
    Dim i As Long
    Dim 関数名 As String
    Dim 次 As String
   
    関数名 = Left(Range("a1"), 1)
    Range("a1").Select
    i = 2
     
    Do While 関数名 <> ""
        次 = Left(Cells(i, "a"), 1)
       
        If 関数名 <> 次 Then
            Rows(i).Insert , xlFormatFromRightOrBelow
            Cells(i, "a").Value = 次
        End If
        i = i + 1
        関数名 = Left(Cells(i - 1, "a"), 1)
    Loop
End Sub

では、説明していきましょう。
最初は、おなじみの変数の宣言ですね。
Dim i As Long
Dim 関数名 As String
Dim 次 As String

関数名や次など、変数名は漢字でも大丈夫ですよ。わかりやすい変数名にするのがExcel VBAになれていない人にはいいかもしれませんね。

続いて、用意した変数などに、初期値を設定します。
関数名 = Left(Range("a1"), 1)
A1の値は、関数名と入力されています。

この関数名のLeft=左から1文字分を、変数の関数名に入力します。
つまり、”関”という文字が入ります。

i = 2
下のセルの情報を得たりするために使う変数です。
2で設定しているのは、このあとで説明します。

Do While 関数名 <> ""
    次 = Left(Cells(i, "a"), 1)
       
    If 関数名 <> 次 Then
        Rows(i).Insert , xlFormatFromRightOrBelow
        Cells(i, "a").Value = 次
    End If
    i = i + 1
    関数名 = Left(Cells(i - 1, "a"), 1)
Loop
このマクロの心臓部です。
Do While~Loopは繰り返し作業ですね。

今回は、関数名 <> "" 関数名が空白でない ということなので、関数名が空白でない間繰り返すということを意味しています。

次 = Left(Cells(i, "a"), 1)
先程、iには2を設定していますので、この行は、A2の左から1文字目を”次”という変数に設定する作業をしています。

この処理で、”M”が入ります。

If 関数名 <> 次 Then
    Rows(i).Insert , xlFormatFromRightOrBelow
    Cells(i, "a").Value = 次
End If

If 関数名 <> 次 Then~End If
関数名には、”関”、次には、”M”が設定されていますので、異なっていますよね。

「<>」異なっている場合は、IFの中を実行します。
合致しているならば、処理しません。

Rows(i).Insert , xlFormatFromRightOrBelow
Rows(i)「2行目」をInsert「挿入」。つまり、2行目を選択して、挿入なので、行の挿入をします。

Cells(i, "a").Value = 次
次に入っている文字をA2に入力します。これで、”M”が入ります。

xlFormatFromRightOrBelow は、右または下方向のセルの書式をコピーすることができます。
これを入れないと、1行目が見出し行で、その塗りつぶしの書式を反映してしまうので、設定する必要がありました。

なお、xlFormatFromLeftOrAbove と設定すると、左または上方向のセルの書式をコピーすることができます。

IF Then EndIfを抜けた後の処理の確認もしておきましょう。
i = i + 1
次の行に移動するために、+1します。

関数名 = Left(Cells(i - 1, "a"), 1)
関数名も、ずっと、「関」ではマズいので、一行ずつスライドさせていきます。

人力で処理している流れをそのままExcel VBAで表現した感じ作ることができますので、少しずつ、Excel VBAに慣れていくといいかもしれませんね。