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



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



2023年10月18日水曜日

スマホの標準機能を使えば済むことではないかと言う御仁もおられますが、ウインドウズの中だけで、すべて処理したいもの ー 電卓機能(Windows11)

      
電卓は、ウインドウズの標準機能ですが、クリックしても現れなくなりました。
この現象は、まれではないようで、ネットで検索すると、出るわ出るわなんだ。

なので対処方法の説明もありますが、その通りにして再インストールでも駄目。
このままでは、電卓が使えなくて、少し不便な場合がないわけでもありません。

それは、”irfanView”という画像ビューワーを使って、コピペをする時のお話。
スマホなどで撮影した画像を、必要な部分でコピペするときに、縦横比が重要。

見慣れた写真フレームと同じ4対3の比率でカットしますが、問題は画素数だ。
640X480ピクセルが扱いやすいのですが、そうでないときは画素を縮小します。

逆にカットしすぎて、640以下の端数になってしまうと、電卓を呼び出します。
画素数で横の長さに0.75を乗じると縦の高さになるので、これでカットする。

ところが、標準の実装機能が死んでしまって使えないとなると、どうするのか。
まあ、クロームの検索バーに”電卓”と打って、虫眼鏡アイコンをクリックする。

検索された結果は、その上部に電卓が表示されて、そのまま使用できるのです。
マイクロソフト”B-ing”も""goo”検索バーでも、電卓がほぼ上部に登場します。

ただ、ネットの使えない環境で、PCを使用する場合もあるのかもしれません。
そんなときはウエッブ電卓が使えず、その時は代替策でエクセルの利用だろう。

ブックシート上でセルに数値を入力して、答えを求めるセルに数式を設定する。
後は自動で計算してくれて便利ですが、マクロで電卓を作ることも可能なんだ。

サンプル構文を上げておきますが、フリーで公開されたコードを短くしました。
改行も多くてエディターから読みづらいので、インデントで可読性を高めたの。

かなり見やすくなったので、お使いになりたい方はダウンロードしてください。
ところで、昔の電卓の機能は、シンプルで”calc.exe”の単独ファイルだけです。

どのウインドウズでも動くはずなので、Windows2000のファイルを複写移動。
Windows10でも確かに開きますが、1920X1080の画面ではかなり小さいなあ。

おそらく、昔のモニターの画面サイズ(1024X768)に合わせたものでしょう。
見づらくて使いにくいので、他の策として、Windows7の電卓をインストール。

というわけで、今や電卓機能はコードがオープンソース化されてしまったとさ。

マイクロソフトでは、開発者がこのアプリの各部の仕組みを知ることから、この電卓のロジックやユーザーインターフェース(UI)を自分のアプリケーションに組み込むことが可能になったと述べているのですが、VBAしか知らない自分に撮っては門外漢なのかと思うのでした。



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



2023年10月16日月曜日

モジュールにも階層構造があって、下の階層を使うためには、それを特定する宣言の”Dim”が必要だと言うこと ー Class Module(VBAマクロ)

           
以前、エクセルでデータ集計してシールを印刷するVBAのコードを書きました。
その時、値渡しをするファンクションプロシージャが膨大で管理が大変でした。

まあ、標準モジュールのメインプロシージャに混在して、記述していたのです。
このため、使いたいファンクションを探し出すのに、手間取ったりもしました。

特に、異なる標準モジュールから、このファンクションを呼出していたりした。
長いコードに目を通しながら探しまくったりと、今思えば、ずい分と非効率ね。

次第に、コード記述が整理されていないからだと悟りまして、対策の検討です。
手っ取り早いのは、ファンクションプロシージャだけの標準モジュールを作る。

そこに、バランバラに散っていたプロシージャをまとめたりもした記憶がある。
本当は、モジュールの名称を”Function”とか変更しても良かっのかもしれない。

その方が挿入モジュールの意図が分かりやすいのですが、そのままにしました。
そうやって、コードを書き散らしたと思い返したりしていますが、気が付いた。

今さらですが、クラスモジュールでファンクションを管理するのはどうだろう。
クラスと言う英単語は、”(共通の性質を有する)部類、種類”の意味があります。

その点では、同じ特性のプロシージャをまとめて管理するには向いていそうだ。
メインのコードでは、沢山のブックを開きながらシール印刷用のデータを作成。

問題は、ブックファイルのパスが複数あったので、値渡しが必要になりました。
サンプルを見ても分かりますが、使い回しになるからメインコードには不要だ。

<例:パス付きブックを値渡しするファンクションプロシ―ジャ>
Function ClassSample() As String
  Dim Str As String
    Str = ""
      Str = Str & ThisWorkbook.Path
        Str = Str & "\"
          Str = Str & "Book1.xlsx"
            Str = Str & ""
              ClassSample = Str
End Function

<例:標準モジュールでクラスモジュール利用の立ち上げ・使い方>
Option Explicit
Dim Class1 As New Class1
 Private Sub test()
    Workbook.Open Class1.ClassSample 
 End Sub

それで、クラスモジュールは、標準モジュールの階層下にあるサブセットです。
標準モジュールでは、サブセットを使うよと宣言しないと呼び出せない仕組み。

それが、”Dim Class1 As New Class1”のように呼び出し先を定義づけておく。
モジュールの先頭で宣言すると、各プロシジャには敢えて定義づけは不要です。

それから、”Class1.ClassSample”とクラスモジュール名+プロシージャで実行。
つまり、”Class1”というクラスモジュール番地にあるプロシージャを指定だな。

実際にコードを書くと、”Class1.”までタイプすると配下の内容が一覧されます。
目的のプロシージャを簡単に選択できるので、選びやすくなって便利で効率的。

というわけで、ごちゃごちゃした標準モジュールを整理するには好都合だろう。
ネットでクラスモジュールを検索すると、使い方の説明が沢山見つかりますが、手っ取り早く理解してもらうためには、メインのコードは標準モジュールに書き、値渡しのファンクションプロシージャ等はクラスモジュールに記述して、呼び出して使うと言うのが、一番適切と思うのでした。



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



2023年10月14日土曜日

一説として、酪農王国を反映してホルスタイン牛の模様から、この菓子の名称がついたらしいよ ー べこもち(そのほか)

六花亭のべこ餅
    
北海道へ帰省して、幼少期に親しんだ食品に、手を出してしまう自分がいます。
例えば、清涼飲料のガラナ、ミルクカステラ、きびだんご、などが筆頭格だな。

それで、帰るたびに食べたいと思っても、見つけられなかったお菓子があるの。
”べこ餅”と言って白黒の模様がある木の葉型の餅菓子ですが、見つけられない。

ところが、この間、母の郷里の十勝へ旅行していた際に、六花亭でついに発見。
場所は音更町のショッピングセンターにある出店で、やっとこさ見つけました。
 
値段が一個、百五十円くらいもしましたが、食べてみると、お上品な味わいだ。
子供の頃に食べた、あの癖のある黒砂糖の味が残る黒い部分など、ありません。

本当に洗練された美味しさだけで、さすがマルセイバターサンドのお店なんだ。
上さんは、名称すら知りませんでしたが、おいしいといって食べてくれました。

その後、もう一度北海道へ帰省する用事があり、小樽のドンキでこの餅を発見。
ここは、昔、長崎屋のショッピングモールだったのが、買収されて名称変更だ。

     
学生時代、買い物に出かけた記憶もありますが、地下は昔ながらの食品売り場。
色々と物色している中で、コアップガラナが五百ccボトル、68円と安いわ。

思わず二つも買ってしまった中、冒頭写真のべこ餅を発見したので即購入です。
メーカーは日糧パンでしたが、ここも記憶に残る懐かしさで、期待が膨らむな。

帰宅してから食べましたが、六花亭とは違って餅が柔らかく少しべた付きます。
それでも、子供時分に食べた餅菓子の懐かしさを、また味わうことができたな。

このべこ餅は、青森県には一部ありますが、それ以外は北海道独特の菓子です。
道南の一部では、クジラモチ、カタコモチと別名を使っている地域もあります。

お菓子の意匠も、白黒ブチが一般的ですが、他に渦巻き、花柄等も存在します。
それでも、もち米を使った甘い餅菓子の製法に変化はなく、道民の定番お菓子。

というわけで、首都圏に棲みつくと、食べることもかなわなかったお菓子です。
それで、北海道文教大学の先生が、”餅菓子文化の伝承 : 北海道における『べこもち』の歴史と地域性”という研究論文を出しているほど、ローカルなお菓子として研究対象になったのだと思いますが、そんなことよりもおいしければ関係ないとも思ったのでした。



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