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に慣れていくといいかもしれませんね。