前回、手動にて散布図にラベルを追加しましたが、マクロの記録を使って、前回とほぼ同じ工程で作成したマクロに手を加え、汎用のツールを作成しました。
動きは下記のとおりです。
VBAのプログラムを掲載します。
最初にグラフに関連するセルを選択しましたが、この領域は文字列を返すRang関数で管理されるため、プログラムの中で、必要な領域を指定しなおすことができません。そのため、Cells関数に変換するところがミソです。
- Sub Add_Label()
- '
- On Error GoTo FIN '領域の選択BOXでキャンセルされたときにエラーを出さない。
- Dim rngGraph As Range
- Set rngGraph = Application.InputBox(Prompt:="グラフデータを選択してください。", Type:=8)
- '
- '選択した左上と右下のセルアドレスをCells関数で扱えるように数値化します。
- Dim strRowUpper As String, strRowLower As String
- Dim iRowUpper As Integer, iRowLower As Integer
- '
- Dim strColumnLeft As String, strColumnRight As String
- Dim iColumnLeft As Integer, iColumnRight As Integer
- '
- With rngGraph
- strRowUpper = .Item(1).Row '左上の行
- strRowLower = .Item(.Count).Row '右下の行
- strColumnLeft = .Item(1).Column '左上の列
- strColumnRight = .Item(.Count).Column '右下の列
- End With
- '文字列から数字へ変換
- iRowUpper = Val(strRowUpper)
- iRowLower = Val(strRowLower)
- iColumnLeft = Val(strColumnLeft)
- iColumnRight = Val(strColumnRight)
- 'シートの名前を取得
- Dim sheetName As String
- sheetName = ActiveSheet.Name
- '---------------------------------
- 'グラフ作成の領域を設定
- ' Range(Cells(iRowUpper, iColumnLeft + 1), Cells(iRowLower, iColumnRight)).Select
- '散布図を選択
- ActiveSheet.Shapes.AddChart2(240, xlXYScatter).Select
- 'ソースデータをセット
- Dim strSourceData As String
- strSourceData = sheetName & "!" & Cells(iRowUpper, iColumnLeft + 1).Address & ":" & Cells(iRowLower, iColumnRight).Address
- ActiveChart.SetSourceData Source:=Range(strSourceData)
- 'データを追記
- ActiveChart.SetElement (msoElementDataLabelTop)
- 'データ表示を選択
- ActiveChart.FullSeriesCollection(1).DataLabels.Select
- '表示するラベルを指定
- Dim strSourceLabel As String
- strSourceLabel = sheetName & "!" & Cells(iRowUpper + 1, iColumnLeft).Address & ":" & Cells(iRowLower, iColumnLeft).Address
- ActiveChart.SeriesCollection(1).DataLabels.Format.TextFrame2.TextRange. _
- InsertChartField msoChartFieldRange, strSourceLabel, 0
- Selection.ShowRange = True
- Selection.ShowValue = False
- FIN:
- Err.Clear
- End Sub