【VBAマジック!】続・距離攻略!Excelで2種の長さを自動計算

【VBAマジック!】続・距離攻略!Excelで2種の長さを自動計算 Excel

Excelが距離計に!?

セルとセルの「どれくらい離れてる?」とその「軌跡」まで自動で測っちゃおう!

Excelを使っている皆さん、こんにちは!

まず、前回の記事ではカーソルの「移動回数」を数える魔法をご紹介しましたが、
楽しんでいただけましたか?

今回はさらにパワーアップ!

単に「どれだけ離れたか」だけでなく、その移動した距離が「どれだけ積み重なったか」という軌跡(累積値までも、Excelが自動で記録してくれる魔法に挑戦しましょう!

「え、距離の合計までわかるの?」
「なんだかすごそうだけど、難しくない…?」

そんな声が聞こえてきそうですね。
でも大丈夫、安心してください!

基本的な考え方は前回までと同じ。

今回もExcel初心者の方でも楽しめるように、分かりやすく、
そして「魔法みたい!」と感じていただけるテクニックをご紹介します。

  1. 導入:一歩の重み、その軌跡を意識してみよう
  2. 二つの距離の測り方:ユークリッド距離とマンハッタン距離
    1. ユークリッド距離:空飛ぶ鳥の最短ルート!
    2. マンハッタン距離:碁盤の目の街をコツコツと!
  3. 魔法の部屋へ再び!VBAエディターの準備
  4. 合わせ技の魔法!二つの距離とその軌跡を一度に知る呪文
    1. 呪文の解説:はじめの準備と共通の仕組み
      1. イベントプロシージャの宣言:Worksheet_SelectionChange
      2. 前に選ばれたセルを記憶:Static p As Range
      3. 距離の累積値を記憶する魔法の箱:Static d_c As Double, Static m_c As Long
      4. 最初のクリックかどうかの判定:If Not p Is Nothing Then
      5. セルの行番号と列番号を取得
    2. 呪文の解説:ユークリッド距離(直線距離)の計算と記録
      1. ユークリッド距離の計算:Dim d As Double …
      2. 今回のユークリッド距離をB1セルに表示
      3. ユークリッド距離の軌跡(累積値)をd_cに記録し、B2セルに表示
    3. 呪文の解説:マンハッタン距離(道のり距離)の計算と記録
      1. マンハッタン距離の計算:Dim m As Long …
      2. 今回のマンハッタン距離をC1セルに表示
      3. マンハッタン距離の軌跡(累積値)をm_cに記録し、C2セルに表示
    4. 呪文の解説:次の移動への大切な準備
      1. 次のクリックに備える:Set p = t
      2. プロシージャの終了:End Sub
  5. 魔法の呪文を唱える!(コードの書き込みと実行)
  6. いざ、魔法体験!距離とその軌跡を確かめよう!
    1. もし、うまくいかない場合は…?
      1. 呪文のコピペミスや入力ミスはないですか?
      2. 本当に「Sheet1」で試していますか?
      3. マクロが有効になっていますか?
      4. 最初のクリックではありませんか?
  7. 魔法の応用、そして次なる冒険へ
  8. 溜まった距離(累積値)をゼロに戻したいときは?
    1. VBEリセットボタンで累積値をクリア!
  9. まとめ:距離とその軌跡が、新たな視点をくれる!

導入:一歩の重み、その軌跡を意識してみよう

はじめに、私たちが「距離」を考えるとき、単発の移動だけでなく、
連続した移動の総距離が気になることもありますよね。

例えば、お散歩でどれだけの道のりを歩いたか、
ドライブで総走行距離はどれくらいか、などです。

今回は、Excelのセルを使いながら、2種類の「距離」の測り方と、
それらが積み重なった「軌跡(累積値」を自動で記録する方法を見ていきます。

この「累積値」という考え方、実は色々な場面で役立つんですよ。

さあ、Excelと共に、新たな発見の旅に出かけましょう!

二つの距離の測り方:ユークリッド距離とマンハッタン距離

今回も基本となる「距離」の考え方は二つです。

もう一度おさらいしましょう!

ユークリッド距離:空飛ぶ鳥の最短ルート!

まず一つ目は「ユークリッド距離」です。

これは、二つの点をまっすぐに結んだ、いわゆる「直線距離」のことでしたね。

ピタゴラスの定理」が活躍する、アレです!

直線距離の説明図

Excelのセルで言うと、あるセルから別のセルへ、
斜めにスパッと移動するような感覚の距離です。

マンハッタン距離:碁盤の目の街をコツコツと!

二つ目は「マンハッタン距離」です。

これは、まるで碁盤の目のように区画された街を移動するときの「道のり」のような距離でした。

マンハッタン距離の説明図

Excelのセルで言うと、上下左右のキーだけでカチカチと移動する感覚の距離、と言えました。

そして今回、これらの距離がどのように積み重なっていくのかも見ていきます!

魔法の部屋へ再び!VBAエディターの準備

さて、いよいよExcelに新しい魔法を教える時間です!

今回も、魔法の呪文を書き込む場所「VBAエディター(VBE)」を使いますよ。

VBAエディターの開き方や基本的な使い方は、もう大丈夫ですよね?

もし不安な方は、これまでの記事を少し見返してみてくださいね。

VBAエディター(VBE)の図

準備ができたら、前回同様、魔法をかけたいシートのコードウィンドウを開き、「Worksheet」と「SelectionChange」を選んで、呪文を書き込む準備をしましょう!

SelectionChangeの選択

合わせ技の魔法!二つの距離とその軌跡を一度に知る呪文

今回は、ユークリッド距離マンハッタン距離
それぞれの「今回の移動距離」と「これまでの総移動距離(累積値)」を、
一度に計算して表示する、とっても欲張りで便利な魔法の呪文をご紹介します!

はじめに、以下の呪文を、
準備したコードウィンドウに書き込んでみましょう。


Private Sub Worksheet_SelectionChange(ByVal t As Range)
    Static p As Range
    Static d_c As Double ' ユークリッド距離の累積値を格納する変数
    Static m_c As Long   ' マンハッタン距離の累積値を格納する変数

    If Not p Is Nothing Then
        Dim r1 As Long, c1 As Long
        Dim r2 As Long, c2 As Long

        r1 = p.Row
        c1 = p.Column
        r2 = t.Row
        c2 = t.Column

        ' --- ユークリッド距離の計算と表示 ---
        Dim d As Double
        d = Sqr((r2 - r1) ^ 2 + (c2 - c1) ^ 2)
        ' 今回のユークリッド距離をB1セルに表示
        ThisWorkbook.Sheets("Sheet1").Range("B1").Value = Format(d, "0.00")

        ' ユークリッド距離の累積値を計算し、B2セルに表示
        d_c = d_c + d
        ThisWorkbook.Sheets("Sheet1").Range("B2").Value = Format(d_c, "0.00")

        ' --- マンハッタン距離の計算と表示 ---
        Dim m As Long
        m = Abs(r2 - r1) + Abs(c2 - c1)
        ' 今回のマンハッタン距離をC1セルに表示
        ThisWorkbook.Sheets("Sheet1").Range("C1").Value = m

        ' マンハッタン距離の累積値を計算し、C2セルに表示
        m_c = m_c + m
        ThisWorkbook.Sheets("Sheet1").Range("C2").Value = m_c
    End If

    Set p = t
End Sub

前回までのコードと似ている部分も多いですが、
新しく「累積値」を扱う部分が加わっていますね!

それでは、この呪文をパーツごとに丁寧に見ていきましょう。

コードの図

呪文の解説:はじめの準備と共通の仕組み

イベントプロシージャの宣言:Worksheet_SelectionChange

Private Sub Worksheet_SelectionChange(ByVal t As Range)

まず、これはお馴染み、
このExcelシートで、どこかのセルが選ばれたらSelectionChange)、以下の特別な動きをしますよ~」という合図です。

ここで、t は、新しく「選ばれたセル」のことを指すあだ名です。

前に選ばれたセルを記憶:Static p As Range

Static p As Range

次に、p は、「前に選ばれていたセル」を覚えておくための箱(変数)です。

Static と宣言することで、この魔法が何回も使われても、p の中身を忘れずに覚えておけます。

距離の累積値を記憶する魔法の箱:Static d_c As Double, Static m_c As Long

Static d_c As Double

Static m_c As Long

さあ、ここが新しいポイントです!

d_c というのは「ユークリッド距離の累積値cumulativeな値)」を覚えておくための魔法の箱です。Double型なので小数点も扱えます。

そして、m_c というのは「マンハッタン距離の累積値」を覚えておくための魔法の箱です。こちらはLong型で整数を扱います。

これらもStaticなので、セルを選択するたびに値がリセットされず、どんどん加算されていきます。

最初のクリックかどうかの判定:If Not p Is Nothing Then

If Not p Is Nothing Then

続いて、「もし、前に選ばれたセル p 空っぽじゃなかった(つまり、これが最初のクリックじゃなかったら)」という意味です。

最初の1回目のクリックでは、まだ「前のセル」がないので、ここから下の計算は動きません。

セルの行番号と列番号を取得

Dim r1 As Long, c1 As Long

Dim r2 As Long, c2 As Long

r1 = p.Row

c1 = p.Column

r2 = t.Row

c2 = t.Column

これらの部分では、前に選択されていたセル(p)と、
今回新しく選択されたセル(t)の行番号列番号を、それぞれ変数に格納しています。

これで距離計算の準備ができました。

呪文の解説:ユークリッド距離(直線距離)の計算と記録

ユークリッド距離の計算:Dim d As Double …

Dim d As Double

d = Sqr((r2 - r1) ^ 2 + (c2 - c1) ^ 2)

d = Sqr((r2 - r1) ^ 2 + (c2 - c1) ^ 2)
の数式

まず、変数dを用意し、お馴染みのピタゴラスの定理を使って、
今回移動したユークリッド距離を計算しています。

今回のユークリッド距離をB1セルに表示

ThisWorkbook.Sheets("Sheet1").Range("B1").Value = Format(d, "0.00")

次に、計算したばかりの「今回のユークリッド距離d)」を、
Sheet1のB1セルに小数点以下2桁で表示します。

B1セルに小数点以下2桁で表示

これで、今どれだけジャンプしたかが一目でわかりますね!

ユークリッド距離の軌跡(累積値)をd_cに記録し、B2セルに表示

d_c = d_c + d

ThisWorkbook.Sheets("Sheet1").Range("B2").Value = Format(d_c, "0.00")

そして、ここが軌跡の記録です!

今回のユークリッド距離dを、
累積用の魔法の箱d_cに足しこみます(d_c = d_c + d)。

こうして更新された「これまでのユークリッド距離合計d_c)」を、
Sheet1のB2セルに小数点以下2桁で表示します。

B2セルに小数点以下2桁で表示

移動するたびに、B2セルの数字が増えていくのが確認できるはずです!

呪文の解説:マンハッタン距離(道のり距離)の計算と記録

マンハッタン距離の計算:Dim m As Long …

Dim m As Long

m = Abs(r2 - r1) + Abs(c2 - c1)

同様に、変数mを用意し、の差の絶対値の差の絶対値を足し合わせることで、
今回移動したマンハッタン距離を計算します。

今回のマンハッタン距離をC1セルに表示

ThisWorkbook.Sheets("Sheet1").Range("C1").Value = m

計算した「今回のマンハッタン距離m)」を、Sheet1のC1セルに表示します。

「今回のマンハッタン距離(m)」を、Sheet1のC1セルに表示

上下左右にどれだけ動いたかの合計ですね。

マンハッタン距離の軌跡(累積値)をm_cに記録し、C2セルに表示

m_c = m_c + m

ThisWorkbook.Sheets("Sheet1").Range("C2").Value = m_c

そして、こちらも軌跡の記録です!

今回のマンハッタン距離mを、累積用の魔法の箱m_cに足しこみます(m_c = m_c + m)。

こうして更新された「これまでのマンハッタン距離の合計m_c)」を、
Sheet1のC2セルに表示します。

「これまでのマンハッタン距離の合計(m_c)」を、
Sheet1のC2セルに表示

こちらも、移動のたびにC2セルの数字がどんどん増えていくことでしょう!

呪文の解説:次の移動への大切な準備

次のクリックに備える:Set p = t

Set p = t

最後に、今回新しく選ばれたセルtの情報を、
次の計算のために「前に選ばれていたセル」としてpに覚えておかせます。

プロシージャの終了:End Sub

End Sub

これで一連の魔法の呪文はおしまいです。

どうでしょう?

今回の距離」と「これまでの距離の合計」が、
それぞれ別のセルに記録されていく仕組み、ご理解いただけましたか?

全体図

魔法の呪文を唱える!(コードの書き込みと実行)

では、このパワーアップした魔法の呪文を、
VBAエディターのコードウィンドウに正確に書き込みましょう。

もちろん、コピー&ペーストでも大丈夫ですよ!

書けましたか?

このWorksheet_SelectionChangeという呪文は特別なので、
何か「実行ボタン」を押す必要はありません。

Excelシートに戻って、セルクリックして移動するだけで、
この魔法は自動的に発動します!

いざ、魔法体験!距離とその軌跡を確かめよう!

さあ、VBAエディターのウィンドウを閉じるか、
そのままにしてExcelの画面に戻りましょう。

(魔法はExcelファイルにちゃんと記憶されています!)

まず、Excelの「Sheet1」で、どこかのセルを一度クリックしてください。

どこかのセルを一度クリック

この最初のクリックでは、まだ「前のセル」がないので、
B1, C1, B2, C2セルには何も表示されないか、0が表示されているはずです。

次に、そこから別のセルをクリックして選んでみましょう!

…どうですか?

Sheet1の各セルを見てください!

  • B1セル:今回移動したユークリッド距離(直線距離)が表示されていますか?
  • C1セル:今回移動したマンハッタン距離(道のり距離)が表示されていますか?
  • B2セル:これまでのユークリッド距離の合計(累積値)が表示されていますか?
  • C2セル:これまでのマンハッタン距離の合計(累積値)が表示されていますか?

さらにいくつか異なるセルをクリックして移動してみてください。

B1セルとC1セルは、その都度の移動距離を示し、
B2セルとC2セルは、それまでの移動距離がどんどん足されていくのが分かるはずです!

まるで、あなたのセル移動の全記録(軌跡)が残っていくみたいで、
面白くないですか?

もし、うまくいかない場合は…?

呪文のコピペミスや入力ミスはないですか?

まず、もう一度VBAエディターを開いて、
呪文(コード)が正確に入力されているか、じっくり見比べてみてください。

一文字でも違うと、魔法はうまくかかりません。

本当に「Sheet1」で試していますか?

次に、今回の呪文は「Sheet1」の各セルに表示するようになっているので、
他のシートでは表示されません。

マクロが有効になっていますか?

さらに、ファイルを開いたときに「マクロを有効にする」といったメッセージが出たら、
必ず有効にしてくださいね。

最初のクリックではありませんか?

最後に、距離を計算するには「前のセル」と「今のセル」の二つが必要です。

ファイルを開いて最初のセルクリックでは、
まだ「前のセル」の情報がないため、計算が開始されません。

2回目のセル選択から表示が始まりますので、ご確認ください。

魔法の応用、そして次なる冒険へ

さて、今回の「距離とその軌跡を記録する魔法」、いかがでしたか?

「移動のたびに距離が足されていくの、面白い!」
「これ、何かに使えそう!」

そう感じていただけたら嬉しいです!

この「累積値を計算する」という考え方は、

実は次にご紹介予定の「最短ルートでゴミを収集するExcelパズルゲーム」で、
非常に重要な役割を担います。

例えば、シート上でセルが移動するたびに「総移動コスト」として、
この累積距離を使うことができるのです。

ユークリッド距離ベースの総移動コストと、マンハッタン距離ベースの総移動コスト、

どちらを少なく抑えるか…なんて戦略も考えられますね!

どうぞお楽しみに!

溜まった距離(累積値)をゼロに戻したいときは?

さて、たくさんセルを移動させて遊んでいると、
B2セルやC2セルに表示される累積された距離が、
どんどん大きな数字になっていきますよね。

「一度このカウント(累積値)をリセットして、またゼロから測り直したいな…」

そんなふうに思うこともあるかもしれません。
ご安心ください!

そんなときは、簡単な方法でこれらの数字をリセットすることができます。

今回は、VBAエディター(VBE)のリセットボタンを使う方法をご紹介しましょう。

VBEリセットボタンで累積値をクリア!

まず、Excelの「開発」タブから「Visual Basic」を選んで、VBAエディターを開きます。(この手順はもうバッチリですね!)

次に、VBAエディターの画面上部にあるツールバーを見てください。

VBAエディターの画面上部にあるツールバー

そこに、青い四角形のような形をした「リセット」ボタンがあるはずです。

「リセット」ボタン

この「リセット」ボタンをポチッと一度クリックします。

たったこれだけです!

この操作を行うと、私たちの魔法の呪文(コード)の中で Static をつけて宣言した変数(今回の例では d_cm_c)が、

プログラムが始まった最初の状態、
つまり中身が空っぽ(数値型の場合は通常0)の状態に戻ります。

VBAエディターを閉じてExcelシートに戻り、
再びセルを選択して移動させてみてください。

どうでしょう?

B2セルとC2セルの累積値が、見事に0から再スタートしているはずです!

ちなみに、このStatic変数は、Excelファイルを一度閉じて、もう一度開き直したときにも初期状態に戻ります。

なので、VBEのリセットボタンを使う方法は、
「ファイルを閉じずに、今すぐリセットしたい!」という場合に便利な方法と言えますね。

これで、いつでも好きなタイミングで、
新鮮な気持ちで距離とその軌跡の測定を再開できますよ!

まとめ:距離とその軌跡が、新たな視点をくれる!

今回は、ExcelのVBAを使って、選択したセル間の「今回の距離」と「これまでの総移動距離(累積値)」を、ユークリッド距離マンハッタン距離の両方で自動計算して表示する方法をご紹介しました。

単に場所から場所への距離を知るだけでなく、その移動の「軌跡」を数値として捉えることで、
Excelの使い方がまた一つ広がったのではないでしょうか。

この「累積」という視点は、日々の業務や趣味の中でも、
何か新しい分析や便利なツールのヒントになるかもしれません。

Excelは、あなたの「こうだったらいいな」を形にするための、強力な魔法の杖です。

今回の記事で分からないことや、
「こんな使い方もできそう!」といったアイデアがあれば、ぜひ教えてくださいね。

それでは、また次回の記事でお会いしましょう!

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