まりふのひと

Excel 家庭血圧グラフのデータの手修正のマクロ(VBA)化を病院の待合室で思いついた

 今日は 骨シンチ 検査の日。4月14日の定期検査で PSA の漸増が続いているので‥‥ 転移の有無を調べるため CT検査(4月15日に済み)と骨シンチ を撮ることになったもの。
 注射から検査まで 2時間あるので、

  1. 病院の廊下の椅子でコーヒー片手に
    • 1FのJA売店も、手前にあった休憩室? も無くなっていたので...
  2. 日経パソコン 2022.4.25号(右図)を読んでいて‥‥
    • 「面倒な作業は VBA身にマクロで解決!
       セル範囲の各データを一括処理する-」 の中に、
      「For Each ~」の行で「SpecialCells」メソッドを使用し、定数(非数式)の数値のセルだけを繰り返しの対象としている。「xlCellTypeConstants」を第1引数、「xlNumbers」を第2引数に指定した。
      とあり、
    • 💡閃いたッ! 「血圧グラフ」のグラフデータの手修正がマクロ化出来そう‥‥

血圧の記録

 R2年1月下旬、血圧が高いので町内の医院を訊ねたら、20220423151539「朝晩の血圧を付けなさい」と言われ、持田製薬の血圧管理手帳をもらい、血圧計を買って付け出した。

  • 起床時と就床前に、
  • 各2回測り、
  • 平均値と ME差 を「グラフにするとわかりやすい」と...

Excel で処理

 Excel しかない‥‥ と、まずは記録表のとおりに入力出来るようにした。

入力データ

  • 体温、体重は後から追加したもの。

グラフデータ

 入力データの右側に平均値、ME差を計算するための列を作った。

  • シリアル月日:=A8
    • グラフの横軸。グラフ表の塊にするためで、今となっては、それ以外の目的はない。
  • 朝上血圧:=AVERAGE(C8:D8)
  • 朝下血圧:=AVERAGE(E8:F8)
  • 夜上血圧:=AVERAGE(M8:N8)
  • 夜下血圧:=AVERAGE(O8:P8)
  • ME差:=V8-X8

以下は、基準線を引くためのデータ

  • 上目標:=$F$2(現在は 135)
  • 下目標:=$G$2(現在は 85)
  • 縦軸値:=IF(MOD(MONTH(U8),2)=0,-70,-70)
    • 以前は「月の変わり目」が判るように凹凸の線にしていた‥‥
      が、いまはグラフの書式設定で対応した(下図)ので、-70 で事足りている。

グラフデータの問題点

 起床時と就床前の血圧を測っていれば問題ないが、片一方あるいは両方忘れることは度々ある...
Dr.は「傾向を見るので、毎日測らなくてもよい」と言うが、Excel では測らないとグラフ上は 0(ゼロ)になってしまうので、そうはいかない...

  • 12/24 は就床前(夜)を忘れた例
  • 12/25 は両方忘れた例
  • 12/26 は起床時(朝)を忘れた例

このままグラフを描くと 0(ゼロ)値となってしまうので、

  1. シートの保護を解除し、
  2. #DIV/0! のセルをクリア(Delete)
  3. シートの保護

を行っている...

完成したマクロ(VBA

 日経パソコンの記事と[マクロの記録]を参考に、試行錯誤‥‥ した...
01. Public Sub エラーのセルをクリアする()
02. Const colL As Long = 12   '夜時刻
03. Const colV As Long = 22   '朝上血圧
04. Const colZ As Long = 26   'ME差
05. Dim mbTitle As String
06. Dim rng As Range
07. Dim lastRow As Long
08.   
09.   mbTitle = "エラーのセルをクリアする/" & ThisWorkbook.Name
10.     'シート保護を無視するコマンド
11.   ThisWorkbook.Worksheets("データ").Protect UserInterfaceOnly:=True
12.     '最終の夜の測定時刻(L列)の行をセットする。
13.   lastRow = Cells(Rows.Count, colL).End(xlUp).Row
14.     '頭(6行目)から選択し、
15.   Range(Cells(6, colV), Cells(lastRow, colZ)).Select
16.     '#Errorのセルをクリアする=式を消去する。
17.   For Each rng In Selection
18.     If IsError(rng.Value) Then rng.ClearContents
19.   Next rng
20.     '選択を解除する。
21.   Cells(lastRow, colL).Select
22.   
23. End Sub

 上記で完成した‥‥ と思ったが、グラフを見ると ME差 が何かおかしい...
原因は‥‥

  • マクロの実行前
    • 朝上血圧または夜上血圧のどちらか あるいは両方が #DIV/0! であると、
    • ME差も #DIV/0! となる。
  • マクロの実行後
    • 朝上血圧または夜上血圧のどちらか あるいは両方がクリアされる(セルの値は ”” になる)ので、
    • ME差は正常に計算される。ME差は #DIV/0! でないのでクリアされない。

そこで

  1. まず、ME差が #DIV/0! のセルをクリア後、
  2. 血圧値が #DIV/0! のセルをクリアする。

ように変更したら、上手く処理されたぁ~~~

家庭血圧グラフ

 最新版のグラフ(マクロで修正後)

  • 4月10日現在
  • 4月11日以降のデータは #DIV/0! になっているので、0(ゼロ)で表示されている。