2023年10月20日金曜日

食堂によくある、バネが仕込まれた食器ディスペンサーの台車に皿や盆を積み重ねた光景で、常にトップしか出てこないのと同じだって ー Stack(VBAマクロ)

          
ウインドウズで標準機能の電卓が使えなくなったことは、以前、投稿しました。
それで、代わりに旧OSの電卓をインストールするなど、対応も紹介しています。

まあ、VBAコードでつくられた電卓もあって、その中身が自分には新鮮なんだ。
特にデータ保存をする”Stack”という概念は、今まで用いた経験がありません。

配列もCollectionも使わないデータ構造が新鮮ですが、半世紀以上も前に登場。
最近は、エクセルでもシート関数の”HSTACK”、”VSTACK”が実装されました。

この概念の系譜になると思いますが、有用なので廃れることもなく生き残った。
一方、コンピュータ言語では、割込み処理やサブルーチンの支援に有用らしい。

ですが、VBAでマクロを書くと、敢えて使わなくてもコードが書けるのも事実。
では、なぜこの機能が便利なのかと言うと、データの取出し方法のLIFOにある。

後入れ先出し法と言って、データ構造の閲覧として最後のデータが出力される。
これは、1+2=3の計算式と同じで、計算結果を最後に取り出すのと同じ手法。

このような考え方を使うから、VBAであれば電卓のコードに応用される分けだ。
これ以外で”stack”を使った実用コードは、ネットで見かけたことがありません。

なので、サンプルでテンキーを使う簡単電卓のコードを、書きあげてみました。
まあ、これが実用的かどうかは分かりませんが、データ構造を理解しましょう。

なお、データの追加取り出しを”プッシュ(Push)”、”ポップ(Pop)”と呼びます。ネットで見ましたが、用語の定義づけだけで、コマンドには該当していません。

というわけで、この”stack”のデータ構造を定義するのは、モジュールのみです。
また、VBAにおいてユーザーが定義するデータ構造体(Type)を組む手法と似ていて、こちらを勉強するのも良いかと思いますが、先ずはデータベースからちょっとした計算結果を引き出すには、これが便利だろうと直感するのでした。

<テンキー入力電卓マクロ(サンプル)モジュールに記述>
Option Explicit
Private stack(0 To 1) As Currency '通貨型変数、データ構造2個

Sub Implmnt() 'このプロシージャを実行
   Call Calc '計算処理のプロシージャ呼出し・実行
End Sub

Private Sub Calc() '計算処理
Dim Arthmtc As String, NrInpt As String, NrInpt2 As String 'Input用変数
Dim Ans As Double  '計算結果を格納する変数
   stack(0) = 0: stack(1) = 0 ' 'stackの初期化処理
      NrInpt = InputBox("数字を入力") 'InptBox呼び出し(三回)
         Arthmtc = InputBox("算式入力:+, -, *, /")
            NrInpt2 = InputBox("数字を入力")
               stack(0) = Val(NrInpt)
                  stack(1) = Val(NrInpt2)
    Select Case Arthmtc
        Case "+"  '加算
           Ans = stack(0) + stack(1)
              Call CalcRslt(Ans) 'プロシージャ呼び出し実行
        Case "-"  '減算
           Ans = stack(0) - stack(1)
              Call CalcRslt(Ans) 'プロシージャ呼び出し実行
        Case "*"    '掛け算
            Ans = stack(0) * stack(1)
               Call CalcRslt(Ans) 'プロシージャ呼び出し実行
        Case "/"    '割り算
            If stack(1) = 0 Then
                Ans = 0
                   MsgBox "計算結果 : " & Ans
            Else
                Ans = stack(0) / stack(1)
                   Call CalcRslt(Ans) 'プロシージャ呼び出し実行
            End If
    End Select
End Sub

Private Sub CalcRslt(ByVal Ans As Double) '重複処理をプロシージャ化
   stack(0) = Ans 'データ構造の先頭が計算結果で取り出せる
      stack(1) = 0 
         MsgBox "計算結果 : " & Ans
End Sub



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿