top of page

​タグ一覧

配列処理(76)

シート・セル操作(37)

ファイル操作(33)

階層化フォーム(33)

開発事例(31)

図形操作(29)

設計思想(15)

ユーザーフォーム(12)

シフト表(12)

講座実施報告(12)

数学(11)

イベントプロシージャ(10)

開発効率化(10)

コード自動生成(10)

GAS(10)

技術解説(9)

ココナラ(9)

文字列操作(8)

Webアプリ(8)

Googleスプレッドシート(6)

その他(5)

アニメーション(5)

副業(5)

介護・福祉(5)

OneDrive(4)

条件付き書式(4)

イミディエイトウィンドウ(4)

クリップボード(4)

小説(3)

日報(3)

JavaScript(3)

PDF(3)

HTML(3)

公開ツール(3)

クラスモジュール(2)

コード解説(2)

パズル(2)

小ネタ(2)

フリーランス(2)

Antigravity(2)

カレンダー(2)

Enum(2)

医療(2)

LookerStudio(2)

リスキリング(2)

Discord(2)

Outlook(2)

デスクトップアプリ(2)

スクレイピング(1)

WebAPI(1)

PowerShell(1)

文書作成(1)

スプレッドシート(1)

経理(1)

超勉強会(1)

溶接ロボット(1)

楽天市場(1)

VBA不使用(1)

実行予約(1)

CAD(1)

給与計算(1)

QRコード(1)

python(1)

学校(1)

発注書(1)

Excelの図形だけで動く3Dルービックキューブ|AI登場前に書いたVBAクラス12個のしくみ

4 日前
読了時間: 5分

まずは動画で、キューブが動く様子と、しくみの全体をご覧ください。

このルービックキューブは、Excelのワークシートに図形(シェイプ)を並べて描いています。3Dの機能や外部のライブラリは使っていません。1コマごとに小さな四角形の図形を描き直し、その画面を画像として保存して、つなげて動画にしています。

Excelのシートの上で、5×5×5のルービックキューブが回っている画面

この記事では、動画の内容を文章と画面で振り返ります。数学の話が多く出てきますが、すべてを理解する必要はありません。「Excelの中でこんな計算をしているのか」という雰囲気を感じていただければうれしいです。

 

AIが登場する前に書いたプログラム

作ったのは2022年1月です。ChatGPTが公開されたのは2022年11月なので、その10か月ほど前になります。

ベクトルの計算、行列、平面の方程式といった部品も、すべて自分でクラスとして書いています。下の画面は、ベクトルの外積を計算する部分の実際のコードです。

2022年1月の開発から、2022年11月のChatGPT公開までの年表と、外積を計算する実際のコード

規模は、クラスが12個、コードが約5,000行です。ここからは、動画と同じ4つの章に分けて紹介します。

 

第1章:本当に図形でできているのか

まずは証拠からです。描かれたキューブの図形を、マウスでつかんで引っ張ってみました。

描いたキューブから、小さな四角形の図形をマウスで1枚ずつ引き抜いている画面

小さな四角形が1枚ずつ外れていきます。外れた跡には黒い面が見えます。立方体の内側の面を黒く塗っているためで、ただの絵ではなく、立方体を組み立てて描いていることが分かります。

まとめて選んで横に引き伸ばすと、キューブがただの図形の集まりだということがよく分かります。

たくさんの図形をまとめて選び、横に引き伸ばしてキューブが崩れた画面

 

12個のクラスを5つの層に分けた

中身は、12個のクラスが5つの層に分かれています。下の層ほど単純な道具で、上の層はそれを組み合わせて使います。

  • 数学:ベクトル(clsVector3D)、直線の式(clsLineEq)、平面の式(clsPlateEq)

  • 形:空間に置いた多角形(clsPlate3D)と線(clsLine3D)

  • 描画:多角形をExcelの図形に変える(clsShapePlate3D と、その集まりの clsShapePlates3D など)

  • 部品:面6枚でできた立方体(clsCube)

  • 全体:立方体を集めたルービックキューブ(clsRubiksCube)と、回転の管理(clsRubiksCubeRotation)

12個のクラスを、数学・形・描画・部品・全体の5つの層に分けた図

 

1コマごとに描き直す

1コマを描くたびに、次の4つをくり返しています。

  1. 視点を決める

  2. 空間の点を画面に写す

  3. 面の前後を並べる

  4. 光の向きから色を塗る

描いた画面は、セルの範囲ごと画像として保存します。5×5のキューブでは402コマを保存し、それをつないで動画にしました。

視点を決める、画面に写す、前後を並べる、色を塗るの4つをくり返す図と、保存したコマの並び

 

第2章:3Dを画面に写す

 

立方体の向きは3本のベクトルで決まる

立方体の位置と向きは、X方向とY方向の2本のベクトルと、基準になる点の3つだけで持っています。Z方向は、2本のベクトルの外積から計算します。

立方体と、X方向・Y方向・Z方向の矢印、基準の点O。外積と回転の行列の式

回すときは、この3本に回転の行列をかけるだけです。6枚の面の位置は、回したベクトルから自動で組み立て直されます。実際のコードは次のとおりです(Z軸まわりに回す部分)。

 

視点から見た角度で画面の位置を決める

空間の点を画面に写すときは、視点の「右・前・上」の3本のベクトルで行列を作り、その逆行列をかけて、視点から見た座標に変えます。そこから左右と上下の角度を求めて、画面の位置にします。

角度で位置を決めるので、遠くにあるものほど画面では小さく写ります。下の図では、同じ大きさの箱でも、遠い箱(青)のほうが画面上では短くなっています。

視点・画面・同じ大きさの2つの箱。遠い箱ほど画面に写る長さが短くなる図と、投影の式

最後に、4つの頂点をつないだ多角形を、AddPolyline でシートに描きます。これがExcelの図形になります。

4つの頂点をつないで、多角形の図形をシートに描いた画面

 

第3章:手前の面を正しく描く

 

Excelの図形には奥行きがない

ここがいちばん苦労したところです。Excelの図形には奥行きの情報がなく、後から描いたものが上に重なるだけです。何も考えずに描くと、奥にあるはずの面が手前の面の上に出てしまいます。

手前にあるはずの図形の上に、後から描いた奥の図形が重なってしまう例

そこでまず、裏を向いた面を消します。面の向きと視線の角度が90度を超えたら、その面は描きません。立方体なら、これで6枚のうち3枚ほどが減ります。

立方体の6枚の面のうち、裏を向いた面を描かないようにした図

 

2枚ずつ前後を比べる

残った面は、2枚ずつ前後を比べます。比べ方は次のとおりです。

  1. 視点から、相手の面(B)の頂点に向かって線を引く

  2. その線と、自分の面(A)の平面との交点を求める

  3. 交点が面Aの多角形の内側にあるかを調べる(横に伸ばした線が辺と交わる回数を数え、奇数なら内側)

  4. 内側を通り抜けていたら、視点からの距離を比べて、どちらが手前かを決める

視点から面Bの頂点へ引いた線が面Aを通り抜ける図。交点、内側かどうかの判定、距離の比較

点が多角形の内側にあるかどうかは、交わる回数で判定しています。実際のコードの一部です。

 

順位をつけて奥から描く

すべての組み合わせの結果を表にまとめ、行ごとに合計して順位をつけます。そして、奥の面から順に描いていきます。いちばん手前の面が最後に描かれるので、正しく重なります。

面A〜Dの前後を比べた表と、奥の数が多い順にB、D、A、Cと描いていく図

 

光の向きから色を計算する

面の色は、光の向きと面の角度から計算しています。光が当たらない面ほど暗くなり、立体らしく見えます。

光源の位置によって、キューブの各面の明るさが変わる図と、明るさの式

 

第4章:回転の二重管理と、元に戻るしくみ

 

見た目と「どこに何があるか」を別々に管理する

ルービックキューブを回すとき、2つのことを別々に管理しています。

  • 見た目:回す段の立方体だけを、少しずつ回して、なめらかに動かす

  • どこに何があるか:90度回り切ったところで、立方体の名前を入れた3次元の配列を入れ替える

左は少しずつ回るキューブ、右は90度回り切ったときに入れ替わる名前の配列

見た目だけを回していると、何回か回したあとで「次に回す段にどの立方体があるか」が分からなくなります。そのため、立方体に「1_1_3」のような位置の名前を付け、配列で居場所を記録しています。

 

段を取り出し、90度回して戻す

配列の入れ替えは、回した段を2次元の配列として取り出し、90度回して、元の場所に戻すという手順です。これで、次にどの段を回しても、正しい立方体を動かせます。

3次元の配列から上の段を取り出し、2次元の配列として90度回した図

 

ログを逆から再生して元に戻す

回した記録(どの軸の何段目を、どちら向きに回したか)は、ログとして残しています。最後は、そのログを下から順に、向きを反対にして再生し、そろった状態に戻しています。

回転のログの例と、下から順に向きを反対にして再生し、キューブがそろった状態に戻った画面

 

1辺の個数は自由に変えられる

1辺の個数は自由に変えられます。1×1も、2×2も、5×5も、同じコードで動きます。

内側の見えない立方体は作らないようにしているので、そのぶん計算も軽くなります。5×5×5なら125個のうち、作るのは外側の98個だけです。

1×1、2×2、5×5のキューブの画面と、内側の27個を作らないことを示す断面の図

 

まとめ

Excelの図形だけで3Dのルービックキューブを動かすために、次のような道具を組み合わせています。

  • ベクトルと外積、回転の行列

  • 逆行列と角度を使った、画面への投影

  • 直線と平面の交点、多角形の内外判定による前後の判定

  • 3次元の配列とログによる回転の管理

ベクトル、逆行列、投影、平面との交点、多角形の内外判定、配列の回転のキーワードとキューブの画面

AIのない時代でも、数学と設計を一つずつ積み重ねれば、Excel VBAでここまで作ることができます。小さな部品をクラスに分けて組み合わせる考え方は、ふだんの業務ツールの開発にもそのまま生きています。

同じように図形を描き直して動かす例として、Excelで幾何学模様を自動作図するツールも紹介しています。

その作業、自動化できるかもしれません

毎月くり返している集計・転記・帳票づくりに何日もかかっていませんか。
Excelはそのままで、面倒な部分だけを自動化できます。ご相談は無料です。

softex-celwareロゴ 透過 横長.png

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2026 softex-celware。Wix.com で作成されました。

bottom of page