【完全解説】Excel VBA で動く 関数グラフ の作り方|コピペ で動く サンプル 付き


Excel VBAで絵を動かすで基本がわかり、更に興味が湧いた方、今度は少し凝った絵が現れる Excelアニメーション マクロ(プログラム)を作ってみませんか? 単なる線や形でに比べ、絵が表示できるようにになると面白味がグッと上がります。

関数グラフ アニメーション の実際の動画

まずは、「 関数グラフ 」 エクセルアニメーションの実際の動画をみていただきます。こちらです!

「数学は苦手」という方もいると思いますが、同じグラフでも動きのあるものだと、また違ってみえて、面白くなります!放物線やサインカーブのような動きは、ついつい作った自分でも見いってしまいます。単純に動きが面白いので、とりあえずやってみませんか?

座標の準備

座標の用意が実は結構大変です。私は実は半分手作業で用意したのですが、とても時間がかかり、疲労が激しくなってしまったので、これから行いたい方には、私の作成したシートを差し上げます。

zahyousheet.zip

ダウンロードすると、のようなZIPファイルになります。開くと、のようなマクロ付のエクセルファイル(.xlsm)が入っています。xlsmファイルですが、実際はマクロは入っていません。そのままVBAコードを入れられるようxlsmファイルにしました。これを開くと、

「コンテンツの有効化」ボタンが出ます。VBA プログラムをそのまま記載する場合はボタンクリックください。とりあえずシートだけでいい、という場合はそのままでもOKです。

シートはこんな感じになっています。

もし、ファイルがそもそも開かない、警告が出る、等があるようでしたら、次を確認ください。

【動かない時のチェック事項】

  1. ダウンロードしたZipを解凍し、Excelファイルを右クリックして**「プロパティ」**を開く。
  2. 全般タブの一番下にある**「許可する」**にチェックを入れて「OK」を押す。
  3. Excelを開き、上部に出る**「コンテンツの有効化」**をクリック。

【ステップ1】原点の座標

このシートでは、原点は、黒線がクロスするところセル位置でいいますと、DL152別の言い方をしますと、Cells(116,152)のところになります。

この原点を中心に、10セル毎にそのセルをグレーアウトして格子状にしています。

この後もプログラムでは、この原点座標を用いていますので、シートの縦横を削除するなど加工をした場合は、ずれた原点を補正してください。

【ステップ2】エディタ(VBE)を起動する

Excel の「開発」メニューからプログラムを入力するための専用画面「 VBE (Visual Basic Editor)」を開きます。

ここの操作は、前に示した以下に示していますので、忘れた方は見返しください。

下の画面まで進めたでしょうか?

プログラム作成画面

【ステップ3】下記のコードをコピー

エディタを開いたら、とりあえず下記のコードをコピーし、貼り付けてしまいましょう。動画で見えた関数グラフのうちの最初の2つの関数(直線:y = -x、放物線:y = x^2/40 )のコードになっています。x^2はxの2乗のことです。

コードの解説は後回しにしますね。一度、動かしてから解説した方が理解が進むと思います。

貼り付けのコツ
下の黒枠内のコードをすべてコピーし、 VBE の画面にそのまま貼り付けるだけでOKです。

Sub 関数グラフ描画()
    ' === 設定エリア ===
    Dim x_origin As Double: x_origin = 116 ' 原点の列位置
    Dim y_origin As Double: y_origin = 152 ' 原点の行位置
    Dim wait_time As String: wait_time = "00:00:00.02" ' 描画スピード
    
    Dim i As Integer, j As Integer
    Dim x As Double, y As Double
    Dim draw_y As Long, draw_x As Long
    Dim target_color As Long
    
    ' 画面更新を反映させる設定
    Application.ScreenUpdating = True

    ' === メインループ:2種類の数式を描画 ===
    For j = 1 To 2
        
        ' グラフの色を設定
        If j = 1 Then
            target_color = RGB(255, 0, 0)       ' Case 1: 赤
        Else
            target_color = RGB(255, 0, 255)     ' Case 2: 紫
        End If

        ' xを -100 から 100 まで動かしてプロット
        For i = -100 To 100
            
            ' 1. 数式の計算(yの値を求める)
            If j = 1 Then
                ' --- Case 1: 直線 (y = -x) ---
                y = (-1) * i
            Else
                ' --- Case 2: 放物線 (y = x^2 / 40) ---
                y = (i ^ 2) / 40
            End If
            
            ' 2. Excelのセル座標に変換(補正)
            ' xはそのまま足し、yは上下逆転させる
            draw_x = i + x_origin
            draw_y = y_origin - y
            
            ' 3. 描画(画面外に飛び出さない場合のみ実行)
            If draw_y > 0 And draw_x > 0 Then
                On Error Resume Next ' 万が一の座標エラー回避
                With Cells(draw_y, draw_x)
                    .Interior.Color = target_color
                    .Font.Color = target_color ' 文字も同色にして隠す
                End With
                On Error GoTo 0
            End If
            
            ' 4. アニメーション効果
            DoEvents
            Application.Wait [Now()] + TimeValue(wait_time)
            
        Next i
    Next j
    
    MsgBox "全てのグラフを描画しました!"
End Sub

貼り付けた後はこんなイメージです。標準モジュールはどれでもいいですよ。

【ステップ4】プログラムを実行する

さて、それでは実行です。大きいモニターが使える方は、下のようにシートとVBEの画面を横並びにすると、画面をいちいち切り替えずにコードを変えたり、数値を変えたりすることができます。

実行の前に、シート「座標」のコピーを隣のシートにでも作っておくとよいですよ。グラフをリセットする際はコピーしたシートからセルを丸ごと持ってきましょう。

さて、それではVBE画面上部にある [▶](右向きの三角ボタン) をクリックしてみましょう。2つの関数グラフが動きましたでしょうか?下のようになれば成功です。

    コード(プログラム)の解説

    それでは、主要なところを解説していきます。まず、冒頭のところですが、

    ' === 設定エリア ===
    Dim x_origin As Double: x_origin = 116 ' 原点の列位置
    Dim y_origin As Double: y_origin = 152 ' 原点の行位置

    X軸とY軸が交わっているセルの位置、Cells(116,152)を原点というように定義しています。

    ここから先に注意したいのは、エクセルだと、X軸の大きくなる方向は列番号が大きくなる方向と同じなのでよいのですが、Y軸の大きくなる方向は行番号が小さくなる方向になっている、ということです。図で表すと下のようになるということです

    これを念頭にして、次のコードをみてみます。

    For i = -100 To 100
          ' 1. 数式の計算(yの値を求める)
          ' --- Case 1: 直線 (y = -x) ---
          y = (-1) * i
    
          ' 2. Excelのセル座標に変換(補正)
          ' xはそのまま足し、yは上下逆転させる
          draw_x = i + x_origin
          draw_y = y_origin - y
    Next i

    For Next文のループで(x,y)の座標を計算していますが、 draw_yは、y_origin + yではなく、y_origin – yになっています。これが先に示した「数学のグラフは『上に行くほど大きく』なるが、Excelの行番号は『上に行くほど小さく』なる、というところの補正処理になります。

    次に色付けですが、

    With Cells(draw_y, draw_x)
          .Interior.Color = target_color
          .Font.Color = target_color ' 文字も同色にして隠す
    End With

    ループ中のここで、セルの色を変えています。With文を使うとCellsの複数のプロパティを変える処理をまとめて簡単に記載できます。target_colorは、もう少し上の

    ' グラフの色を設定
    If j = 1 Then
         target_color = RGB(255, 0, 0)       ' Case 1: 赤
    Else
         target_color = RGB(255, 0, 255)     ' Case 2: 紫
    End If

    ここで指定しています。直線グラフは赤[RGB(255, 0, 0)]、放物線は紫[RGB(255, 0, 255)]という指定です。

    ここはわかりますか?

    ' === 1秒未満の細かい待機をするための設定(一番上に書いてください) ===
    #If VBA7 Then
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    #Else
        Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    #End If
    
    ' 待ち時間を「ミリ秒」で指定(1000ミリ秒 = 1秒)
    ' ★ここを 50 や 100 にするとゆっくりになります。お好みで調整してください。
    Dim wait_ms As Long: wait_ms = 30
    
    ' 4. アニメーション処理
    DoEvents ' 描画を画面に反映
    Sleep wait_ms ' 指定したミリ秒だけストップ

    関数グラフに「動き」を出すためのものです。実は、この処理をしないと今のPCですと一瞬でグラフを描き終えてしまいます。そのため、**敢えて**こうした動きをゆっくりさせるための処理を入れ込んでいます。コメントにあるように、 Sleep wait_ms で、指定したミリ秒だけ動作を止めることができます。お好みで調整してみてください。

    冒頭のコードは、Sleep関数を Excel マクロ 内で使用できるようにするための、おまじないのようなものです。

    自分で関数を当てはめてみよう

    プログラムの構成はわかりましたでしょうか?

     y = (-1) * i

    この部分をお好きな関数に当てはめてみますと、オリジナルの関数グラフの動きが出せます。是非、ご自身でお試しください。


    他の Excel VBA アニメーションはこちら!

    コメント

    タイトルとURLをコピーしました