PythonとVBAで学ぶ、プログラミングから得た問題解決と人生の教訓

スポンサーリンク

当サイトではアフィリエイト広告を利用しています

はじめに

占いに興味があって「自分でもデータを扱えるようになれたら…」と思ったことはありませんか?

私自身、占いが好きで、四柱推命や紫微斗数などに触れる機会もありますが、複雑な計算をWebサイトでしていますよね。

どうやって計算しているのかって少し興味がありました。

そんな時に見つけたのが、「占いと暦の天文計算入門」という本です。

この本では、Pythonを使って占いで必要な「節入り計算」(二十四節気の計算など)を自動化する方法が紹介されていて、プログラミング初心者でも挑戦しやすい内容になっていました。

Pythonとは、プログラミング言語の一つで、シンプルで読みやすい文法が特徴です。

特に、データ分析や自動化に強く、多くの開発者や研究者に支持されています。

初心者にも扱いやすく、簡単なコーディングから複雑な計算まで幅広く利用されています。

「占いとPython」というタイトルに惹かれ、久しぶりにプログラミングに挑戦してみることにしました

元々、仕事でVB.NETやC#、VBAなどには少し触れていたため、プログラミング自体は初心者ではありませんが、Pythonは初めてだったので新しい発見がありました。

今回は、その経験をシェアしたいと思います。

Pythonの苦労から始まった挑戦

まずは、Pythonのインストールから始めました。

その次に、コーディング用のツールであるVSCodeをセットアップしました。

Pythonのソース自体は書籍に記載されており、技術的にはそれほど難しくはありませんでした。

しかし、ソース内で扱われている天体の位置計算の理論は非常に高度で、正直なところ全く理解できませんでした。

今回の最大の難関は、Kindle版の本からソースコードをコピーして書き出すことでした。

Kindleにはコピー制限があって、指定されたページ数しかコードをコピーできません。

そのため、プログラム全体を一度にコピーできず、一つ一つ手入力する必要がありました。

少し不便に感じた部分でしたね。

ソースコードをダウンロードできる場所があれば、非常に助かると思いました。

ちなみに、私はパソコン版のKindleを使用してPythonのコーディングを行っていますので、同じ方法で作業する方はその点もご注意ください。

特に、数字が並ぶ部分の手入力は厄介で、過去の経験から入力ミスが発生しやすいと感じていました。

そんな中で見つけたのが、左クリックを押しながらページ送りをし、メニューから「本文検索」を選んでコピーするという裏技です。

(おそらく他の人も使っているかもしれませんが…)

具体的な方法としては、

コピーしたいテキストの先頭を選択した状態で、

左クリックしながら、キーボードの方向キーの右でページを送り

左クリックを離した後に表示されるメニューから「本文検索」を選びます。

この検索語句の欄から全選択(Ctrl + Aなど)してコピーするわけですが、一度に多くのページをコピーできないため、手間がかかります。

私は10ページずつに分けて作業を行いました。

以下の画像は、「国立天文台」というテキストをコピーする手順です。

もちろん、コピーした後もPython特有のインデント(字下げ)ミスが頻発し、そのたびにエラーが発生してしまいました。

インデントのほんの少しのミスでプログラム全体が動作を止めてしまうので、その修正には手間がかかりました。

それでも、エラーの原因はほとんどがインデントミスだったので、基本的にはそれを修正していけば解決できました。

こうして修正を重ね、最終的には無事にPythonプログラムを動かすことができました。

正しい結果が表示された瞬間は、何とも言えない達成感がありましたね。

VBAへの移植で気づいたこと

Pythonでプログラムが無事に動いたので、次は「このプログラムをVBAでも再現できるか?」という疑問が浮かびました。

VBA(Visual Basic for Applications)とは、主にMicrosoft Office製品で使われるプログラミング言語で、特にExcelでの自動化やデータ処理に使われます

Excel VBAを使うことで、Excelの操作をプログラムで簡単に自動化できるため、効率化を図るのに便利です。

ExcelVBAは以前から使っていたので、これなら簡単にできるだろうと思い、移植作業に取り掛かりました。

しかし、予想外の壁にぶつかりました。

VBAで実行した結果が、Pythonの結果とズレているんです。

PythonとVBAでは、数値の扱いや演算処理の違いがあり、同じ計算をしているつもりでも結果が異なることがあります。

ネットで「書籍で使用されているVSOP87D(天体の位置を計算するための数式モデル)というプログラムは、VBAでは正しく動作しない」といった情報を目にしていたので、それが原因かもしれないと一瞬思いました。

しかし、実際には「同じ処理をしているはずなのにズレが大きかったため、それだけが原因ではない」と感じました。

そこで、プログラムの結果がズレる原因を探るために、デバッグ作業に取り掛かることにしました。

デバッグでの苦労—細分化の重要性

デバッグを始めた最初のステップは、PythonとVBAの結果を細分化して比較することでした。

具体的には、各処理ごとにPythonでの結果とVBAでの結果を一つ一つ比較し、どの時点でズレが生じているのかを探りました。

例えば、PythonではPrint()関数を使って各ステップの結果を表示し、VBAではDebug.Printを使って同じように結果を表示させ、両者を見比べていきました。

最初は同じ結果が返されていたのですが、途中のある処理でズレが生じていることに気づきました。

ここからがデバッグの本番です。

問題をさらに細分化し、一つ一つの処理を確認していく作業に移りました。

このプロセスを通じて、最終的にズレが発生している箇所を突き止めました。

大きな問題に直面したとき、全体を一気に解決しようとせず、細かく分解して一つ一つの問題を解決していくことが重要だと実感しました。

ズレの原因を発見

最終的に、ズレの原因はPythonとVBAの演算子の仕様が異なることにあると判明しました。

具体的には、Pythonでは「%演算子」、VBAでは「Mod演算子」は、どちらも除算の余りを返します

この2つが同じように動作していると思い込んでいたのですが、実際には異なる動きをしていました

Pythonの「%演算子」は小数点以下まで正確に余りを返すのに対し、VBAの「Mod演算子」は整数部分のみを返すという仕様の違いがあったのです。

Pythonの「%」では、37.6345という除算の余りを返すのに対し、

VBAの「Mod」では、37という整数部分のみを返していたのです。

この異なる数値をその後の計算で使用するため、次第に結果にズレが生じるようになりました。

例えば、

Pythonでは255.8974 ÷ 37.6345という計算が行われていたのに対し、

VBAでは255.8974 ÷ 37という計算が行われていたのです。

このようなズレが繰り返されることで、最終的な結果に大きな違いが生じてしまいました。

この原因に気づくまでには時間がかかりました。

なぜなら、最初は「Modと%は同じように動作する」という先入観があったためです。

その先入観のせいで、根本的な原因を見逃してしまい、解決までに時間を要しました。

細分化と先入観を捨てることの大切さ—人生にも役立つ教訓

今回のデバッグ作業を通じて、私は「問題を細分化して解決する」ことの重要性を再確認しました。

プログラム全体を見渡しても、細かい部分を見逃してしまうことがあります。

だからこそ、一つ一つの処理を丁寧に確認していくことで、問題の根本にたどり着くことができたのです。

これは人生にも通じる教訓だと感じました

私たちは、時に大きな問題に直面すると、それを一度に解決しようとしてしまいがちです。

しかし、問題を細かく分けて、一つずつ向き合うことで、意外にシンプルな解決策が見えてくることがあります。

さらに、先入観を捨てることの重要性も痛感しました。

最初から「Modと%は同じ働きをする」と思い込んでいたため、ズレの原因に気づくのが遅れてしまいました。

しかし、先入観にとらわれず、新しい視点で問題に向き合うことが、問題解決の近道になることを学びました。

まとめ

今回のプログラミング体験を通して得た教訓は、

「問題を細分化して冷静に向き合うこと」と、

「先入観にとらわれず、新しい視点で問題に取り組むこと」の大切さです。

大きな問題に直面したときでも、焦らずに全体を一度に見渡そうとせず、細かく分解して検証することで、思わぬ解決策が見つかることがあります。

プログラムのズレを解決する際も、原因を丁寧に探っていくことで、意外にシンプルな解決策にたどり着くことができました。

人生でも、複雑に見える問題の多くは、細分化して一つ一つに向き合うことで、驚くほど簡単に解決できる場合があるのです。

今回の経験を通して、プログラムの修正作業がまさに人生の悩みを解決するヒントになると感じました。

もし、この記事を読んで同じような挑戦を考えている方がいれば、ぜひ一歩踏み出してみてください

新しいことへの挑戦は、必ず大きな収穫が得られるはずです。

また、今回作成したプログラムに関心がある方、さらに詳しく知りたい方は、どうぞお気軽にお問い合わせください

自分の経験をもとに、同じような挑戦をしたい方のサポートができれば嬉しいです。

※2025年で計算すると5月と6月の2か所だけ、1秒ズレています。

上の画像がPythonの実行結果で、下がExcelVBAの実行結果です。

おそらくネットで見かけた「VSOP87Dというプログラムは、VBAでは正しく動作しない」といった情報は、こういう所なのかもしれません。

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