2021年05月26日

10万円ではじめるプログラミング講座 9

全ての国民に10万円が行きわたると言う事で、様々な事情の
方がいらっしゃるかと思いますが、それが出来る人に向けて、
Excelを活用したプログラミング講座を執筆する事にしました。
「ゲームをやった時間を記録して集計出来るプログラム」を
自分で作れるようになる事を目標にしています。

今回は、前回つくったプログラムに細かな改善を加えようと
思います。前回と同様に、誰もが知っている“あれ”を取り
出して、前回つくったプログラムと、比べてみましょう。

例えば、"1" "+" "1" "="と入力して 2 が表示された後に","
キーを押すと、どうなりますか。一方“あれ”を取り出して、
"1" "+" "1" "="と入力して 2 が表示された後に"+/-"キーを
押すと、どうなりますか。違う結果になると思います。

いつも使い慣れている“あれ”ならば"1" "+" "1" "="と入力
して 2 が表示された後に"+/-"キーを押せば、"1+1="の結果
のプラス・マイナスを入れ替えて計算を継続させる事が出来
るのに、前回つくったプログラムにはその機能がありません。

前回つくったプログラムを開きます。ファイル名は
「den-dentaku2.xlsm / den-dentaku2.xls」として
保存したと思います。

ファイルを開くと、まっさらなExcelブックに「セキュリティ
の警告 マクロが無効にされました。」と言う表示(表現は
バージョンによって違うかも知れません)が出現している事
が確認出来ると思います。忘れずマクロを有効に設定します。

プログラムの改造を始める前に、前回つくった内容を消して
しまう事のない様、ファイル名を変えておきましょう。

ツールバー等にある「名前を付けて保存」をクリックします。

ファイル名は「den-dentaku3.xlsm / den-dentaku3.xls」等
が良いでしょう。

ファイルを開いた状態で、「Alt+F11」を押します。
「Microsoft Visual Basic」の画面が出て来ると思います。
そのまま「F7」を押して、「コード」画面を開きます。

書き換えが必要なのは、ProcessKeyPress関数です。

ProcessKeyPressの Select Case KeyAscii と End Selectの
間のCase Asc(",")のコードを探します。

このCase Asc(",")から始まる部分の先頭行(Case Asc(",")
の直後)に、次のコードを挿入します。

If cmJoutai = cmKekka Then strNyuryoku = CStr(dblKekka)

Case Asc(",")から始まる部分の後方部に、以下の様なコード
があると思います。

Select Case cmJoutai
Case cmAllClear, cmKekka
cmJoutai = cmNyuryoku1
'★→cmN1: cmAC, cmKのとき、数値入力を始めるとcmN1
Case cmNyuryoku1, cmNyuryoku2
Case cmError1, cmError2, cmError3
End Select

これを次の様に書き換えます。

Select Case cmJoutai
Case cmAllClear
cmJoutai = cmNyuryoku1
'★→cmN1: cmACのとき、数値入力を始めるとcmN1
Case cmKekka
dblKekka = CDbl(strNyuryoku)
Case cmNyuryoku1, cmNyuryoku2
Case cmError1, cmError2, cmError3
End Select

cmJoutaiが、cmKekkaのとき、新たに数値入力を始める操作を
するのではなく、dblKekkaのプラス・マイナスを入れ替える
操作を行う様にしています。

「F5」キーを押して動作確認してみましょう。

どうでしょう。正しく動作しましたか。

例えば、"1" "+" "1" "="と入力して 2 が表示された後に","
キーを押すと、どうなりますか。良さそうですね。

では、その直後に"."キーを押すと、どうなりますか。続けて、
"3" "4" "5" "6"と押すと、どうなりますか。 "+" "2" "="と
押すと、どうなりますか。悪くは無いですね。

でも、ちょっとおかしくないですか。

例えば、"1" "+" "1" "="と入力して 2 が表示された後に","
キーを押し、続けて"b"キーを押すと、どうなりますか。何も
起きませんね。続けて、"3" "4" "5" "6"と押すと、どうなり
ますか。これが本来の正しい動作なのではないでしょうか。



忘れないうちに、ここまでつくって来たプログラムを保存し
ましょう。ツールバー等にある「保存」をクリックします。



前回の講座では、ある特定の条件下で数値が「中抜き」され
ていくプログラムについて、「中抜き」された数値が分かる
様な改造をしましたが、特殊な操作をすると、それ迄に「中
抜き」された合計が分かる様な改造をしようと思います。

ProcessKeyPressの Select Case KeyAscii と End Selectの
間のCase Elseの前に、以下のコードを書き込みます。

Case vbKeyUp '↑
If strNyuryoku = "93" Then
strNyuryoku = ""
dblKekka = GetChildrensWallet
cmJoutai = cmKekka
UpdateDisplay
End If

このプログラムはこのままでは動作しません。KeyPressイベ
ントプロシージャでは、上キー(vbKeyUp)に反応しない為です。

そこで、上キーに対応する様に、若干の修正を施します。

コンボボックスの左側(オブジェクト)には「UserForm」と
表示されていると思います。右側(プロシージャ)を開いて、
「KeyDown」を選びます。すると以下のプロシージャが自動
的に挿入されていると思います。

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

End Sub

KeyPressイベントプロシージャは、フォームでキーボードが
押されたときに呼び出されるイベントプロシージャです。

KeyDownイベントプロシージャには以下の様に書き込みます。

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyUp Then ProcessKeyPress (KeyCode)
End Sub

忘れないうちに、ここまでつくって来たプログラムを保存し
ましょう。ツールバー等にある「保存」をクリックします。

 

チョー・デンタク社に勤めるYさんは、地方公共団体向けに
導入実績のある「電卓アプリ」の開発を担当する技術者です。

先日、この「電卓アプリ」が、鉄道大手ジュニア社の券売機
に導入される旨の報道発表がありました。同時に、アプリを
活用した利便性向上策として「ナンバー・メモリー」と言う
仕組みが導入される事が発表されました。これは、ジュニア
社が発行するICカード「イカス!」で利用登録操作をすると、
「電卓アプリ」の計算結果を、券売機に挿入した「イカス!」
に記憶出来る様になると言うもの。計算結果の他に最大七つ
の数字を記憶するいわゆる「メモリー機能」も備えています。

報道発表に合わせて、チョー・デンタク社内では開発作業が
進んでいたのですが…Yさんは、再びノース・ビレッジ社の
担当者から「依頼事がある」との事で呼び出しを受けました。

CD: チョー・デンタク社のYさん
NV: ノース・ビレッジ社の担当者

CD: 依頼事って何ですか。

NV: ジュニア社に「電卓アプリ」を導入する話の件なんだが。

CD: ええ、あれから「ナンバー・メモリー」のプロジェクト
  が立ち上がり、ただ単に導入するだけじゃない、大幅な
  改造が必要だと言う事になり、社内は大忙しです。

NV: そうか。実は「ナンバー・メモリー」の仕組みなんだが、
  考えたのは我々だ。

CD: え、そうなんですか。聞いた話では、ジュニア社の若い
  社員が発案してその人中心で動いているとの事でしたが。

NV: そうだ。その筋書きも含めて、我々が考えた事だ。

CD: 若い社員と言うのは誰ですか。

NV: ノース・ビレッジ社幹部の息子だ。

CD: そう言う事なんですね。

NV: 「ナンバー・メモリー」の数値は、「イカス!」に記憶
  されると、表向きには説明していると思うんだが。

CD: そうですね。「数値が自分の手元にあるICカードに記憶
  されるなら安心」との評価を頂いており、おおむね好意
  的に捉えられている様です。

NV: 狙った通りだ。そこで依頼事なんだが、券売機で顧客が
  挿入したICカードのID番号を町内にあるシステムに送信
  して集約できる様にして欲しいのだ。

CD: やっぱり。そういう話になるだろうと思っていました。

NV: 「ナンバー・メモリー」のプロジェクトが立ち上がった
  事で、チョー・デンタク社には、ジュニア社に設置され
  ている券売機の内部仕様に関する膨大な資料が提供され
  ているはずだ。その中に、顧客が挿入したICカードのID
  番号等、券売機の内部メモリにアクセスする方法が含ま
  れているはずだ。

CD: その通りです。読み込むのにとても時間がかかりました。

NV: 実は、他にも送信して欲しい項目がある。それについて
  は後程、詰める事にしよう。

CD: ・・・(言葉を飲み込む)。分かりました。

 
posted by miraclestar at 04:00 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。