Excel VBAでグラフを固定表示!初心者でも簡単に実装できる方法

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

「Excelで表をスクロールしてもグラフが消えないようにしたい!」
そんなお悩みはありませんか?


スクロールするとグラフが見えなくなって作業がスムーズに進まない…

グラフを使ったデータ分析を効率化したいけど、
 どうすればいいかわからない…

初心者でも簡単に実装できる方法が知りたい!

そんな時は、Excel VBAを使って
「グラフを常に表示させる方法」を取り入れると解決します!


この記事では、「Excel VBAを使って表をスクロールしてもグラフが常に表示されるコード」を解説します。

エクセルのグラフで分析を行っている際に、表をスクロールしたらグラフが消えて不便!
このように思っている方に向けて本コードを紹介します。
これを導入すれば、表をスクロールしてもグラフが消えることなく常に表示され、作業効率が大幅に向上します。

初心者でも理解できるように丁寧に解説しているので、ぜひ最後までご覧ください!

【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。

特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事を読むとわかること

スポンサーリンク

エクセルで表をスクロールするとグラフが消える理由を解説

Excelでデータ分析やレポートを作成する際、表やグラフを組み合わせて使うことはよくありますよね。

しかし、表をスクロールするとグラフが画面から消えてしまい、作業が途切れることはありませんか?
この現象には、Excelの仕組みによる明確な理由があります。


グラフが消えるとは?

表とグラフの違い:固定される範囲の仕組み

  • セルの内容はスクロールに追従する
    • Excelの表は「セル」に入力されたデータが基盤です。
      スクロールすると画面上で表示される範囲が移動し、表のデータが自動的に追従します。
  • グラフはシート上のオブジェクト
    • 一方で、Excelのグラフは「オブジェクト」として扱われます。
      このオブジェクトは、セルや行列と異なり、シート上の「固定された位置」に存在します。
      そのため、シートをスクロールしてもグラフ自体は動かず、画面外に消えてしまいます。

グラフが消えないようにするための対策とは?

グラフがスクロールで消えてしまう原因は、Excelのグラフが「オブジェクト」としてシート上に固定される性質によるものでしたね。

この問題を解決するためには、スクロールに合わせてグラフの位置を動的に調整する仕組みを導入する必要があります。

その方法として最も効果的なのが、VBA(Visual Basic for Applications)を使った方法となります。

VBAでどんな仕組みを作るのか?

  • スクロール位置を取得する
    VBAを使えば、現在のスクロール位置(行番号)をリアルタイムで取得できます。
    これを基に、グラフの位置を調整します。
  • グラフの座標を動的に変更する
    スクロールに合わせてグラフの表示位置を計算し、コードでグラフの座標を更新します。
    これにより、グラフが常に画面内に表示されるようになります。
  • 作業効率を大幅に向上
    この仕組みを導入することで、表とグラフを同時に確認しながら作業できるため、データ分析やレポート作成がスムーズに進みます。

このVBAコードで実現できる2つのグラフ操作

この記事で紹介するVBAコードを使うと、以下のような動作を実現できます。

ここでは、「ボタンを使う方法」と「セルクリックで自動実行する方法」という2つのアプローチを解説します。

それぞれのメリットとデメリットも含めて、使いやすい方法を選んでみてください。

このコードで実現する動作を2パターンご紹介

パターン1 : ボタンをクリックしてグラフを表示

Excelのシートに、グラフ移動用ボタンを作成して、このボタンを押すたびにグラフを表示させる方法です。

メリットとデメリット
  • メリット
    • ボタンを押すタイミングを自由に制御できるため、必要なときだけグラフを表示させられます。
    • 他の作業や操作には影響を与えません。
  • デメリット
    • 毎回ボタンを押さないとグラフが表示されないため、手間に感じる場合があります。
パターン1 : ボタンをクリックしてグラフを表示

パターン1の具体的なコードを見る

パターン2 : セルをクリックするたびにグラフを表示

Excelの特定のシートのセルをクリックするたびに自動で実行され、グラフを表示させる方法です。

メリットとデメリット
  • メリット
    • ボタンを使わずに自動で実行されるため、作業をスムーズに進めることができます。
    • 手動操作が不要なので、効率的な動作が可能です。
  • デメリット
    • セルをクリックするたびにコードが実行されるため、他の操作に影響が出る可能性があります。
パターン2 : クリックするたびにグラフを表示 (イベントプロシージャの使用)

パターン2の具体的なコードを見る

スポンサーリンク

パターン1 : ボタンをクリックしてグラフを表示するコードを紹介

それでは、「パターン1 : ボタンをクリックしてグラフを表示する方法」のコードをご紹介します。

コードの記載箇所 | 「標準モジュール」に記載します

以下のコードは、標準モジュールに記載する必要があります。

コードの記載箇所 (標準モジュール)
クリックして標準モジュールの追加方法を見る
  • 「開発タブ」をクリックします。
  • 「Visual Basic」をクリックし、VBAエディタを開きます。
    ※「Alt + Basic」を押しても問題ありません。
  • 左の空白部で「右クリック」を行います。
  • 開いたメニューから「挿入 (N)」を選択します。
  • その中の「標準モジュール (M)」をクリックすることで、新規で標準モジュールを作成することができます。

VBAコード | グラフを常に表示する

下記コードを、標準モジュールに記載してください。

Public Sub graph_view()
    '// スクリーン更新を一時停止
    Application.ScreenUpdating = False
    
    '// スクロール位置に応じてグラフの位置を調整
    Dim CPos As Double
    CPos = ActiveWindow.ScrollRow * ActiveCell.RowHeight
    
    '// グラフの配置を管理するための変数
    Dim chtObj As ChartObject
    Dim nextTop As Double
    nextTop = CPos '// 最初のグラフのTop位置を設定
    
    '// ワークシート上の全てのグラフをループ処理
    Dim i As Long
    For i = 1 To ActiveSheet.ChartObjects.Count
        Set chtObj = ActiveSheet.ChartObjects(i)
        
        '// 各グラフを適切な位置に配置
        chtObj.Top = nextTop
        
        '// 次のグラフのTop位置を更新(現在のグラフの高さ + マージン)
        nextTop = nextTop + chtObj.Height + 10 '// 10はグラフ間のマージン
        
        '// グラフ1の場合、スクロール位置に固定
        If chtObj.Name = "グラフ 1" Then
            chtObj.Top = CPos
            nextTop = CPos + chtObj.Height + 10 '// グラフ1の下に次のグラフを配置
        End If
    Next i
    
    '// スクリーン更新を再開
    Application.ScreenUpdating = True
End Sub

ボタンの設置方法

このコードを使うには、ボタンを作成してコードに関連付ける必要があります。

以下の手順でボタンを設置してください。

クリックしてボタンの設置方法を見る
  • 「開発タブ」をクリックします。
  • 「挿入」をクリックします。
  • 「ボタン (フォームコントロール)」をクリックします。
開発タブ⇒挿入⇒ボタン (フォームコントロール)を押す
  • 適当なセルをクリックしながらドロップする。
  • 「マクロの登録」画面から先ほどコピペしたコード「graph view」を選択。
  • 「OK」をクリックします。
マクロの登録で「graph view」を選択
  • 作成できた「ボタン」の上で右クリックを行います。
  • 「テキストの編集 (x)」をクリックして、ボタンの名称を変更できるようにします。
  • ボタンの名称を任意の名称に変更します。
ボタンの名称を変更する

コードの動作概要

STEP
スクロール位置を計算

現在のスクロール行(ScrollRow)とセルの高さ(RowHeight)を掛け合わせて、グラフを表示する位置を計算します。

STEP
対象のグラフを取得

ChartObjects を使い、名前で特定のグラフ(「グラフ 1」)を取得します。

STEP
グラフの位置を調整

chtObj.Top プロパティを更新し、計算した位置に移動させます。

STEP
スクリーン更新を再開

Application.ScreenUpdating = True で画面をリフレッシュし、グラフの表示を確定させます。

このコードで使用している機能

  • Dim (変数)
    • Dimステートメントを使用して変数を宣言します。
  • Dim – Set (オブジェクト変数)
    • Setを使い、特定のグラフオブジェクトを変数に代入します。
  • Application.ScreenUpdating (パフォーマンスを向上)
    • スクリーン更新を一時停止して処理速度を向上させます。
  • ChartObjects (“名前”) (グラフを取得)
    • シート上の特定のグラフを取得します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Public Sub graph_view()
    • Public Subはマクロ(Subプロシージャ)の開始を示します。
      他のマクロからも呼び出し可能な公開(Public)のマクロです。
  2. Application.ScreenUpdating = False
    • スクリーン更新を一時停止します。
      このコードは、コードの実行中に画面が頻繁に再描画されるのを防ぐことで、処理速度を向上させます。
      実行後、画面が一時的に動かないのはこの設定のためです。
  3. Dim mail As Object
    • 「CPos」という名前の変数を宣言します。
      型はDouble(小数点を含む数値型)です。
      この変数は、スクロール位置に基づくグラフの表示位置(座標)を計算するために使用されます。
  4. CPos = ActiveWindow.ScrollRow * ActiveCell.RowHeight
    • 「ScrollRow」:現在のウィンドウで表示されている最上部の行番号を取得します。
      「RowHeight」:1行の高さを取得します。
      これらを掛け合わせることで、現在のスクロール位置に基づいた「表示すべき縦位置(ピクセル単位)」を計算します。
  5. Dim chtObj As ChartObject
    • 「chtObj」という変数を宣言します。
      型はChartObject(グラフオブジェクト型)です。
      Excelのシート上に配置されているグラフを操作するために使います。
  6. Dim nextTop As Double
    • 「nextTop」という名前の変数を宣言します。
      型はDoubleです。グラフを配置する「次の位置」を計算・記録するための変数です。
  7. nextTop = CPos
    • 最初のグラフを配置する位置を、計算済みの「CPos(スクロール位置)」に設定します。
  8. Dim i As Long
    • 変数「i」という名前の変数を宣言します。
      型はLong(長整数型)です。
      グラフの繰り返し処理で使用するカウンターとして利用します。
  9. For i = 1 To ActiveSheet.ChartObjects.Count
    • Forループの開始を示します。
      「ActiveSheet.ChartObjects.Count」は、アクティブなシート上の全てのグラフオブジェクトの数を取得します。
      1からその数まで繰り返し処理を行います。
  10. Set chtObj = ActiveSheet.ChartObjects(i)
    • シート上の「i番目」のグラフオブジェクトを取得し、変数「chtObj」に設定します。
      「Set」を使うのは、グラフがオブジェクト型であるためです。
  11. chtObj.Top = nextTop
    • 現在のグラフ(chtObj)のTop(縦位置)プロパティを「nextTop」の値に設定します。
      これにより、グラフの配置が更新されます。
  12. nextTop = nextTop + chtObj.Height + 10
    • 「nextTop」の値を更新します。
      現在のグラフの高さ(Height)と、10ピクセルのマージンを足して、次のグラフの配置位置を計算します。
  13. If chtObj.Name = “グラフ 1” Then
    • If条件を使い、現在のグラフが「名前がグラフ 1であるか」を確認します。
      「chtObj.Name」はグラフの名前(識別子)を取得します。
  14. chtObj.Top = CPos
    • 条件が「True(グラフ 1である)」の場合、グラフの縦位置(Top)をスクロール位置(CPos)に固定します。
      「グラフ 1」を常に画面内に表示させる動作です。
  15. nextTop = CPos + chtObj.Height + 10
    • 「nextTop」を再計算します。
      「グラフ 1」の下に、次のグラフを配置する位置を設定します。
  16. End If
    • If条件の終了を示します。
      これ以降の処理は条件に関係なく実行されます。
  17. Next i
    • Forループの次の繰り返しに進みます。
      次のグラフを取得して同じ処理を行います。
  18. Application.ScreenUpdating = True
    • スクリーン更新を再開します。
      処理中に停止していた画面の描画がここで再開され、すべての変更が反映されます。
  19. End Sub
    • マクロの終了を示します。

総括・ポイント

このコードは、Excelシート上でグラフがスクロール操作に追従する仕組みを実現するものです。
特に「グラフ 1」を常に画面内に表示させる機能を備えており、データの確認や分析をスムーズに行えるよう設計されています。

コード全体はシンプルで、初心者でも実装しやすい構成になっています。
スクロール位置を動的に取得してグラフの位置を調整するロジックは、スクリーン更新の一時停止やループ処理を活用することで効率的に動作します。
また、特定のグラフを条件分岐で固定表示させる仕組みにより、業務のニーズに応じた柔軟な対応も可能です。

このマクロを利用することで、スクロール時に表とグラフを都度見比べる手間を省き、作業効率を向上させることができます。
データ分析やレポート作成が多い業務で特に有用なコードと言えるでしょう。

スポンサーリンク

パターン2 : セルをクリックするたびにグラフを表示するコードを紹介

それでは、「パターン2 : セルをクリックするたびにグラフを表示する方法」のコードをご紹介します。

パターン2は、セル選択の操作に合わせてグラフを自動調整する仕組みを実現します。
ボタンをクリックする必要がないため、頻繁な操作を効率化したい場合に特に適しています。

コードの記載箇所 | 「ワークシートモジュール」と「標準モジュール」に記載します

以下のコードは、「ワークシートモジュール」と「標準モジュール」に記載する必要があります。

コードの記載箇所 | 「ワークシートモジュール」と「標準モジュール」に記載します
クリックして標準モジュールの追加方法を見る
  • 「開発タブ」をクリックします。
  • 「Visual Basic」をクリックし、VBAエディタを開きます。
    ※「Alt + Basic」を押しても問題ありません。
  • 左の空白部で「右クリック」を行います。
  • 開いたメニューから「挿入 (N)」を選択します。
  • その中の「標準モジュール (M)」をクリックすることで、新規で標準モジュールを作成することができます。

VBAコード | グラフを常に表示する

下記コードを、表を記載しているシートのワークシートモジュールに記載してください。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call graph_view
End Sub

続いて、下記コードを標準モジュールに記載してください。

Public Sub graph_view()
    '// スクリーン更新を一時停止
    Application.ScreenUpdating = False
    
    '// スクロール位置に応じてグラフの位置を調整
    Dim CPos As Double
    CPos = ActiveWindow.ScrollRow * ActiveCell.RowHeight
    
    '// グラフの配置を管理するための変数
    Dim chtObj As ChartObject
    Dim nextTop As Double
    nextTop = CPos '// 最初のグラフのTop位置を設定
    
    '// ワークシート上の全てのグラフをループ処理
    Dim i As Long
    For i = 1 To ActiveSheet.ChartObjects.Count
        Set chtObj = ActiveSheet.ChartObjects(i)
        
        '// 各グラフを適切な位置に配置
        chtObj.Top = nextTop
        
        '// 次のグラフのTop位置を更新(現在のグラフの高さ + マージン)
        nextTop = nextTop + chtObj.Height + 10 '// 10はグラフ間のマージン
        
        '// グラフ1の場合、スクロール位置に固定
        If chtObj.Name = "グラフ 1" Then
            chtObj.Top = CPos
            nextTop = CPos + chtObj.Height + 10 '// グラフ1の下に次のグラフを配置
        End If
    Next i
    
    '// スクリーン更新を再開
    Application.ScreenUpdating = True
End Sub

コードの動作概要

STEP
Worksheet_SelectionChangeイベントを活用

セルを選択するたびに自動で実行される特別なプロシージャを使用します。

STEP
スクロール位置を計算

ScrollRowRowHeightを掛け合わせて、現在のスクロール位置を取得します。

STEP
対象のグラフを取得

ChartObjectsを使い、名前で特定のグラフ(「グラフ 1」)を操作します。

STEP
グラフの位置を調整

chtObj.Topプロパティを更新し、計算した位置に移動させます。

STEP
スクリーン更新を再開

Application.ScreenUpdating = Trueで画面をリフレッシュし、変更を反映させます。

このコードで使用している機能

  • Worksheet_SelectionChange (イベントプロシージャ)
    • セルが選択されるたびに自動的に実行されるイベントプロシージャ。
  • Dim (変数)
    • Dimステートメントを使用して変数を宣言します。
  • Dim – Set (オブジェクト変数)
    • Setを使い、特定のグラフオブジェクトを変数に代入します。
  • Application.ScreenUpdating (パフォーマンスを向上)
    • スクリーン更新を一時停止して処理速度を向上させます。
  • ChartObjects (“名前”) (グラフを取得)
    • シート上の特定のグラフを取得します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る

■ワークシートモジュールの「Worksheet_SelectionChange(ByVal Target As Range)」を解説

  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    • 「Worksheet_SelectionChange」は、セルが選択されるたびに自動で実行されるイベントです。
      「Private」で始まるのは、このプロシージャがそのワークシート専用であり、外部から呼び出せないことを示します。
      「Target」は、選択されたセル範囲を示すパラメータです。
      このイベントを活用することで、セル選択に連動した操作を自動化できます。
  2. Call graph_view
    • 「Call」は、指定したプロシージャ(マクロ)を実行するための命令です。
      この場合、標準モジュール内に記載された「graph_view」プロシージャを実行します。
      標準モジュールに記載したプロシージャを呼び出すことで、メンテナンス性が向上します。
      「Call」は省略可能で、「graph_view」と記述するだけでも同じ動作になります。
      ただし、明示的に「Call」を記載すると、コードの意図がより明確になります。
  3. End Sub
    • マクロの終了を示します。
      これ以降のコードはイベントの範囲外となり、実行されません。

■標準モジュールの「Public Sub graph_view()」を解説

  1. Public Sub graph_view()
    • Public Subはマクロ(Subプロシージャ)の開始を示します。
      他のマクロからも呼び出し可能な公開(Public)のマクロです。
  2. Application.ScreenUpdating = False
    • スクリーン更新を一時停止します。
      このコードは、コードの実行中に画面が頻繁に再描画されるのを防ぐことで、処理速度を向上させます。
      実行後、画面が一時的に動かないのはこの設定のためです。
  3. Dim mail As Object
    • 「CPos」という名前の変数を宣言します。
      型はDouble(小数点を含む数値型)です。
      この変数は、スクロール位置に基づくグラフの表示位置(座標)を計算するために使用されます。
  4. CPos = ActiveWindow.ScrollRow * ActiveCell.RowHeight
    • 「ScrollRow」:現在のウィンドウで表示されている最上部の行番号を取得します。
      「RowHeight」:1行の高さを取得します。
      これらを掛け合わせることで、現在のスクロール位置に基づいた「表示すべき縦位置(ピクセル単位)」を計算します。
  5. Dim chtObj As ChartObject
    • 「chtObj」という変数を宣言します。
      型はChartObject(グラフオブジェクト型)です。
      Excelのシート上に配置されているグラフを操作するために使います。
  6. Dim nextTop As Double
    • 「nextTop」という名前の変数を宣言します。
      型はDoubleです。グラフを配置する「次の位置」を計算・記録するための変数です。
  7. nextTop = CPos
    • 最初のグラフを配置する位置を、計算済みの「CPos(スクロール位置)」に設定します。
  8. Dim i As Long
    • 変数「i」という名前の変数を宣言します。
      型はLong(長整数型)です。
      グラフの繰り返し処理で使用するカウンターとして利用します。
  9. For i = 1 To ActiveSheet.ChartObjects.Count
    • Forループの開始を示します。
      「ActiveSheet.ChartObjects.Count」は、アクティブなシート上の全てのグラフオブジェクトの数を取得します。
      1からその数まで繰り返し処理を行います。
  10. Set chtObj = ActiveSheet.ChartObjects(i)
    • シート上の「i番目」のグラフオブジェクトを取得し、変数「chtObj」に設定します。
      「Set」を使うのは、グラフがオブジェクト型であるためです。
  11. chtObj.Top = nextTop
    • 現在のグラフ(chtObj)のTop(縦位置)プロパティを「nextTop」の値に設定します。
      これにより、グラフの配置が更新されます。
  12. nextTop = nextTop + chtObj.Height + 10
    • 「nextTop」の値を更新します。
      現在のグラフの高さ(Height)と、10ピクセルのマージンを足して、次のグラフの配置位置を計算します。
  13. If chtObj.Name = “グラフ 1” Then
    • If条件を使い、現在のグラフが「名前がグラフ 1であるか」を確認します。
      「chtObj.Name」はグラフの名前(識別子)を取得します。
  14. chtObj.Top = CPos
    • 条件が「True(グラフ 1である)」の場合、グラフの縦位置(Top)をスクロール位置(CPos)に固定します。
      「グラフ 1」を常に画面内に表示させる動作です。
  15. nextTop = CPos + chtObj.Height + 10
    • 「nextTop」を再計算します。
      「グラフ 1」の下に、次のグラフを配置する位置を設定します。
  16. End If
    • If条件の終了を示します。
      これ以降の処理は条件に関係なく実行されます。
  17. Next i
    • Forループの次の繰り返しに進みます。
      次のグラフを取得して同じ処理を行います。
  18. Application.ScreenUpdating = True
    • スクリーン更新を再開します。
      処理中に停止していた画面の描画がここで再開され、すべての変更が反映されます。
  19. End Sub
    • マクロの終了を示します。

総括・ポイント

パターン2のコードでは、セルをクリックするたびにグラフの位置を自動的に調整する仕組みを提供します。
この方法は、ボタンを押す必要がないため、直感的な操作性を実現できます。
特に頻繁にシートを操作する場合や、動的なデータ更新が多いシナリオに適しています。

コード全体はシンプルで、ワークシートの選択変更イベント(Worksheet_SelectionChange)を活用しており、ユーザーの操作に即応する動作を可能にしています。
また、メインのロジックを標準モジュールに分離しているため、メンテナンス性や拡張性が高いのも特徴です。

ただし、このパターンはセルを選択するたびにコードが実行されるため、頻繁な動作が予想されるシートではパフォーマンスへの影響に注意が必要です。
そのため、大量データを扱う場面やスクロール操作が多い作業では、適宜条件分岐を加えて実行頻度を制御すると良いでしょう。

このように、パターン2は操作の効率性と動作の即応性を重視したコード構成となっており、自動化やユーザー体験の向上を図りたい場合に非常に有用です。
用途や作業環境に応じて、パターン1(ボタン使用)との使い分けを検討してください。

スポンサーリンク

この記事のまとめ

この記事では、Excel VBAを使って表をスクロールしてもグラフが常に表示されるようにする方法を解説しました。

初心者の方でも実践できるよう、実用的なコードと解説を交えながら丁寧に説明しています。

ポイントのおさらい

さらに学ぶために

今回のVBAコードをマスターすることで、グラフと表を同時に確認しながら効率的なデータ分析が可能になりました。

これを応用して、次のステップとして以下の記事もおすすめです!

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次