TS-1計算機を作ってみよう

フォーム上に自由にコントロールを貼り付けてプログラムが作れるということになると、やはり作ってみたいのは電卓でしょう(やや強引)
普通の電卓なら元々入っているので、抗がん剤のTS-1の投与量を計算する電卓を作ってみました


【1】仕様を決めます
身長と体重を入力して、体表面積とTS-1の投与量を表示するようにします
数値の入力はボタンを押すことで行います
使い方として、身長のボタンを押してから身長を入力、体重のボタンを押してから体重を入力
その後体表面積、投与量のボタンを押すと結果を表示するようにします

【2】フォーム上にコントロールを配置
今回使うコントロール
フォーム:コントロールを配置する台紙のようなものです
ラベル:文字を書いておく四角い箱でユーザーによる書き換えはできません、変更しない文字列やユーザに変更されたくない結果の表示等に使います
TextBox:文字を書いておく四角い箱ですがユーザーによる書き換えができます、文字や数値の入力に使います
ボタン:押すとへこむ四角い箱です、ユーザーが押すことで何かを始める命令にします
全てのコントロールには名前がついていて、操作をする時はこの名前を用いて行います

(1)ラベル(Label)を1個 上部に配置します オブジェクト名はデフォルトでLabel1です プロパティーのCaptionで文字列を設定します、ここでは何も入力しません

(2)TextBoxを1個 上部に配置します オブジェクト名はデフォルトでText1です プロパティーのTextで文字列を設定します、ここでは何も入力しません
プロパティーのFontで文字サイズを16に設定し、すこし大きい文字にします(デフォルトは9)
プロパティーのLockedをTrueに設定するとユーザーによる変更ができなくなります

(3)ボタン(CommandButton)を4個1行に配置し、その下に更に12個 縦4×横3 で配置します
プロパティーのCaptionで文字列を設定します、ボタンの役割によっていろいろな文字を入力します
上の4個のボタンは左から「身長」「体重」「体表面積」「投与量」
その下の12個のボタンは0から9の数字と.(小数点)、Clearになります
オブジェクト名はWeight Height Number7 など意味の解りやすいものに変更しました

(4)フォームのタイトルはプロパティーのCaptionで変更できます、今回は"TS-1計算機"としました
こんな感じになりました


【3】数字ボタンの処理
.と0から9の数字キーは、押されたらその文字を上のTextBoxに表示すればいいだけなので、ほぼ同じコードになります
TextBoxのテキストはこのTextBoxの名前がText1だとすると、Text1.Textとなります。これは読み書きが可能なので、 文字列を設定したければ Text1.Text="Test" 他の変数などにコピーしたければ str1=Text1.Text のようになります。
そこで、7のボタンが押されたら Text1.Text="7" とすれば良いかというと、これでは以前の入力が消えてしまうので
Text1.Text=Text1.Text + "7" のようにします(またはText1.Text=Text1.Text & "7")
どこに書くかというと、該当するボタンをダブルクリックすると別ウィンドウが開いてコード入力が可能になります
Private Sub Number7_Click()
End Sub
の2行で囲まれた範囲が7ボタンを押した時の処理を書く部分なので
Private Sub Number7_Click()
  Text1.Text=Text1.Text + "7"
End Sub
となります
ほかのキーも同様に設定していきます
ここで1度実行して思いどおりの動きをするかチェックします、するとたいていの場合思ったように動きません
どこかに記載ミスがあるはずなのでコードをチェックして間違いを探しましょう。これがデバグと言われる作業です
コーディングは少しづつチェックしながら進めないと、後でどこが間違っているのが解らなくなって苦労します

【4】Clearボタンの処理
これは簡単です、Text1.Text="" とします。""はヌル文字と言われ文字が無いことをあらわします、データがないわけではありません
余談ですが文字列は""で囲むのがきまりです。a="1"と書けば変数aに1という文字を代入するという意味ですが、a=1と書けば変数aに数としての1を代入する意味になります

【5】身長、体重ボタンの処理
ここは少し面倒です
(1)まず前処置として体重と身長のデータをいれる変数を用意しておきます
コードウィンドウの一番上にOption Explicitというのがあるのでそのすぐ下に
Private iWeight, iHeight
と入力します。
iWeightとiHeightが変数名ですPrivateはその変数がこのフォームの中でのみ使われることをあらわします

(2)ラベルに文字列を設定します
最初に作ったラベルに押されたボタンと同じ文字列"身長"または"体重"と設定します
これは今何を入力しているのかユーザーに解らせるためと、TextBoxに入っている文字列が何なのかを知るために用います
ラベルの文字列はその名前がLabel1だったとすれば Label1.Caption = "身長" として設定できます
体重ボタンならLabel1.Caption = "体重"とします

(3)TextBoxに文字列が入っていたらこれをデータとして保存しておきます
もし身長ボタンが押されたとき Label1.Caption が"体重"になっていたら、TextBoxに入っている文字列は体重の数値のはずなので
iWeight=Text1.textとして保存しておきます

(4)TextBoxをクリアします
身長/体重ボタンが押されたということはこれから数字キーで身長/体重を打ち込むということなのでTextBoxは初期化し文字列の無い状態にしておかなければなりません

(5)コーディングしてみます
身長ボタンが押された処理
If Label1.Caption = "身長" Then '前に身長のデータを入力している
  iHeight = Text1.Text
ElseIf Label1.Caption = "体重" Then '前に体重のデータを入力している
  iWeight = Text1.Text
End If
Label1.Caption = "身長" 'ラベルに"身長"と設定
Text1.Text = "" 'TextBoxをクリア
体重ボタンでも6行目が"体重"になるだけです

if ******** then
else
endif
は条件分岐のための構文です

'*******
はコメントを書くためのもので ' より後の文字はプログラム上は無視されます

【6】体表面積ボタンの処理
(1)体表面積を入れる変数を準備しておきます
上でPrivate iWeight, iHeightと書いた次の行に
Private iSurface
と記入します

(2)TextBoxに文字列が入っていたらこれをデータとして保存しておきます
上で書いたことと同じで、もし体表面積ボタンが押されたとき Label1.Caption が"体重"か"身長"になっていたら、TextBoxに入っている文字列は体重か身長の数値のはずなので
iWeight=Text1.text/iHeight=Text1.textとして保存しておきます

(3)身長と体重がセットされているかチェックします
iWeight/iHeightが入力されていなければNullのはずなのでif文でチェックします

(4)計算します
計算式はuBoisの計算式を使います
iSurface = iWeight ^ 0.425 * iHeight ^ 0.725 * 0.007184

(5)計算結果を表示します
Text1.text=iSurface

(6)ラベルを体表面積に変えます
Label1.Caption = "体表面積"
こうすることでTextBoxに表示されている数字が体表面積であることがユーザーにもプログラムにも解ります

(7)コーディングします
If Label1.Caption = "身長" Then 'ここは上と同じです
  iHeight = Text1.Text
ElseIf Label1.Caption = "体重" Then
  iWeight = Text1.Text
End If
Label1.Caption = "体表面積" 'ラベルに"体表面積"と設定
If iWeight = "" Or iHeight = "" Then 'Nullでないかチェック、どちらかがNullなら計算できないのでorでつなぐ
  iSurface = 0
Else
  iSurface = iWeight ^ 0.425 * iHeight ^ 0.725 * 0.007184 'uBoisの計算式
End If
Text1.Text = iSurface

【7】TS-1ボタンの処理
(1)TS-1投与量を入れる変数を準備しておきます
上でPrivate iSurface と書いた次の行に
Private iTS1
と書きます

(2)TextBoxに文字列が入っていてラベルが"体重"か"身長"なららこれをデータとして保存しておきます

(3)身長と体重がセットされているかチェックします

(4)計算します

(5)ラベルを"TS−1 1回量"に変えます

(6)投与量を計算します
TS-1の投与量は体表面積で決まっています(1日量)
1.25m2未満 80mg/day
1.25m2以上1.5m2未満 100mg/day
1.5m2以上 120mg/day
です
体表面積を計算してからif文で場合分します

(7)コーディングします、TS-1投与量は1回量にしています
If Label1.Caption = "身長" Then
  iHeight = Text1.Text
ElseIf Label1.Caption = "体重" Then
  iWeight = Text1.Text
End If
If iWeight = "" Or iHeight = "" Then
  iSurface = 0
Else
  iSurface = iWeight ^ 0.425 * iHeight ^ 0.725 * 0.00725
End If 'ここまでは同じです
If iSurface < 1.25 Then '体表面積1.25未満
  iTS1 = 40
ElseIf iSurface < 1.5 Then '体表面積1.5未満
  iTS1 = 50
Else '残りは体表面積1.5以上
  iTS1 = 60
End If
Label1.Caption = "TS-1 1回量"
Text1.Text = iTS1

【8】プログラムを終了するコード
自動的に入っているはずですが、上のタイトルバーの右にあるOKボタンを押すとプログラムを終了するためのコードです
Private Sub Form_OKClick()
  App.End
End Sub
ここでもしApp.Endを消してしまうと終了できないプログラムができてしまいます。
プログラミングはちょっとしたことで、とんでもない事が起こるので注意が必要です。

【9】全コード
テキストファイルです

ソースファイル
ZIPファイルです
実行時の画面です

【10】問題点など
これで一応動きますが、操作してみるとおかしい点があります
.を複数回押すと解りますが.が複数個表示されます
0も同様で
1.23.456..7 とか
0000123
などという入力ができてしまいます
自分で使うだけならこれでも良いですが、一般的に使ってもらうには修正が必要です
実際のプログラムではフラグを使って処理しています、興味がある方はソースコードをご覧ください



VBTOPに戻る