VBA練習問題
VBA100本ノック 50本目:トリボナッチ数列

VBAを100本の練習問題で鍛えます
公開日:2020-12-19 最終更新日:2021-02-02

VBA100本ノック 50本目:トリボナッチ数列


直前の三項の和として各項が定まるトリボナッチ数列を出力する問題です。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータはご自身でご用意ください。


出題

出題ツイートへのリンク

#VBA100本ノック 50本目
記念すべき50本目は数学です。
直前の三項の和として各項が定まるトリボナッチ数列を出力してください。
0,0,1,1,2,4,7,13,24,44,81,149,274,…
最初の0,0,1は固定です。
※エクセルの限界まで出力してみましょう。
※出力先は任意


50本記念なので、密かな裏お題を2つほど小さい声でぼそっと、、、
・再帰の練習にやってみるのもよいかも。
・VBAの整数の桁数の限界に挑戦、どこまでいけるのかな。


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

三項を1つずつずらしながら、エラーになるまでループさせます。
n1,n2,n3→n2,n3,n1+n2+n3
まずデータ型はもっともよく使われるLong型でやってみます。
出力はシートのA列に順に出力していきます。
エクセルは15桁までしか正しく扱えませんので、数値としてではなく文字列として出力します。

Sub VBA100_50_01()
  On Error GoTo ErrExit
  Dim n1 As Long: n1 = 0: Cells(1, 1) = "'" & n1
  Dim n2 As Long: n2 = 0: Cells(2, 1) = "'" & n2
  Dim n3 As Long: n3 = 1: Cells(3, 1) = "'" & n3
  Dim i As Long: i = 3
  Dim ntmp As Long
  Do
    ntmp = n1 + n2 + n3
    i = i + 1
    Cells(i, 1) = "'" & ntmp
    n1 = n2
    n2 = n3
    n3 = ntmp
  Loop
ErrExit:
End Sub

マクロ VBA 100本ノック

これがLongでの限界です。
エクセルが64bitならLongLong型があります。
今度は、Do...Loopではなく再帰させてみましょう。

Sub VBA100_50_02()
  Dim n1 As LongLong: n1 = 0: Cells(1, 1) = "'" & n1
  Dim n2 As LongLong: n2 = 0: Cells(2, 1) = "'" & n2
  Dim n3 As LongLong: n3 = 1: Cells(3, 1) = "'" & n3
  Dim i As Long: i = 4
  On Error Resume Next
  Call VBA100_50_02_recur(i, n1, n2, n3)
End Sub

Sub VBA100_50_02_recur(i, n1 As LongLong, n2 As LongLong, n3 As LongLong)
  Dim n As LongLong: n = n1 + n2 + n3
  Cells(i, 1) = "'" & n
  i = i + 1
  Call VBA100_50_02_recur(i, n2, n3, n)
End Sub

マクロ VBA 100本ノック


これがLongLongでの限界です。
変数宣言のデータ型にはありませんが、VBAではDecimal型を扱う事が出来ます。
変数はVariantで定義しておいて、CDec関数でDecimal型として格納します。

Sub VBA100_50_03()
  On Error GoTo ErrExit
  Dim i As Long
  Dim n1, n2, n3, ntmp
  n1 = 0: Cells(1, 1) = "'" & n1
  n2 = 0: Cells(2, 1) = "'" & n2
  n3 = 1: Cells(3, 1) = "'" & n3
  i = 4
  Do
    ntmp = CDec(n1 + n2 + n3)
    Cells(i, 1) = "'" & ntmp
    n1 = n2
    n2 = n3
    n3 = ntmp
    i = i + 1
  Loop
ErrExit:
End Sub

マクロ VBA 100本ノック


VBAでも結構な桁数まで扱う事が出来るものです。
VBAで普通に扱えるのはここまでです。
これ以上は自力で足し算ロジックを作成することになります。
いくつも回答が来ているので参考にしてください。
記事にはVBAコードを掲載しました。


補足

VBAのデータ型を超える整数値を扱うには独自に数値を扱う必要があります。
以下のページでは、Stringを1桁ずつ足し上げています。
演算スピードを考えるなら、まとまった桁数(例えばLongで8桁等)で区切って、それごとに管理して計算していく等の工夫をすると良いと思います。

100桁の正の整数値の足し算
ツイッターで出したVBAのお題です。数の単位に「無量大数」というものがあります。VBAでこの無量大数の足し算をするにはどうしたら良いでしょうか。そこで、100桁の正の整数の足し算をVBAで実現してみましょう。
LSetとユーザー定義型のコピー(100桁の足し算)
・数値データ型の数値範囲 ・100桁数値の足し算VBA ・100桁数値の足し算VBAの使い方と結果 ・100桁数値の足し算VBAの解説


サイト内関連ページ

第12回.変数宣言のDimとデータ型|VBA入門
・データ型 ・変数の使い方 ・変数名の規則 ・良く使われる変数名 ・自動型変換、暗黙の型変換 ・変数宣言の必要性 ・Dim変数宣言のまとめ
第13回.定数宣言のConstと型宣言文字|VBA入門
・Const定数の基本 ・変数でも同じ事が出来るが・・・ ・ダブルクォーテーションについて ・型宣言文字 ・Constにデータ型を指定しない場合のデータ型 ・その他の定数 ・Const変数宣言のまとめ
CDec関数|VBA関数
・CDec関数 ・CDec関数の使用例 ・10進型 (Decimal)について ・データ型変換関数一覧
VBAの小数以下の演算誤差について|VBA技術解説
・小数以下の演算誤差とは ・小数以下の演算誤差を実際のVBAで確認 ・データ型で小数以下の演算誤差に対応 ・小数以下の演算誤差にデータ型以外で対応する ・VBAの小数以下の演算誤差の最後に




同じテーマ「VBA100本ノック」の記事

47本目:Window操作
48本目:配列と数値型
49本目:条件付き書式の判定
50本目:トリボナッチ数列
51本目:シート一覧と印刷ページ数
52本目:複数シートの一括印刷
53本目:テーブルの扱いと年齢計算
54本目:シートのChangeイベント
55本目:他ブックのマクロを起動
56本目:数式内の自身のシート名を消す
57本目:ファイルの更新日時


新着記事NEW ・・・新着記事一覧を見る

ListBox・ComboBoxをマウスホイール対応させる|ユーザーフォーム入門(2026-08-09)
VBA モジュールエクスポートツール|モジュールを選別して一括出力|VBAサンプル集(2026-08-06)
「SUMIFSで動くのにXLOOKUPでエラー?」型不一致の関数別挙動|エクセル関数応用(2026-08-03)
生成AIが暴いた「VBAオワコン説」の盲点|問われるのは言語ではなく評価軸|エクセル雑感(2026-07-04)
【ITとは何か】Excel・VBAを学ぶ前に知っておきたい「4つの本質」|エクセル雑感(2026-06-24)
2つのシート名を交換するVBAをGeminiに作らせてみた。|VBA技術解説(2026-05-22)
ヘッダーに合わせて列をソートして値貼り付けするスマートな方法|VBAサンプル集(2026-05-20)
4大分岐関数の使い分け(IF/IFS/SWITCH/CHOOSE)|エクセル入門(2026-05-19)
Excel主要関数 習得難易度 10段階(文字列・日付除く)|エクセル雑感(2026-04-27)
Excelのシート5分類|エクセル雑感(2026-03-27)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロとは?VBAとは?VBAでできること|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.メッセージボックス(MsgBox関数)|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ