2020年08月09日

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

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

前回6月24日の更新から随分時間が経ってしまいました。当時、
東京都知事選挙が行われていて、その流れに合わせた記事の
更新をしていたので、いろいろと必要な、時間の経過の事を
考えて、更新は控えていました。そろそろ、更新しても良い
のではないか、と思えたので、更新を再開したいと思います。

今回から、新しいプログラムの作成に取り掛かります。今回、
取り組むのは、誰もが知っている“あれ”をつくってみよう、
と言う試みです。今回の記事はとても分量が多いので、一度
に最後までつくってしまおうとはせず、途中で動作確認する
場面があるので、適宜中断して次の日に回す等の工夫をして
みて下さい。

Excelを起動してください。「Alt+F11」を押します。
「Microsoft Visual Basic」の画面が出て来ると思います。
ツールバーにある「ユーザーフォームの挿入」をクリック。

今回は、この画面で操作する事は、ひとつもありません。

そのまま「F7」を押して、「コード」画面を開きます。

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

Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

End Sub

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

理由は進めていくうちに明らかになっていくので、特に触れ
ませんが、今回ここに直接プログラムを書く事はせず、別途
独立したプロシージャを作成して、そこにプログラムを書く
様にします。

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

「コード」の先頭にカーソルを持っていってEnterキーを押し
(コンボボックスから (General)(Declarations) を選ぶ操作
でも良い)、以下のコードを書き込みます。

Private Sub ProcessKeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyEscape
Unload Me

End Select
End Sub

KeyAscii変数には、呼び出されたときに押されたキーを示す
数字が入っています。vbKeyEscape 定数は、Visual Basicで
標準で定義された、特別なキーの数字を示す定数です。他に
どの様な定数があるか知りたい場合は、vbKeyEscape 上でF1
キーを押してヘルプを表示させると知る事が出来ます。

Unload Meは、フォームの動作を終了させるコードです。ESC
キーを押すとプログラムを終了させる、と言う意味です。

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

Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
ProcessKeyPress (KeyAscii)
End Sub

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

数字キーを押すと、入力した数字が表示される様にしてみま
しょう。

「コード」の先頭にカーソルを持っていってEnterキーを押し
(コンボボックスから (General)(Declarations) を選ぶ操作
でも良い)、以下のコードを書き込みます。

Private strNyuryoku As String '入力中の数値を記憶

Private Sub ProcessCmdN(number As Integer)

strNyuryoku = strNyuryoku + CStr(number)

UpdateDisplay

End Sub

Private Sub UpdateDisplay()
UserForm1.Caption = strNyuryoku
End Sub

ProcessCmdNよりも前の場所でstrNyuryokuと言う変数が定義
されています。

ここで宣言された変数は、「モジュール レベルで宣言された
変数」と呼ばれ、宣言したモジュール(同じ編集ボックスで
表示できる範囲内の事です)内のすべてのプロシージャから
参照出来る様になります。しかも、プログラムの実行中常に
内容が保持される様になります。

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

Case Asc("C"), Asc("c")
strNyuryoku = ""
UpdateDisplay
Case Else
If Asc("0") <= KeyAscii And KeyAscii <= Asc("9") Then
ProcessCmdN (KeyAscii - Asc("0"))
End If

Cキーを押すと、入力中の内容を消去します。Asc関数を使用
している理由は、コンピュータの内部処理上の都合で、"C"と
KeyAscii変数が直接比較出来ないからです。

Case Elseは、Select内のどのCaseにも当てはまらない場合に
実行されます。"0"から"9"迄の数字はKeyAscii変数のコード
番号が連番になっているので、"0"から"9"迄の数字が押され
たら、ProcessCmdN プロシージャが実行される様になります。
このとき、キーコードではなく、キーコードから"0"から"9"
迄の数字キーを表す数値を計算してプロシージャに渡す様に
しています。

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

BackSpaceキー を押すと、入力した最後の数字が消える様に
してみましょう。

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

Case Asc("B"), Asc("b"), vbKeyBack 'Back
If Len(strNyuryoku) > 0 Then
strNyuryoku = Left(strNyuryoku, Len(strNyuryoku) - 1)
End If
UpdateDisplay

Len関数で、strNyuryoku変数の文字数を調べています。文字
数が0より大きければ、Left関数で文字数を1減らした長さの
文字列を取り出す様にしています。

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

"."キー を押すと、小数点が入力出来る様にしてみましょう。

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

Case Asc(".") '.
Select Case strNyuryoku
Case ""
strNyuryoku = "0."
Case Else
If InStr(strNyuryoku, ".") = 0 Then strNyuryoku = strNyuryoku + "."
End Select
UpdateDisplay

InStr関数で、strNyuryoku変数の中に、"."が含まれているか
どうか調べて、もし含まれていなければ文字列の最後に"."を
加える様にしています。

そして、特別な場合の動作も指定しています。Cキーを押した
直後等で、strNyuryokuが空("")だった場合、"."が含まれて
いないので、何も指定しなければ"."と入力されてしまいます。
これでも分からなくもないですが、分かりにくいので、"0."
と表示される様に指定しています。

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

マイナスの数値が入力出来る様にしてみましょう。具体的に
は、","キー を押すと、プラス・マイナスが入れ替わる操作
が出来る様にします。

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

Case Asc(",") '+/-
If strNyuryoku = "" Then
strNyuryoku = "-"
Else
If Left(strNyuryoku, 1) = "-" Then
strNyuryoku = Right(strNyuryoku, Len(strNyuryoku) - 1)
Else
strNyuryoku = "-" + strNyuryoku
End If
End If
UpdateDisplay

Left関数で、strNyuryoku変数の最初の1文字が、"-"であるか
どうか調べて、もし"-"であればRight関数で最初の"-"を取り
除く様にしています。もし"-"でなければ、"-"文字列の最初
に"-"を加える様にしています。

そして、特別な場合の動作も指定しています。Cキーを押した
直後等で、strNyuryokuが空("")だった場合、コードを見ると
何も指定しなくても"-"と入力される様に見えます。特にこれ
で問題ないのですが、Left関数に空白文字列("")を入力して
しまうと間違った動作が起きる可能性があります。Left関数
は、指定した文字数を取り出す関数ですが、指定した文字数
よりも短い文字列から指定した文字数を取り出す事は不可能
だからです。具体的には、エラーが起きる可能性があります。
実際、試してみたら、エラーは起きなかったのですが、なる
べく不可能な事はさせない様に心がけた方が良いと思います。

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

ここまでのプログラムで動作確認してみると、少しおかしな
表示をさせる事が出来てしまう事に、気付くかも知れません。

例えば、Cキーを押した後に、"."キー、","キーの順に押して
みたらどうなるでしょうか。特に問題は起きないと思います。
では、逆に、","キー、"."キーの順に押してみたらどうなる
でしょうか。おかしな表示になってしまうのではないかと思
います。これに対応する為に、以下のコードを書き加えます。

Case Asc(".") '.
Select Case strNyuryoku
Case ""
strNyuryoku = "0."
Case "-"
strNyuryoku = "-0."
Case Else
If InStr(strNyuryoku, ".") = 0 Then strNyuryoku = strNyuryoku + "."
End Select
UpdateDisplay

Case Elseの前に、strNyuryokuが"-"だった場合の動作を指定
するコードが書き加えられています。

例えば、Cキーを押した後に、"."キーを押して、"0"を2回以上
押してみたらどうなるでしょうか。これはおかしくないと思い
ます。では、Cキーを押した後に、何も押さずに"0"を2回以上
押してみたらどうなるでしょうか。同様に、Cキーを押した後
に、","キーを押して、"0"を2回以上押してみたらどうなるで
しょうか。おかしな表示になってしまうのではないかと思い
ます。これに対応する為に、以下のコードを書き加えます。

Private Sub ProcessCmdN(number As Integer)

If strNyuryoku = "0" Then
strNyuryoku = number
ElseIf strNyuryoku = "-" Or strNyuryoku = "-0" Then
strNyuryoku = -number
Else
strNyuryoku = strNyuryoku + CStr(number)
End If

UpdateDisplay

End Sub

strNyuryokuが特別な値だった場合の動作を指定しています。

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

ここで一息つきましょう。ここから先は少し長くなります。

一息ついたら再開しましょう。これまで何をつくろうとして
いるのか、誰もが知っている“あれ”と言うのみで、触れて
来なかったのですけれども、もうそろそろ、“あれ”が何か、
お分かりでしょう。正負や小数点がある数値を入力する機能
をつくりました。そうなると、次は四則演算(+-*/)をする
機能をつくりたくなりませんか。

四則演算する機能は、少し複雑で規模の大きなプログラムに
なります。順を追って少しずつつくっていきましょう。

「コード」の先頭にカーソルを持っていってEnterキーを押し
(コンボボックスから (General)(Declarations) を選ぶ操作
でも良い)、以下のコードを書き込みます。

'Kekka = Nyuryoku1 (Enzanshi) Nyuryoku2

Enum CalcMode
cmAllClear = 0 '何も入力していない状態
cmNyuryoku1 = 1 '演算子の左の数字を入力
cmNyuryoku2 = 2 '演算子の右の数字を入力
cmKekka = 3 '計算結果が表示されている
cmError1 = -1 'エラーが表示されている(左入力中)
cmError2 = -2 'エラーが表示されている(右入力中)
cmError3 = -3 'エラーが表示されている(結果表示中)
End Enum

Enumを使うと、数値に名前を付けて取り扱う事が出来る様に
なります。「CalcMode」と言うデータ型を指定して宣言した
変数は、コンピュータ内部では、数値として取り扱われるの
ですが、Visual Basicのコード上では、名前を付けた状態で
取り扱う事が出来ます。プログラム内で遷移する状態を数値
で記憶する手法は良く使われる手法なのですが数値に名前を
付けて取り扱う事が出来る様になると、コードが分かり易く、
間違いも起きにくくなります。

プログラムは、cmAllClearの状態から始まって、cmNyuryoku1、
cmNyuryoku2、cmKekkaの順に遷移していきます。cmNyuryoku1、
cmNyuryoku2、cmKekkaそれぞれの場面で、エラーが起きると、
cmError1、cmError2、cmError3へと遷移します。数値の正負
を逆転させると、正常な状態とエラー状態を行き来出来る様
になっています。

先頭行はコメントで、Kekka,Nyuryoku1,Nyuryoku2の関係性を
示しています(Enzanshiは後述)。行の"'"以降はコメントと
して扱われ、プログラムとしては無視される様になります。

続いて(コンボボックスに(General)(Declarations)と表示さ
れている状態で)、以下のコードを書き込みます。

Private cmJoutai As CalcMode
Private strNyuryoku As String '入力中の数値を記憶
Private strEnzanshi As String '数値の前に押した演算子を記憶(+-*/)
Private dblNyuryoku1 As Double '演算子の左の数字を記憶
Private dblNyuryoku2 As Double '演算子の右の数字を記憶
Private dblKekka As Double '結果の数値を記憶
Private strError As String 'エラーとして表示する文字列

strNyuryoku は既に定義した変数と被るので、複数定義して
しまわない様、気を付ける様にして下さい。

続いて、UndateDisplayを以下の様に書き換えます。

Private Sub UpdateDisplay()
Select Case cmJoutai
Case cmAllClear '何も入力していない状態
UserForm1.Caption = "0"

Case cmNyuryoku1 '演算子の左の数字を入力
If strNyuryoku = "" Then
UserForm1.Caption = "0"
Else
UserForm1.Caption = strNyuryoku
End If

Case cmNyuryoku2 '演算子の右の数字を入力
If strNyuryoku = "" Then
UserForm1.Caption = CStr(dblNyuryoku1)
Else
UserForm1.Caption = "[" + strEnzanshi + "] " + strNyuryoku
End If

Case cmKekka '計算結果が表示されている
UserForm1.Caption = CStr(dblKekka)

Case cmError1, cmError2, cmError3 'エラーが表示されている
UserForm1.Caption = strError

End Select
End Sub

先程定義した「モジュール レベルで宣言された変数」がほぼ
すべて使われているので、それぞれの目的を網羅的に理解し
易くなっているのではないかと思います。

1行目、cmJoutaiの数値によって、場合分けしたコードが実行
される様にするコードです。

3行目、cmJoutaiがcmAllClearのとき、"0"が表示される様に
しています。

7行目、cmJoutaiがcmNyuryoku1のとき、strNyuryokuが空("")
なら、"0"が表示される様にしています。

9行目、cmJoutaiがcmNyuryoku1のとき、strNyuryokuが空("")
以外なら、strNyuryokuの内容が表示される様にしています。

14行目、cmJoutaiがcmNyuryoku2のとき、strNyuryokuが空("")
ならdblNyuryoku1の数値が表示される様にしています。四則
演算の演算子キー("+-*/")を押したとき、その時点の計算
結果がdblNyuryoku1に保存される様にプログラムを組みます。

16行目、cmJoutaiがcmNyuryoku2のとき、strNyuryokuが空("")
以外なら、strEnzanshiとstrNyuryokuを組み合わせた内容が
表示される様にしています。

20行目、cmJoutaiがcmKekkaのとき、dblKekkaの数値が表示さ
れる様にしています。

23行目、cmJoutaiがcmError1,2,3のとき、strErrorの内容が
表示される様にしています。

続いて、AllClearの処理を追加します。

ProcessKeyPressの Select Case KeyAscii と End Selectの
間のCase vbKeyEscapeの次に、以下のコードを書き込みます。
(Unload Meの次の行)

Case Asc("A"), Asc("a") 'AC
dblKekka = 0
strEnzanshi = ""
strNyuryoku = ""
cmJoutai = cmAllClear
'★→cmAC: "A", "a" 押したときcmAC
UpdateDisplay

続いて、C/CEの処理を追加します。

ProcessKeyPressの Select Case KeyAscii と End Selectの
間のCase Asc("C"), Asc("c")の内容を、
以下の様に書き換えます。

Case Asc("C"), Asc("c") 'C/CE
If cmJoutai < 0 Then
cmJoutai = cmJoutai * -1
'★→cmN1, cmN2, cmK: エラー状態解除
ElseIf cmJoutai = cmKekka Then
ProcessKeyPress (Asc("A"))
Exit Sub
End If
strNyuryoku = ""
UpdateDisplay

1-7行目が新たに書き加えられた内容です。

1行目、cmJoutaiが0未満のとき(エラー状態のとき)、
2行目、数値の正負を逆転させてエラー状態を解除しています。
4行目、cmJoutaiがcmKekkaのとき、
5行目、AllClear処理を実行する様、改めてProcessKeyPress
を呼び出しています。

続いて、cmNyuryoku1 に遷移する処理を追加します。全部で
3カ所あります。cmJoutai が cmAllClear, cmKekkaのときに、
数値入力を始めるとcmNyuryoku1に遷移します。

ProcessCmdNを以下の様に書き換えます。

Private Sub ProcessCmdN(number As Integer)
Select Case cmJoutai
Case cmAllClear, cmKekka
strNyuryoku = CStr(number)
cmJoutai = cmNyuryoku1
'★→cmN1: cmAC, cmKのとき、数値入力を始めるとcmN1
Case cmNyuryoku1, cmNyuryoku2
If strNyuryoku = "0" Then
strNyuryoku = number
ElseIf strNyuryoku = "-" Or strNyuryoku = "-0" Then
strNyuryoku = -number
Else
strNyuryoku = strNyuryoku + CStr(number)
End If
Case cmError1, cmError2, cmError3

End Select

UpdateDisplay
End Sub

1-6,14-16行目が新たに書き加えられた内容です。

2行目、cmJoutai が cmAllClear, cmKekkaのときに、
3行目、数値入力を始めると、
4行目、cmNyuryoku1に遷移します。

次の呼び出しからは5行目に処理が移ります。
14行目、エラー状態の時は何もしません。

ProcessKeyPressの Select Case KeyAscii と End Selectの
間の Case Asc(".") と Case Asc(",") の内容を以下の様に
書き換えます。
UpdateDisplayの直前に以下の内容を書き加えます。(2カ所)

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

続いて、四則演算と結果表示の処理を追加します。

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

Case Asc("+"), Asc("-"), Asc("*"), Asc("/") '+-*/
If ExecuteCalc(KeyAscii) Then
strNyuryoku = ""
cmJoutai = cmNyuryoku2
'★→cmN2: "+-*/"押したとき、正常であればcmN2
ElseIf strError <> "" Then
cmJoutai = cmJoutai * -1
'★→cmE: エラーが発生したときcmE
End If
UpdateDisplay
Case Asc("="), vbKeyReturn '=
If ExecuteCalc(Asc("=")) Then
strNyuryoku = ""
cmJoutai = cmKekka
'★→cmK: "="押したとき、正常であればcmK
ElseIf strError <> "" Then
cmJoutai = cmJoutai * -1
'★→cmE: エラーが発生したときcmE
End If
UpdateDisplay

ExecuteCalc関数は、四則演算を実行する関数です。

処理が成功し続行可能な場合は、Trueを返します。
処理を中断した場合は、Falseを返します。
エラーが発生した場合は、strErrorにエラーとして表示する
文字列が代入されています。エラーではない場合はstrError
は空文字列("")が代入されています。

ProcessKeyPressプロシージャの書き換えは以上です。
ここで一息つきましょう。ここから先も長いです。

一息ついたら再開しましょう。ExecuteCalc関数の作成です。

「コード」の先頭にカーソルを持っていき(コンボボックス
から (General)(Declarations) を選ぶ操作でも良い)、以下
のコードを書き込みます。

Enum enmEnzanHo
enzNoTouch = 0 'NoTouch 何もしない
enzN1eqN1opN2 = 1 'Nyuryoku1 = Nyuryoku1 (+-*/) Nyuryoku2
enzKeqN1opN2 = 2 'Kekka = Nyuryoku1 (+-*/) Nyuryoku2
End Enum

Private Function ConvertNyuryoku() As Double
Select Case strNyuryoku
Case "", "-"
ConvertNyuryoku = 0
Case Else
If Right(strNyuryoku, 1) = "." Then
ConvertNyuryoku = CDbl(Left(strNyuryoku, Len(strNyuryoku) - 1))
Else
ConvertNyuryoku = CDbl(strNyuryoku)
End If
End Select
End Function

Private Function ExecuteCalc(intEnzanshi As Integer) As Boolean

Dim EnzanHo As enmEnzanHo

If cmJoutai <= cmAllClear Then '☆1
ExecuteCalc = False
Exit Function
End If

If strNyuryoku = "" Then
ExecuteCalc = False
Exit Function
End If

'strEnzanshi 数値の前に押した演算子を記憶(+-*/)
'intEnzanshi 今回の呼出で押した演算子キー(+-*/=)

'Joutai strEnz intEnz EnzHo
'cmN1 "" "=" Exit 1◆ △ ×無効操作
'cmN1 "" "+-*/" NoTouch  1◆ ▽ ○通常操作
'cmN1 "+-*/" "=" Exit 1◇ △ △=の後AC押さずに数値入力、続いて=
'cmN1 "+-*/" "+-*/" NoTouch 1◇ ▽ △=の後AC押さずに数値入力、続いて+-*/
'cmN2 "" 2◆   ―有り得ない
'cmN2 "+-*/" "=" K =N1opN2 2◇ △ ○通常操作
'cmN2 "+-*/" "+-*/" N1=N1opN2 2◇ ▽ ○通常操作
'cmK "" 3◆   ―有り得ない
'cmK "+-*/" "=" Exit 3◇ △ △=の後すぐに=
'cmK "+-*/" "+-*/" Exit 3◇ ▽ △=の後すぐに+-*/

ExecuteCalc = True '☆2
strError = ""
EnzanHo = enzNoTouch

Select Case cmJoutai
Case cmNyuryoku1 '演算子の左の数字を入力
'☆3
Case cmNyuryoku2 '演算子の右の数字を入力
'☆4
Case cmKekka '計算結果が表示されている
'☆5
End Select

Select Case EnzanHo
Case enzNoTouch 'NoTouch 何もしない

Case enzN1eqN1opN2, enzKeqN1opN2
'☆6

End Select

If ExecuteCalc Then '☆7
Select Case intEnzanshi
Case Asc("+"), Asc("-"), Asc("*"), Asc("/") '+-*/
strEnzanshi = Chr(intEnzanshi) '数値の前に押した演算子を記憶(+-*/)
Case Asc("="), vbKeyReturn '=

End Select
End If
End Function

ConvertNyuryoku 関数は、strNyuryoku 変数を一発で数値に
変換する関数です。複数個所で呼び出される為、別途関数に
しました。

ExecuteCalc 関数内、☆について説明します。

☆1からの4行では、cmJoutaiがcmAllClear又はcmErrorのとき、
処理を中断します。

☆1からの4行に続く4行では、strNyuryokuが空("")のとき、
処理を中断します。

☆2からの3行はプログラム中で使用する変数の初期値を設定
しています。

☆3、☆4、☆5、☆6にはプログラムを追加します。(後述)

☆7、処理が成功し続行可能な場合は、strEnzanshi変数に演
算子を記憶します。今回の呼出のあと、数値を入力し、再び
演算子キーが押され、次回の呼出があった際には、記憶した
演算子を使って演算を行います。

☆3には、以下のコードを書き加えます。

If intEnzanshi = Asc("=") Then
'1◆ △ ×無効操作
ExecuteCalc = False
Exit Function
End If
dblNyuryoku1 = ConvertNyuryoku()

4つの可能性があります。
cmAllClearからcmNyuryoku1に遷移した場合、strEnzanshiは
空("")です。cmKekkaから遷移した場合は、strEnzanshiには
演算子("+-*/")が代入されています。cmNyuryoku1では演算子
の左の数字を入力するので、演算子の右の数字は、まだ入力
されていない状態です。この状態で"="を押しても、まだ結果
は計算出来ません。従って"="を押す操作があった場合は無効
操作として処理を中断します。一方、演算子キー("+-*/")を
押す操作があった場合はdblNyuryoku1に入力した数値を記憶
して処理を続行可能にします。

☆4には、以下のコードを書き加えます。

dblNyuryoku2 = ConvertNyuryoku()
If intEnzanshi = Asc("=") Then
'2◇ △ ○通常操作
EnzanHo = enzKeqN1opN2
Else
'2◇ ▽ ○通常操作
EnzanHo = enzN1eqN1opN2
End If

2つの可能性があります。
演算子キー("+-*/")を押す操作があった場合と"="を押す操作
があった場合です。前回の呼出があった時点までの計算結果
がdblNyuryoku1に記憶されています。演算子キー("+-*/")を
押す操作があった場合は、dblNyuryoku1に今回の呼出で入力
された数値を使って演算した結果を代入して記憶します。"="
を押す操作があった場合は、dblKekkaに今回の呼出で入力さ
れた数値を使って演算した結果を代入します。

☆5には、以下のコードを書き加えます。

ExecuteCalc = False
Exit Function

いまの時点ではこの操作に対応しないので処理を中断します。

☆6には、以下のコードを書き加えます。

If strEnzanshi = "/" Then
If dblNyuryoku2 = 0 Then
ExecuteCalc = False
strError = "0で除算できません"
Exit Function
End If
End If

Select Case strEnzanshi
Case "" '◆
'EnzanHo = enzNoTouch となり、ここのコードは実行されない

Case "+" '◇+ △▽
Select Case EnzanHo
Case enzN1eqN1opN2 'Nyuryoku1 = Nyuryoku1 (+-*/) Nyuryoku2
dblNyuryoku1 = dblNyuryoku1 + dblNyuryoku2
Case enzKeqN1opN2 'Kekka = Nyuryoku1 (+-*/) Nyuryoku2
dblKekka = dblNyuryoku1 + dblNyuryoku2
End Select

Case "-" '◇- △▽
Select Case EnzanHo
Case enzN1eqN1opN2 'Nyuryoku1 = Nyuryoku1 (+-*/) Nyuryoku2
dblNyuryoku1 = dblNyuryoku1 - dblNyuryoku2
Case enzKeqN1opN2 'Kekka = Nyuryoku1 (+-*/) Nyuryoku2
dblKekka = dblNyuryoku1 - dblNyuryoku2
End Select

Case "*" '◇* △▽
Select Case EnzanHo
Case enzN1eqN1opN2 'Nyuryoku1 = Nyuryoku1 (+-*/) Nyuryoku2
dblNyuryoku1 = dblNyuryoku1 * dblNyuryoku2
Case enzKeqN1opN2 'Kekka = Nyuryoku1 (+-*/) Nyuryoku2
dblKekka = dblNyuryoku1 * dblNyuryoku2
End Select

Case "/" '◇/ △▽
Select Case EnzanHo
Case enzN1eqN1opN2 'Nyuryoku1 = Nyuryoku1 (+-*/) Nyuryoku2
dblNyuryoku1 = dblNyuryoku1 / dblNyuryoku2
Case enzKeqN1opN2 'Kekka = Nyuryoku1 (+-*/) Nyuryoku2
dblKekka = dblNyuryoku1 / dblNyuryoku2
End Select

End Select

strEnzanshi が"/"で dblNyuryoku2 が0の場合、0で除算する
事になってしまい、Visual Basicのエラーとなってしまう為、
そうならない様に、プログラム内でエラーとして処理される
様にしています。

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

――◇◆◇――

6月頃から、「IT化」をただ別の言葉で言い換えただけの単語
「DX(デジタル・トランスフォーメーション)」が新聞上に
良く登場する様になりました。誰が最初に言い始めたのかは
分かりませんが、突然登場し様々なプロパガンダで使用され
はじめ政府が打ち出す方針にも書き込まれる様になりました。

6月に投稿した記事の中で「危険な革新思想の持ち主が、勢力
を拡大する上で国民を騙す方便として好んで使う嘘のひとつ
が、『IT化』なのです」と書いた為、これ迄通り「IT化」と
表現していたら簡単に嘘だとばれてしまうと思って、慌てて
別の表現に変更したのかも知れません。

その「DX」を掲げて新しい方向性を打ち建てよう、と目論み、
国民民主党が模索を始めている様です。

――◇◆◇――

思うに、この国の政治が停滞に直面している要因のひとつは
保守派の人間が受け入れる事が出来、かつ自民党が真似する
事が出来ない方向性(保守非自民)を打ち建てる事に失敗し
続けている事だと思います。

保守を標榜する人間は数多くいます。ただ保守と言うだけで
無く、改革保守だったり中道保守だったり穏健保守だったり
色々な言葉をくっつけて独自性を打ち出す事に挑戦している
様ですが、日本人の中に保守の人間が何種類もいるわけでは
無く、同じ人間を食い合っているのです。

保守派の人間を取り込もうと思ったときに出来る事の種類は
あまり多くありません。誰もが同じ様な一つの考え方、行動、
見た目の、いわゆる“王道”に収斂していくからです。

保守派の人間が受け入れる事が出来る方向性を打ち出そうと
したとき、もし自民党よりも優れた方向性が見出す事が出来、
打ち出したとしても、自民党は、すぐに真似する事が出来て
しまうでしょう。そうなると政治家が違いを生む要因として
考えられるのは政局くらいでしょう。つまり、政権を握る者
が抱える不備を指摘する人間が相対的に優れて見えると言う
現象です。それさえも突き詰めていくと、最後にはルールを
無視した行動をする人間が一歩先んじる様になるのでしょう。

自民党が現実化不可能な方向性を、自民党には出来ると嘘を
ついて打ち出す事はいとも簡単な事です。嘘に騙される国民
がいるからです。そうなったらもう、考えられる限りの嘘を
つくでしょう。どんな嘘をついても騙されてくれるからです。

保守を標榜しながらも、新しい方向性を打ち出す事を試みた
人間はこれまで数多くいました。しかしその多くが自民党に
取り込まれて終わりました。自民党に入党した者、自民党の
補完勢力に成り下がった者、自民党には取り込まれなかった
けれども、自民党の補完勢力に取り込まれた者もいました。

――◆◇◆――

国民民主党の模索は、どの様な結末を、迎えるのでしょうか。

(前略)国民民主党は(6月)24日、新型コロナウイルスの感染拡大を踏まえた新たな社会像を検討する「コロナ後の(中略)社会構想本部」(本部長・玉木雄一郎代表)の初会合を開いた。(中略)玉木氏は会合の冒頭「来るべき衆院選で、私たちの考えとして世の中に問うものになる。与党に負けない立派なものを示したい」と述べ(中略)た。(後略)

〈産経新聞 6月25日 朝刊 4面〉

こういう事を言うと言葉のあげ足とりに聞こえてしまうかも
知れませんが「与党に負けない」何かを考えようとしている
時点で、与党に良い様に利用されて、与党に取り込まれてし
まう運命が決まってしまう様に思います。

コロナ後の社会構想本部は(7月)10日、党本部で4回目の会議を開催した。冒頭、玉木雄一郎本部長は、「政府が骨太方針を出すので、それに負けないような、政府の骨太方針よりもっと骨太なものをしっかり出していきたい」とあいさつした。会議終了後、泉健太同本部事務局長は記者団の取材に応じ、「政府の骨太の方針原案に、玉木代表がアフターコロナの国家戦略で挙げたキーワードを使われている。『効率性を重視したジャスト・イン・タイムのみでなく、リスクが顕在化した際にジャスト・イン・ケースの対応も可能になるよう』とかデジタルトランスフォーメーションが入っていて驚いた。6月10日の予算委員会を経て、よく言えば政府が採用したということだ。(中略)」(後略)

〈国民民主党(公式サイト) 7月10日 ニュース
 「政府の骨太方針よりもっと骨太な政策を」 コロナ後の社会構想本部で玉木代表〉

政府・与党と比較可能な内容で、もし政府・与党より優れた
方向性が見出す事が出来、打ち出したとしても、政府・与党
は、すぐに真似する事が出来てしまうのではないでしょうか。

(前略)「コロナ後の(中略)社会構想本部」(中略)では、(1)グローバリズム(2)東京一極集中(3)富の偏在―の3点の見直しが検討の柱となる。

〈産経新聞 6月25日 朝刊 4面〉

国民民主党は(7月)17日午後、国会近くで両院議員懇談会/全国幹事会・自治体議員団等役員合同会議を開催し、新型コロナウイルス感染症対策とコロナ後の社会構想(中略)について党所属国会議員、地方議員が意見交換を行った。(中略)最初の議題「新型コロナウイルス感染症及びコロナ後の社会構想」について、泉健太政務調査会長が党としての取り組み、「コロナ後の社会構想本部」での議論の経過を報告した。続いて同本部長をつとめる玉木代表から、これまで議論をまとめた「コロナ後の社会像〜日本列島回復論〜」と題する基調報告を受け、意見交換を行った。(後略)

〈掲載された写真から読み取れるスライドの内容〉

コロナ後の国家戦略
【効率重視(ジャスト・イン・タイム)】から
【備え重視(ジャスト・イン・ケース)】の国家へ
(1)グローバリズムの見直し(中略)
(2)東京一極集中の見直し(中略)
(3)富の偏在の見直し(中略)
【(中略)DXを推進】


〈国民民主党(公式サイト) 7月17日 ニュース
 コロナ後の社会構想、政党間協議について意見交換 両院議員懇談会/全国幹事会・自治体議員団等役員合同会議〉

切り口に対する施策の組み合わせが、「デジタル・トランス
フォーメーション」を意味する「DX」であるならば、それは
「適切ではない組み合わせ」と言わざるを得ません。

「IT化」は、情報網によって意思決定を助ける材料を提供し、
迅速化、利便性向上等の、生活やサービスを変革する結果を
もたらしますが、「IT化」の概念そのものの中には「どの様
な情報を、誰に届けるか」と言う、結果そのものの方向性を
決定付ける考え方は、一切含まれていないからです。

「IT化」は、かつて、旧民主党政権の時代に、多くの提案が
なされました。IT産業が盛り上がっていた時代背景もあった
と思います。しかし、権力を伴う分野へのITの導入はあまり
進んでいません。

例えば、私たちは税金を支払うと、なぜ損した気分になるの
でしょうか。税金は社会に必要な分野に使われるお金になる、
と(うまい嘘で)納得して(させられて)いますね。だった
ら、なぜ慈善事業に寄付したときの様なすがすがしい気分に
ならないのでしょうか。

かつて、旧民主党政権の時代に政策立案に関わっていた人間
が、いま「今度こそは」とばかりに同じ様な提案をしようと
している様ですが、うまい嘘で納得させられている仕組みの
本当の姿を暴き、害悪の実態を、国民ひとりひとりがつかみ
とれるようにしなければなりません。

「IT化」は、様々な社会変革をもたらす可能性はありますが、
社会変革を成し遂げる手段のひとつに過ぎない事を忘れては
ならないでしょう。社会変革の方向性を決定付ける考え方は
巧妙な嘘に塗り固められ、隠されているからです。

権力に巣食い、うまい嘘で国民を騙して富を掠め取り、その
富を、自分を中心とする親しい仲間に分配する活動を通して
利権共同体をつくり、その利権共同体を中心とする独裁体制
を維持する為に、自分以外の他人が、その仕組みに気付いて
盾つく事の無い様に、その様な行動につながる考えを持つ者
を発見し、監視し、脅迫する装置として、果てしなく高度化
した「IT機器」を、街中に張り巡らせる事だって「IT化」な
のです。

「どの様な情報を、誰に届けるか」と言う、結果そのものの
方向性を決定付ける考え方が含まれていない「DX」はむしろ
害悪そのものである
と言えるのではないでしょうか。

――◆◇◆――

ここで、より現実に近付ける為に、ある特定の条件下で数値
が「中抜き」されていくプログラムを導入しようと思います。

次のファイルをダウンロードします。

modFlatElephant.bas
(厚みが無い様に見えて実は大ごと)

Visual Basicの画面でメニューから「ファイルのインポート」
を選ぶか、「Ctrl+M」キーを押します。

ProcessKeyPressの Select Case KeyAscii と End Selectの
間のCase Asc("="), vbKeyReturnの内容を、以下の様に書き
換えます。

Case Asc("="), vbKeyReturn '=
If ExecuteCalc(Asc("=")) Then
strNyuryoku = ""
cmJoutai = cmKekka
'★→cmK: "="押したとき、正常であればcmK

Call Senmonkakaigi(dblKekka, True) '☆

ElseIf strError <> "" Then
cmJoutai = cmJoutai * -1
'★→cmE: エラーが発生したときcmE
End If
UpdateDisplay

☆が新たに書き加えられた内容です。

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

ファイル名は、内容を表す相応しい名前をつけます。

「den-dentaku.xlsm / den-dentaku.xls」
(den x2 1x taku)

等が相応しいのではないでしょうか。

 
posted by miraclestar at 19:00 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする