【ExcelVBA】選択した表のセルのデータをグラフに表示させるには

この記事では、選択した表のセルのデータをグラフに表示させる方法についてご説明します。

【動画】選択した表のセルのデータをグラフに表示させる実際の動き

本題に入る前に、まずは次の動画をご覧ください。


まずはセルが選択された時に、そのセルが表の範囲内か範囲外かを判定します。

表の範囲内の場合は、選択されたセルの行の値をグラフに表示させます。

表の範囲外の場合は何もしません。

マクロ作成の流れ

STEP.1
セルが選択された時に、そのセルが表の範囲内か範囲外かを判定する
セルが選択された時に、そのセルが表の範囲内か範囲外かを判定します。
STEP.2
表の範囲内の場合は、選択されたセルの行の値(点数)をグラフに表示させる
表の範囲内の場合は、選択されたセルの行の値(点数)をグラフに表示させます。

Excelファイルの例

今回は次のExcelファイルを用意しました。

表にあるセルを選択すると、そのセルの行の値がグラフに表示されています。

上の画像では、G2のセルが選択されているので、2行目の各点数がグラフに表示されています。

別の行を選択すると、その行の値がグラフに表示されます。(下の画像はD11のセルが選択されているので11行目の値がグラフに表示されています)

また、生徒名もグラフの下部に表示させています。

科目名は各棒グラフの下部に表示させています(オレンジの四角の部分)

コードの例

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim ws          As Worksheet    'ワークシート変数
    Dim rng         As Range        'セル用変数
    Dim ChartObj    As ChartObject  'グラフ用変数
    Dim selRange    As Range        '選択されたデータのセル範囲
    
    'シートを取得する
    Set ws = Worksheets("work")
    
    '表のセル範囲を取得する
    Set rng = Range("A2:G21")

    If Not Intersect(Target, rng) Is Nothing Then

        '選択されたセルが、rngで指定されたセルの範囲内の場合

        '設置されたグラフのインスタンスを生成
        Set ChartObj = ws.ChartObjects("グラフ1")
        
        '選択行のセルの範囲を取得する(C列からG列)
        Set selRange = Range(Cells(Target.row, "C"), Cells(Target.row, "G"))
        
        With ChartObj.chart
        
            '選択行の表データをグラフに表示させる
            .SetSourceData Source:=selRange
            
            'グラフの最大値を100に設定する
            .Axes(xlValue).MaximumScale = 100
            
            'グラフの縦軸のラベルを変更可能にする
            .Axes(xlValue, xlPrimary).HasTitle = True
            
            'グラフの縦軸のラベルを変更する
            .Axes(xlValue, xlPrimary).AxisTitle.Text = "点数"
            
            'グラフの横軸のラベルを変更可能にする
            .Axes(xlCategory, xlPrimary).HasTitle = True
            
            'グラフの横軸のラベルを変更する
            .Axes(xlCategory, xlPrimary).AxisTitle.Text = Cells(Target.row, 2).Value & "さんの点数"
                    
            With .Axes(xlCategory)
            
                '横軸ラベルを変更する(C1からG1(科目名)に変更)
                .CategoryNames = "=work!$C$1:$G$1"
                
            End With
    
        End With
        
    End If
        
End Sub

注目すべきコード①

最初に見て頂きたいのは3行目です。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

コードの説明

以上のコードは、「SelectionChange」イベントプロシージャの開始のコードです。

この「SelectionChange」イベントプロシージャは、セルを選択したときに呼び出されるイベントプロシージャです。

今回のマクロのテーマは「選択した表のセル」の値をグラフに出力したいので、「SelectionChange」イベントプロシージャを使っています。

「SelectionChange」イベントプロシージャ内でデータのグラフ表示処理を行います。

注目すべきコード②

次に見て頂きたいのは14行目から16行目です。

    '表のセル範囲を取得する
    Set rng = Range("A2:G21")

    If Not Intersect(Target, rng) Is Nothing Then

コードの説明

以上のコードは、表のセル範囲を取得し、選択されたセルが(データのある)表のセル範囲内か範囲外かを判定するIFのコードです。

表の値だけをグラフに表示させたいので、表の値以外のセルは何も処理したくありません。

なのでこのIFで、表の範囲内か範囲外かを判定します。

Intersectメソッドの第1引数に選択されたセル範囲、第2引数に表の範囲を指定することで、もし選択されたセルが表の範囲内であれば値を返し、範囲外ならNothingを返します。

Nothingではない場合(表の範囲内の場合)はIFの中の処理に遷移し、Nothingの場合(表の範囲外の場合)はELSEの処理に遷移します。(今回はELSE内は何もしません(ELSEのコード自体無し))

注目すべきコード③

次に見て頂きたいのは21行目です。

        '設置されたグラフのインスタンスを生成
        Set ChartObj = ws.ChartObjects("グラフ1")

コードの説明

以上のコードは、グラフの名前を取得するコードです。

今回使うグラフの名前には「グラフ1」の文字列を設定しています。

注目すべきコード④

次に見て頂きたいのは24行目です。

        '選択行のセルの範囲を取得する(C列からG列)
        Set selRange = Range(Cells(Target.row, "C"), Cells(Target.row, "G"))
        
        With ChartObj.chart
        
            '選択行の表データをグラフに表示させる
            .SetSourceData Source:=selRange

コードの説明

以上のコードは、選択行のセルの範囲を取得し、グラフに出力するコードです。

今回のExcelファイルの場合、例えばシートの2行目の表のセルを選択するとC2からG2のセル範囲が変数selRangeに格納されます。

変数selRangeは29行目でSetSourceDataメソッドのSourceパラメータに格納することで、SetSourceDataメソッドが実行されると、変数selRangeに格納されていたC2からG2のセル範囲の値がグラフに出力されます。

C2からG2のセルに、それぞれ94、74、46、35、66の値が格納されているので、下のようにグラフが表示されます。

セルの値の通りにグラフが表示されていることが分かります。

注目すべきコード⑤

次に見て頂きたいのは32行目です。

            'グラフの最大値を100に設定する
            .Axes(xlValue).MaximumScale = 100

コードの説明

以上のコードは、グラフの最大値を設定するコードです。

今回はグラフに表示させる値が100点満点の点数なので、MaximumScaleプロパティの値に100を設定しています。

MaximumScaleプロパティの値に100を設定すると以下のように100がグラフ表示の上限になります。

注目すべきコード⑥

次に見て頂きたいのは32行目から44行目です。

            'グラフの最大値を100に設定する
            .Axes(xlValue).MaximumScale = 100
            
            'グラフの縦軸のラベルを変更可能にする
            .Axes(xlValue, xlPrimary).HasTitle = True
            
            'グラフの縦軸のラベルを変更する
            .Axes(xlValue, xlPrimary).AxisTitle.Text = "点数"
            
            'グラフの横軸のラベルを変更可能にする
            .Axes(xlCategory, xlPrimary).HasTitle = True
            
            'グラフの横軸のラベルを変更する
            .Axes(xlCategory, xlPrimary).AxisTitle.Text = Cells(Target.row, 2).Value & "さんの点数"

コードの説明

以上のコードは、グラフの縦軸と横軸それぞれのラベルに文言を設定する処理のコードです。

縦軸のラベルには「点数」の文字列を、横軸のラベルには選択された行の生徒名に「さんの点数」の文字列を結合させた文字列を表示させています。

注目すべきコード⑦

次に見て頂きたいのは46行目から51行目です。

            With .Axes(xlCategory)
            
                '横軸ラベルを変更する(C1からG1(科目名)に変更)
                .CategoryNames = "=work!$C$1:$G$1"
                
            End With

コードの説明

以上のコードは、横軸ラベルを設定する処理のコードです。

今回は横軸ラベルに科目名を表示させています。

セルC1からセルG1をCategoryNamesプロパティに参照させることで科目名をグラフに表示させています。

動作確認

Excelファイルの例」をご覧ください。

最後に

この記事では、選択した表のセルのデータをグラフに表示させる方法についてご説明しました。

選択した表のセルのデータをグラフに表示させたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら