エクセル:スネークプロットでデータラベルを両端に揃えるマクロ

スネークプロット:折れ線グラフで横軸と縦軸が逆転したグラフ(右回りに90度回転したようなもの)。横向きの棒グラフ(帯グラフ?)の棒を折れ線にしたようなものだ。
例えば、クラスの生徒の身長をこのスネークプロットで表したいとする。横軸に身長、縦軸に生徒の名前を入れたい。こういうときにはどうすればいいか。エクセルでこのグラフを素直に作ることはできない。横向きの棒グラフ(帯グラフ?)はある。折れ線グラフにもそういうオプションがあるといいんだけど、残念ながらない。
それで、散布図を利用して作る方法がよく知られているようだ。要するに、散布図で、系列X(横軸側)の値に身長をとり系列Y(縦軸側)の値に{0, 1, 2, 3, …}とダミーの値を入れてやる。通常とX, Yを逆にすればよい。たとえば、

系列X 系列Y
135.4 1
135.2 2
137.9 3
129.6 4
122.7 5

のように。あとは縦軸の目盛や値を消したりして体裁を整えればいい。
ところで、本当ならば縦軸側に生徒の名前を入れたいところだ。だが、エクセルの通常のオプションではこれが大変に面倒くさい。やれないことはないのだが、手でいちいちデータラベルの値を変えるのはとても煩雑だ。それで、データラベルを簡単に入力できるマクロを作った。
ただ、このマクロのままだと、データラベルの場所が散布図のプロットのすぐ近くになってしまう。そこで、ラベルをまとめて左寄せ・右寄せするようなマクロを作った。素朴なものだけど、いちいち作るよりコピペする方が簡単だと思うので公開する。

使い方
  1. グラフ上で、データラベルを付けたいデータ系列をクリックして選択しておく
  2. マクロを実行する
  3. ラベルの位置をプロットエリアの左寄せにするか右寄せにするかを選ぶ
  4. ラベルの左側にどれくらいのマージンを置くかを指定する

ラベルの位置は、マージンの指定で適宜調整してください。
系列にデータの値を表示させたい場合は、ラベル表示用のダミー系列(例えば値が全部ゼロの系列)を追加して、それにデータラベルを表示するといいです。

Sub 散布図ラベル名位置揃えby系列単位()

'データラベルを縦一列に並べる。スネークプロット用。左寄せと右寄せ。
'ラベルを揃える位置はラベルの左端を基準とする。

    If MsgBox("ラベル位置を調整するデータ系列をアクティブにしていますか。", vbYesNo) = vbNo Then
        MsgBox ("先にデータ系列を選択してから実行してください。")
        Exit Sub
    End If
    
    If TypeName(Selection) <> "Series" Then
        MsgBox "データ系列が選択されていません。先にデータ系列を選択してから実行してください。", vbCritical
        Exit Sub
    End If
    
    Dim ret As Integer          '右寄せにするか左寄せにするか
    Dim margin As Double        'ラベル位置の左マージン
    
    ret = MsgBox("左寄せなら「はい」、右寄せなら「いいえ」、中断するときは「キャンセル」を押してください。", vbYesNoCancel)
    If ret = vbCancel Then
        Exit Sub
    End If
    
    margin = Application.InputBox("ラベル位置を調整する左側マージンを指定してください。", Type:=1)

    With Selection
        Dim pnt As Point
        If ret = vbYes Then         '左寄せ
            For Each pnt In .Points
                pnt.DataLabel.Left = margin
            Next
        Else                        '右寄せ
            For Each pnt In .Points
                pnt.DataLabel.Left = margin + ActiveChart.PlotArea.Width + ActiveChart.PlotArea.Left
            Next
        End If
    End With

End Sub