カルボプラチン(パラプラチン)計算機を作ってみる

抗がん剤つながりで、カルボプラチン計算機を作ってみました
カルボプラチンの投与量はAUCで計算するのが良いらしいですが、計算が面倒です
メーカーがWindows用のパラプラチン計算尺というソフトを配布しているのでこれを使っている方も多いと思います


【1】仕様を決めます
今回は電卓型ではなく、データベースソフトのように複数の入力ボックスに数値を入れていく形にします
入力の必要な項目は、身長・体重・年齢・性別・クレアチニン・クレアチニンクリアランス・AUC・体表面積当りの投与量 とします
結果出力は、Ccr実測のCalvertの式、Ccr計算にCockcroft_Gault式とJelliffe式を使ったCalvertの式、Chatelut式、体表面積当りの投与量、の5個です
データを入力して計算ボタンを押すと結果を表示するようにします

【2】フォーム上にコントロールを配置
(1)ラベルを必要数配置、今回は16個配置しました。プロパティーのCaptionにそれぞれ文字列を入力していきます

(2)データの入力と出力用にTextBoxを配置します。入力用に7個、出力用に5個です。オブジェクト名は意味が解りやすいように変えました

(3)コンボボックスを1個、性別入力用に配置します。コンボボックスとはクリックするとリストが出てその中から選択できる入力Boxです。データベースではおなじみと思います。
コンボボックスに表示するlistを設定するには、プロパティーの中の(プロパティーページ)の右をクリックします。するとプロパティーページのウィンドウが表示されます。
AddItemを押して、Index:0 ListData:男、Index:1 ListData:女 とします

(4)ボタンを1個配置します。"計算"ボタンにします

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


【3】計算ボタンを押した処理
後は計算するだけです
TextBoxの名前は次のようにつけました
Text_Weight、Text_Height、Text_Age、Text_CCr、Text_Cr、Text_AUC、Text_BSA、Text_Ans1、Text_Ans2、Text_Ans3、Text_Ans4、Text_Ans5
何のデータを入れるTextBoxかはなんとなく解ってください

(1) 体表面積の計算 藤本式 W:体重Kg H:身長cm
6歳以上 bsa = W ^ 0.444 * H ^ 0.663 * 88.83 / 10000
6歳未満 bsa = W ^ 0.423 * H ^ 0.362 * 381.84 / 10000
体表面積の計算式はメーカーのソフトに合わせてこれを使います
まず年齢で2つに分けてから計算します、前処置として身長体重が入力されていることを確認します
IsNumeric()という関数は()内の文字が数字として認識できるかを調べる関数です。数字ならTrueが帰ってきます。If IsNumeric(***)=Trueと書いたほうが解りやすいかも知れませんが、長くなるのではしょってます。
結果をbsaという変数に保存します
コーディングしてみます、'以下の文字はコメントですので無視してください
If IsNumeric(Text_Weight.Text) And IsNumeric(Text_Height.Text) And IsNumeric(Text_Age.Text) Then '身長体重年齢が入力されているか
    If Text_Age.Text >= 6 Then '6歳以上
        bsa = Text_Weight.Text ^ 0.444 * Text_Height.Text ^ 0.663 * 88.83 / 10000
    Else '6歳未満
        bsa = Text_Weight.Text ^ 0.423 * Text_Height.Text ^ 0.362 * 381.84 / 10000
    End If
Else
    bsa = 0 '計算できない時は0を入れます
End If

(2)体表面積あたり投与量の計算
体表面積が計算済みなら掛け算するだけです、結果は5番目のTextBoxに表示します
If bsa > 0 And IsNumeric(Text_BSA.Text) Then '体表面積が計算済みで対表面積当りの投与量が入力されている
    Text_ans5.Text = Text_BSA.Text * bsa
End If

(3)Calvert式(Ccr実測)の計算
式は AUC * (CCr * bsa / 1.48 + 25) です、結果は1番目のTextBoxに表示します
If bsa > 0 And IsNumeric(Text_CCr.Text) And IsNumeric(Text_AUC.Text) Then '体表面積が計算済みでCCrとAUCが入力されている
    Text_Ans1.Text = Text_AUC.Text * (Text_CCr.Text * bsa / 1.48 + 25)
End If

(4)Calvert[Cockcroft_Gault式]の計算
式は
男 AUC * ((140 - Age) * W / (72 * Cr) + 25)
女 AUC * ((140 - Age) * W / (72 * Cr) * 0.85 + 25)
です。結果は2番目のTextBoxに表示します
コンボボックスの名前はCombo_sexにしてあります
コンボボックスの現在選択されている項目を得る方法はいくつかありますが、今回はCombo_sex.ListIndexを使います。
このボックスのプロパティーページで設定したあれです、0が男1が女です
If IsNumeric(Text_Age.Text) And IsNumeric(Text_Weight.Text) And IsNumeric(Text_Cr.Text) And IsNumeric(Text_AUC.Text) Then '年齢、体重、CrとAUCが入力されている
    If Combo_sex.ListIndex = 0 Then ' 男
        Text_Ans2.Text = Text_AUC.Text * ((140 - Text_Age.Text) * Text_Weight.Text / (72 * Text_Cr.Text) + 25)
    Else ' 女
        Text_Ans2.Text = Text_AUC.Text * ((140 - Text_Age.Text) * Text_Weight.Text / (72 * Text_Cr.Text) * 0.85 + 25)
    End If
End If

(5)Calvert[Jelliffe式]の計算
計算式
男 AUC * ((98 - 0.8 * (Age - 20)) / Cr * bsa / 1.73 + 25)
女 AUC * ((98 - 0.8 * (Age - 20)) / Cr * bsa / 1.73 * 0.9 + 25)
です。結果は3番目のTextBoxに表示します
If bsa > 0 And IsNumeric(Text_Age.Text) And IsNumeric(Text_Cr.Text) And IsNumeric(Text_AUC.Text) Then '体表面積が計算済みで、年齢、CrとAUCが入力されている
    If Combo_sex.ListIndex = 0 Then ' 男
        Text_Ans3.Text = Text_AUC.Text * ((98 - 0.8 * (Text_Age.Text - 20)) / Text_Cr.Text * bsa / 1.73 + 25)
    Else ' 女
        Text_Ans3.Text = Text_AUC.Text * ((98 - 0.8 * (Text_Age.Text - 20)) / Text_Cr.Text * bsa / 1.73 * 0.9 + 25)
    End If
End If

(6)Chatelut式の計算
計算式
男 AUC * (0.134 * W + (218 * W * (1 - 0.00457 * Age)) / (Cr * 10000 / 113))
女 AUC * (0.134 * W + (218 * W * (1 - 0.00457 * Age) * 0.686) / (Cr * 10000 / 113))
です。結果は4番目のTextBoxに表示します
If IsNumeric(Text_Weight.Text) And IsNumeric(Text_Age.Text) And IsNumeric(Text_Cr.Text) And IsNumeric(Text_AUC.Text) Then '年齢、体重、CrとAUCが入力されている
    If Combo_sex.ListIndex = 0 Then ' 男
        Text_Ans4.Text = Text_AUC.Text * (0.134 * Text_Weight.Text + (218 * Text_Weight.Text * (1 - 0.00457 * Text_Age.Text)) / (Text_Cr.Text * 10000 / 113))
    Else ' 女
        Text_Ans4.Text = Text_AUC.Text * (0.134 * Text_Weight.Text + (218 * Text_Weight.Text * (1 - 0.00457 * Text_Age.Text) * 0.686) / (Text_Cr.Text * 10000 / 113))
    End If
End If

(7)サブルーチンにする
以上のコードをボタンを押した処理の部分に書けばいいです
ボタン名はCommand_Calcにしてあります
Private Sub Command_Calc_Click()
  dim bsa
  表示をクリア
  (1)〜(6)のコードを書く
End Sub

ですが次の項目の理由でサブルーチンにまとめます
Private Sub ChangeResult()
  dim bsa
  表示をクリア
  (1)〜(6)のコードを書く
End Sub

【4】データを変更したらリアルタイムで結果を変更する
Excelやデータベースソフトでは入力boxのデータを変更するとリアルタイムで結果が変更されます、これでも同じようにできればかっこよさそうです
(1)TextBoxが変更されると*****_Changeというルーチンが呼ばれます、そこから上で作ったサブルーチンを呼んでやれば良さそうです
身長のTextBoxが変更された時の処理は次のようになります
Private Sub Text_Height_Change()
  ChangeResult
End Sub
同じように
体重・年齢・性別・クレアチニン・クレアチニンクリアランス・AUC・体表面積当りの投与量 も書いていきます

(2)コンボボックスが変更された場合の処理は******_Clickのルーチンを処理します
コンボボックスの名前はCombo_sexなので次のようになります
Private Sub Combo_sex_Click()
  ChangeResult
End Sub
コンボボックスの変化をリアルタイムで反映させるには、******_Clickのルーチンを処理し、どのアイテムが選択されているかのチェックには****.ListIndexを使います。
他の方法ではうまく行きません、これに気づくのに数日かかりました。

(3)ボタンを押した処理も書いておきます、ボタン名はCommand_Calcです
Private Sub Command_Calc_Click()
  ChangeResult
End Sub

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

ソースファイル
ZIPファイルです
実行するとこんな感じです


【6】問題点など
コードをみれば解りますが難しそうなのは計算式の部分だけでこれならだれでも簡単に作れそうです、電卓タイプよりこのほうが実用的でコーディングも解りやすいです
ソフトとしてはこれくらいで十分なはずですが、使ってみるとデータ入力が面倒です
PocketPCはキーボードが無いので、SIPと呼ばれる画面に表示されるキーボードの絵をタップして入力します
数字だけあればいいのですがそのような画面はないし、SIPの画面をいちいち変更するのも面倒です
そこでプログラムで数字入力ボタンのようなものを用意して使うようにしてみました。興味のある方は公開版のソースをご覧ください



VBTOPに戻る