ページが見つかりませんでした – どこよりもやさしい!初心者のためのExcelVBAの教科書 https://vba-beginner.com 本やセミナーで挫折した人!最後だと思って挑戦してみてください! Fri, 15 Dec 2023 11:10:35 +0000 ja hourly 1 https://wordpress.org/?v=6.4.3 VBA講座5-16 持参薬鑑別システムの最終処理を行う https://vba-beginner.com/vba5-16-5279/ https://vba-beginner.com/vba5-16-5279/#respond Thu, 12 Feb 2015 08:30:58 +0000 http://for-guests.com/?p=5279 長かったExcelVBA講座も今回で最後となります。

 

持参薬鑑別システムの最終処理を行います。それではいきましょう。

スポンサーリンク

This Workbookとは?

具体的には市販されているシステムのように以下について行います。

  1. ワークシートを隠してユーザーフォームだけ表示させる
  2. エクセルファイル(持参薬鑑別システム)を開いたら自動的にfrmMenuが開くようにする
  3. frmMenuの閉じるを押すと、登録、変更した医薬品データを自動的に保存しExcelを終了させる

こんな感じですね。1と2は同時にいきましょう。

 

vba5-16-1VBAProjectにThisWorkbookという部分がありますね。これを右クリックしてコードを表示を選択。ダブルクリックでもOKです。

 

vba5-16-2今は何も書かれていませんね。

 

vba5-16-3そこで上のコンボボックスからWorkbookを選択します。

 

vba5-16-4上の画像のようなコードが出てきました。意味は簡単です。

 

「ワークブック(持参薬鑑別システム)を開いた時に○を実行する」となります。

 

さて、ここには何を書けばいいでしょうか?

 

vba5-16-5

Application.Visible = False
frmMenu.Show

上のように入力して下さい。1行ずつ解説していきましょう。

 

Application.Visible = False

これは「アプリケーション(ワークブック持参薬鑑別システム)を表示(Visible)しない(False)。」となります。

 

これでユーザーフォームだけが表示されるように設定できます。

 

市販のシステムは基本的にユーザーフォームしか表示されていませんよね?

 

ちなみにワークシートは見えていませんが、削除されたわけではないのでご安心下さい。

 

Falseは一般的に「正しくない」や「偽」等と訳されますが、VBAでは「~でない、~しない」と訳した方がしっくりきます。

 

ただ一つコードを追加する必要があります。

 

このままですとfrmInputで印刷ダイアログを表示して鑑別報告書を印刷する時に、ワークシートが表示されてそのままになってしまいます。

 

印刷する時はワークシートが強制的に表示されるのです。そのため印刷した後に再びワークシートを非表示にするコードを書きましょう。

 

vba5-16-9
frmInputの印刷ボタン(btnPrint)のコードに赤枠の部分を追加してください。

Application.Visible = False

これでOKです。

 

あと印刷プレビューをすると全画面表示されて、印刷プレビューを閉じるボタンが表示されません。
vba5-14-7元に戻りたい時は「タスクバーを右クリック→ウインドウを閉じる」でOKです。

 

ちなみにブックを非表示にしなければこういった問題は出ません。面倒臭いのが嫌いな方はこのコードは書かなくてもいいでしょう。

 

続いて

frmMenu.Show

これは何回もやっています。「frmMenuを表示する。」

 

これによりワークブックを開いた時に自動的にfrmMenuが表示されるため、毎回F5キーを押さなくてもよくなります。

 

ただ他にまだ作業する必要がある場合はこの動作が起こらない方が都合がいいですね。

スポンサーリンク

システム完成まで実行されないようにする「コメントアウト」

システムがまだ完成していないのに、いちいち起動してしまっては面倒。

 

そのような場合にはコードの前に「’」を付けて下さい。コメント扱いとなり、実行されなくなります。

 

vba5-16-6こんな感じですね。これでコードは実行されなくなります。システムが完成したら「’」を外せばOKです。

 

それでは最後のコードを書いていきましょう。

 

frmMenuの閉じるボタンのコードを見て下さい。

 

vba5-16-7このままですと普通にfrmMenuを閉じるだけで、新規登録した薬や修正をかけた薬の情報が保存されません。

 

vba5-16-8

ThisWorkbook.Save
Application.Quit

Unload Meの下にコードを追加します。順に解説していきましょう。

 

ThisWorkbook.Save

「このワークブック(持参薬鑑別システム)をSave(保存)する」です。そのまんまですね。

 

ちなみに保存方法ですが、上書き保存となります。

 

Application.Quit

これもそのまんまですね。「Application(ここではExcel)をQuit(終了)する」となります。

 

この2行を追加することで、「上書き保存してからExcelを終了する」という動作になります。

おわりに

いや~お疲れ様でした!

 

持参薬鑑別システムについてはとりあえずこれで完成です。

 

もし手書きで鑑別報告書を作成されている薬剤師の方がいらっしゃましたらぜひ現場で使ってみてください。自分で言うのも何ですが、十分実用レベルだと思います。

 

さて本システムを作成するにあたり、色々なステートメントやコントロールを使用しましたが、これはほんの一部です。

 

今回は「必要最低限の知識で作成する」というのがコンセプトでしたので、本当に厳選したものだけを使用しました。

 

とはいえ、この講座を通して皆さんはそれなりのシステムを1から作りました。講座開始前と比較して、相当レベルアップしていることを実感されているかと思います。

 

今なら過去に読んでもわからなかった書籍も理解できるようになっているでしょう。

 

最後に、ここまで読んで頂きまして本当にありがとうございました。

 

駄文にもかかわらず、最後までお付き合い頂いた皆様に本当に感謝致します。

]]>
https://vba-beginner.com/vba5-16-5279/feed/ 0
VBA講座5-15 医薬品新規登録画面の引用ボタンの設定 https://vba-beginner.com/vba5-15-5260/ https://vba-beginner.com/vba5-15-5260/#respond Thu, 12 Feb 2015 04:05:56 +0000 http://for-guests.com/?p=5260 今回はExcelVBA講座2章で作成した医薬品新規登録画面の医薬品引用ボタンの設定をしていきます。

 

医薬品引用ボタンを押すと医薬品検索画面が開き、そこで引用したい医薬品を検索し選択すると、新規登録画面のテキストボックス、コンボボックスにその情報が入力される、という処理を行います。

 

これにより規格違いの場合などは一から入力しなくてもよくなります。システム利用者が気持よく作業できますよね。

 

それではいきましょう。

スポンサーリンク

Visible プロパティ

vba5-15-1ではfrmDRegisterを開いて下さい。

 

vba5-15-2続いて医薬品引用ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba5-15-3上の画像のようになりましたね。

 

vba5-15-4今回は医薬品検索画面を利用しますので、

frmDSearch.show

と入力して下さい。医薬品引用ボタンのコードはこれで終わりです。

 

続いて医薬品検索画面を開きます。

 

vba5-15-5frmDSearchを開いて下さい。そして決定ボタン(btnDecide)を押した時のコードを見て下さい。

 

vba5-15-6今は上のコードが書かれていますね。このままですとfrmInputのテキストボックス、コンボボックスに値が転記されてしまいますのでダメですね。

 

今回はfrmDRegisterに転記されなければなりません。そこで以下のように書き直します。

 

vba5-15-7赤く囲った部分が変更した部分です。

If frmInput.Visible Then

With frmInput
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.txtKubun = cboKubun.Value
.txtTani = cboTani.Value
End With

End If

If frmDRegister.Visible Then

With frmDRegister
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.cboKubun = cboKubun.Value
.cboTani = cboTani.Value
End With

End If

それでは1行ずつみていきましょう。

 

If frmInput.Visible Then

「Visible」初めて見るコードですね。Visibleとは日本語で「目に見える」という意味です。ここでは「表示されている」という意味になります。

 

つまり「もしfrmInputが表示されているならば」という意味になります。

 

どのユーザーフォームが開かれているかで場合分けをするわけです。

 

その下は最初に書いてあった部分をそのままコピペしましょう。最後にEnd Ifも忘れずに。

 

frmDRegisterが開いている時も同じように書く事ができます。

If frmDRegister.Visible Then

「もしfrmDRegisterが表示されているならば」となります。

 

その下は転記先のfrmDRegisterのコントロールに合わせるために修正します。具体的には…

frmInput → frmDRegister
txtKubun → cboKubun
txtTani  → cboTani

ですね。

 

これで完了といきたいところですが、ダメなんです。

 

どこがダメなのかわかりますか?

 

例えばfrmInputを開いている時に採用薬新規登録ボタンを押してfrmDRegisterを開き、更に医薬品引用ボタンを押してfrmDSearchを開いて決定ボタンを押した場合、どちらの条件も満たすことになります。

 

つまりfrmDseachの決定ボタンを押すと、frmInputにもfrmDRegisterにもどちらにも転記されてしまいます。これではマズイです。

 

frmDRegisterを開いている時はfrmDSearchにだけに転記したいのです。そこで以下のように修正します。

 

If frmDRegister.Visible Then

With frmDRegister
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.cboKubun = cboKubun.Value
.cboTani = cboTani.Value
End With

Else

With frmInput
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.txtKubun = cboKubun.Value
.txtTani = cboTani.Value
End With

End If

frmDSearchはfrmDRegisterとfrmInputからしか開くことができません。という事は…

 

frmDRegisterが開いている時はfrmDRegisterにデータが転記される。それ以外の場合はfrmInputにデータが転記される。

 

このように設定してあげればいい事がわかります。そこで使用するのがIf~Then…Else ステートメントです。

スポンサーリンク

If~Then…Else ステートメント

以前お話ししたのはIf~Then…ElseIf ステートメント

If 条件1 then
処理1
ElseIf 条件2 then
処理2
End If

というものでした。

 

今回はIf~Then…Else ステートメント。最後がElseIfではなくElseになったタイプ。

If 条件1 then
処理1
Else
処理2
End If

「もし条件1ならば処理1を実行。条件1以外の場合は処理2を実行。」となります。

 

今回はこれを使ってあげればうまくいきますよ。

 

ちなみにこれら2つを組み合わせて使用する事もできます。

If 条件1 then
処理1
ElseIf 条件2 then
処理2
Else
処理3
End If

「もし条件1ならば処理1を実行、条件2なら処理2を実行、条件1、条件2以外ならば処理3を実行」となります。

 

結構使えますので合わせて覚えておいてくださいね。

 

それでは今回は以上で終了とさせて頂きます。お疲れ様でした。長かったVBA講座も次回で最後です。最終処理についてお話します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-15-5260/feed/ 0
VBA講座5-14 鑑別報告書を印刷するコードを書く https://vba-beginner.com/vba5-14-5237/ https://vba-beginner.com/vba5-14-5237/#respond Wed, 11 Feb 2015 13:42:15 +0000 http://for-guests.com/?p=5237 今回は鑑別報告書を印刷するコードを書いていきましょう。

 

予め印刷する枚数等も決めておいて、印刷ボタンを押すとプリントアウトされるというコードも書くことができます。

 

しかし普段使用するプリンタはモノクロで、鑑別報告書はカラープリンタで印刷したい場合もあると思いますし、印刷前にプレビュー画面を見たいという方もいるかもしれません。

 

そのため今回は印刷ダイアログ画面を表示するように設定したいと思います。ではいきます。

スポンサーリンク

Application.Dialogs(xlDialogPrint).Show

vba5-14-1印刷ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba5-14-2こうなりましたね。

 

シートの保存の前も印刷の前も基本的に同じ処理が必要です。つまりVBA講座5-13で書いたコードを使い回す事ができます。

 

全部コピーします。

 

Private Sub btnPrint_Click()の下に貼り付けます。ただそのままは使えませんので一部修正します。

 

まず印刷シートをアクティブにしておく必要がありますので、

.Acivate

を加えています。赤枠の部分です。そして赤で×を付けた部分は削除して下さい。ファイルの保存に関するコードは今回は使用しません。

 

印刷ダイアログを表示する方法ですが、

Application.Dialogs(xlDialogPrint).Show

これでOKです。これはこれで定型文のようなものなので、まず覚えて下さい。

 

しかし今回はこれだけだとちょっと問題があるんですね。

 

先ほど修正したコードの下に

Application.Dialogs(xlDialogPrint).Show

を書いてF5で実行してみてください。

 

印刷ダイアログが表示されましたね。続いて左下の印刷プレビューを押してみて下さい。

 

印刷プレビュー画面が出ましたが、frmInputがその上に表示されてフリーズしたようになっていませんか?

 

frmInputを閉じる事もできないし、印刷プレビューを閉じる事もできません。

 

そうなんです。

 

ユーザーフォームが開いている状態で印刷プレビューを表示すると、ユーザーフォームが動作を受け付けなくなってしまいます。

 

そのため印刷プレビューを行う時は、一時的にユーザーフォームを隠すという作業が必要になります。

 

パソコンの故障ではありませんのでご安心を(笑)。

 

vba5-14-7それではExcelのタスクバー(パソコン画面下のExcelのタブ)を右クリックしてウインドウを閉じるを選択すると、印刷プレビューが閉じられます。

 

vba5-14-8その後右上の×をクリックしてユーザーフォームを閉じて下さい。

Hideメソッド

先ほどユーザーフォームを一時的に隠すというお話をしました。それを行うのがHideメソッドです。

Me.Hide
frmMenu.Hide

今回は上記のように使用します。

 

これを印刷ダイアログボックスを表示する前、つまり

Application.Dialogs(xlDialogPrint).Show

の上に追加して下さい。

 

Meは今現在開いているfrmInputを意味します。

 

そしてfrmMenu(システムで起動時に表示されるユーザーフォーム)も実はその裏で開かれています

 

それを文字通りHideする(隠す)のがHideメソッドです。

 

ここでこう思う方もいるかもしれませんね。

 

「ユーザーフォームを閉じるならUnload Me」でも良いんじゃないの?」

 

ですが、今回は「Unload Me」よりも「Hide」を使用する方が都合がいいのです。その理由を解説しますね。

 

「Unload Me」はユーザーフォームを完全に閉じることになりますので、テキストボックスやコンボボックスに入力されたデータは残りません。

 

しかし「Hide」はあくまで隠すだけ(システム利用者に見えないようにするだけ)なので、印刷プレビューから戻ってもテキストボックスやコンボボックスに入力されたデータがそのまま残っているからです。

 

それではコードを追加した状態で、もう一度印刷プレビューを表示させて問題ない事を確認して下さい。大丈夫でしょうか?

 

さてプレビューを確認したり、実際に印刷した後は、またユーザーフォームを表示する必要がありますよね。それが

frmMenu.Show
Me.Show

になります。

 

「frmMenuを表示する。」「frmInputを表示する。」そのまんまですね。

 

ではこのコードを追加して、F5を押して実行します。

 

印刷プレビューを表示させ、印刷プレビューを閉じるを押して戻ると、frmMenuは表示されますが、なぜかfrmInputが表示されませんね。

 

見た目上コードは間違っていません。なぜでしょうか?

スポンサーリンク

vbModalとvbModelessとは?

ここでvbModalとvbModelessについてお話します。

 

これまでユーザーフォームを表示する時は

ユーザーフォーム.Show

と書いてきましたね。

 

ですがShowの後に実は省略されている部分があるのです。それがvbModalとvbModelessになります。

ユーザーフォーム.Show vbModal

vbModalはどういう意味を持つかというと、例えばユーザーフォームを表示している時に「そのユーザーフォーム以外の動作を行う事ができない」という事です。

 

ユーザーフォーム.Show vbModeless

vbModeless。lessは否定を意味しますので上記の逆、つまり「そのユーザーフォーム以外の動作を行う事ができる」となります。

 

ちなみにShowの後に何も書かなければvbModalとなります。つまり先ほどのコードを省略せずに書くと

frmMenu.Show vbModal
Me.Show vbModal

となっているのです。

 

ではなぜfrmInputが表示されなかったのか?

 

それはfrmMenuがvbModalで表示されたからです。「frmMenu以外の動作は受け付けないよ!」という状態になっているのです。

 

そのためMe.Showは単純に実行されていない、という事になります。

 

ではどうすればいいのか。答えは出ましたね。

frmMenu.Show vbModeless
Me.Show

これでOKです。Me、つまりfrmInputを表示した後は、frmInput以外の動作はしませんのでこちらはvbModelessは不要です。

 

上記を追加したあと、実際にF5を押して実行してみて下さい。問題なく動作しましたね。

 

ちなみにもう1つ別の方法もあります。

vba5-14-9frmMenuのプロパティウインドウを見て下さい。下の方にあるShowModalに注目。

 

TrueだとvbModal、FalseだとvbModelessで表示します。

 

今回はこれをTrueにしてあげればOKです。ですが、個人的には最初の方法をオススメします。

 

後者だとfrmMenuが表示されている時にワークシートに数値を入力したりする事が可能となってしまいます。

 

システム利用者が下手にワークシートをいじってしまうことでエラーが発生する可能性もあることは覚えておきましょう。

 

それでは今回は以上とさせて頂きます。お疲れ様でした。

 

次回は医薬品新規登録画面の医薬品引用ボタンの処理について解説します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-14-5237/feed/ 0
VBA講座5-13 鑑別報告書をエクセルファイルで保存する https://vba-beginner.com/vba5-13-5187/ https://vba-beginner.com/vba5-13-5187/#respond Tue, 10 Feb 2015 08:48:00 +0000 http://for-guests.com/?p=5187 今回は鑑別報告書をエクセルファイルで保存するコードを書いていきましょう。

 

それでは早速いきます。

スポンサーリンク

ダイアログボックスの表示

vba5-13-1シート保存ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba5-13-2こうなりましたね。ここに以下のように書いていきます。

 

vba5-13-3ユーザーフォーム上段の患者IDや患者氏名、主治医等のテキストボックス、コンボボックスと下段のコメント欄を印刷シートに転記するコードになります。

 

問題はここからです。今回はシート保存ボタンを押すと「患者名+ページ数.xlsx」で保存するようにしたいと考えています。

 

例えば

・患者名:薬剤 太郎
・ページ数:1

の場合、

 

シート保存ボタンを押すと上の画像が表示され、保存ボタンを押すとExcelブックとして保存。更にそのブックが自動的に閉じられるコードを書きます。

 

ちなみに上のような画面をダイアログボックスといいます。覚えておいてくださいね。

 

例えば印刷する時なども小窓で上のような画面がでますよね。これもダイアログボックスといいます。

 

それでは早速コードを書いていきましょう。

 

これも書き方は色々ありますが、今回もわかりやすさを重視して以下のように書いてみました。下の画像を見て下さい。

 

vba5-13-6

With Worksheets(“印刷シート”)

.Range(“D3”) = txPtID
.Range(“D4”) = txPtKana
.Range(“D5”) = txPtName
.Range(“J3”) = cboKa
.Range(“J4”) = cboPlace
.Range(“J5”) = cboDoctor
.Range(“Q3”) = txJissibi
.Range(“Q4”) = cboInput
.Range(“T1”) = txPage1
.Range(“V1”) = txPage2
.Range(“A68”) = txComment
.Range(“Q5″) = cboDocument

Dim i As String, j As Integer, FName As Variant

i = txPtName
j = txPage1

FName = Application.GetSaveAsFilename(InitialFileName:=i & j, _
FileFilter:=”Excelファイル,*.xlsx”)

If FName <> False Then

.Copy

ActiveWorkbook.SaveAs Filename:=FName
ActiveWorkbook.Close

End If

End With

動作の流れを今一度確認しておきます。

  1. 「シート保存」ボタンを押す
  2. 「名前を付けて保存」のダイアログボックスが表示される
  3. ファイル名が自動的に「患者名+ページNo」、ファイルの種類が「.xlsx」になる
  4. 保存場所を選び、保存ボタンを押す
  5. 新規のブックとして持参薬のデータが保存される。
  6. そのブックが自動的に閉じる

こんな感じです。それでは1つずつ見て行きましょう。

 

Dim i As String, j As Integer, FName As Variant

「変数iを文字列、変数jを整数、変数FNameをVariantと宣言する。」

 

「Variant」これ初めて見るデータ型ですね。

 

Variantはなんでも入れることができるオールマイティーな箱です。

 

VBA講座2-5で変数についてお話しましたが、変数を使う場合はデータ型を宣言して、宣言した以外のデータ型を入れることはできないということでしたね。

 

vba5-13-7通常はIntegerなら整数、Stringなら文字列と一つの箱(変数)につき1種類の型しか入れる事ができません。

 

vba5-13-8Variantは全ての型を入れる事ができる箱の集合体であるとイメージ頂ければと思います。

 

そうなると…「データ型はVariant型以外いらないのでは?」という意見も聞こえてきそうですね。

 

ですが、可能な限りVariant型は使わないようにして下さい。初心者の方も楽をせず、きちんと宣言するようにしましょう。

 

理由として、

  • どのデータ型を入れたいのかわかりにくい
  • メモリを食うので実行速度が遅くなる
  • 予期せぬエラーが出ることがある

などが挙げられます。

 

今回の講座では、「名前を付けて保存ダイアログボックスを表示する時はVariant型を使う」と覚えて頂ければ結構です。

 

これ以上のことは別の機会に勉強することにしましょう。

 

続いて

i = txPtName
j = txPage1

「変数iにtxPtNameの値を入れる。」「変数jにtxPage1の値を入れる。」これは問題ないでしょう。

スポンサーリンク

GetSaveAsFilenameメソッド

こちらも初めて見る感じですね。

FName = Application.GetSaveAsFilename(InitialFileName:=i & j, _
FileFilter:=”Excelファイル,*.xlsx”)

「変数FNameに=の右側を入れる。」=の右側ですが、これはまとめて覚えてしまった方が早いですね。

 

Variant型変数 = Application.GetSaveAsFilename(InitialFileName:=ファイル名, FileFilter:=”保存形式”)

実はこのコード、ファイル名や保存形式以外にも、保存形式の何番目を初期値にするか等色々設定できるのですが、今回は使用しませんのでここまでにしておきます。

 

FName = Application.GetSaveAsFilename(InitialFileName:=i & j, _
FileFilter:=”Excelファイル,*.xlsx”)

では=の右側を翻訳すると…「名前をつけて保存ダイアログを表示し、保存するファイル名を変数i&j(患者名+ページ数)、保存形式をxlsxとする。」となります。

 

この時に覚えておいて頂きたいのが、「名前を付けて保存ダイアログボックス」が表示されている時にキャンセルボタンを押すと、FalseをVariant型変数FNameに入れるというものです。

 

If FName <> False Then

「もし変数FNameがFalseでないならば」つまり…=キャンセルボタンを押さない時=保存ボタンが押された時になりますね。

 

.Copy

「ワークシート印刷シートをコピーする。」.Copyだけだとコピーするだけと思うかもしれませんが、実は自動的に新しいブックが作成されています。

 

ただこの時点ではブックに名前は付いておらず、保存もされていない状態です。

 

ActiveWorkbook.SaveAs FileName:=FName

新しく作成されたブックはアクティブな状態、つまり今現在選択されている状態です。後はそのまんまですね。

 

「ファイルネーム(新しいブックの名前)は変数FNameとして保存する。」つまり(患者名+ページ数).xlsxとして保存する、となります。

 

ActiveWorkbook.Close

そして新規ブックの名前もファイル形式も決まり、保存されましたのでブックを閉じる、となります。

 

今回FName=False(キャンセルボタンを押した)時の処理は書いていません。その場合は前の画面に戻る(ダイアログを閉じる)だけなので書く必要がないのです。

 

End If

最後にEnd If。エラーが発生するので必ず書くように。

 

さてこれで完成と行きたい所ですが、大事な事を忘れていました。

 

例えば鑑別報告書のページ数が1ページだけならばいいのですが、2ページになる場合は左側のNoを11~20、3ページになる場合は21~30にしてあげる必要がありますよね。

 

vba5-13-9上の画像を見て下さい。これで1ページ目なら1~10が、2ページ目なら11~20が、3ページ目なら21~30がNoのセルに入ります。

Dim k As Integer

If txPage1 = 1 Then
k = 1
End If

If txPage1 = 2 Then
k = 11
End If

If txPage1 = 3 Then
k = 21
End If

For j = 8 To 62 Step 6

.Range(“A” & j).Value = k

k = k + 1

Next

それでは1つずつ解説していきましょう。大事なコードも出てきますよ。

Dim k As Integer

「変数kを整数と宣言する。」これはいいですね。

 

If txPage1 = 1 Then

「もしtxPage1が1ならば(鑑別報告書1ページ目なら)」

 

k = 1

「変数kに1を入れる。」

 

変数kに鑑別報告書のNoに入れる数字の最初の番号を入れることにしました。その後は繰り返し処理を使います。

 

ElseIf txPage1 = 2 Then

「もしtxPage1が2ならば(鑑別報告書2ページ目なら)」Elselfについてはこの前やりましたね。

 

k = 11

「変数kに11を入れる。」

 

ElseIf txPage1 = 3 Then

「もしtxPage1が3ならば(鑑別報告書3ページ目なら)」

 

k = 21

「変数kに21を入れる。」

 

End If

最後にEnd Ifを忘れずに。

 

Noもセルの行が6個飛びになっている事を確認して下さい。

 

更に最初の番号に1ずつ足していけば、鑑別報告書が1ページ目の時No1~10、2ページ目の時No11~20、3ページ目の時はNo21~30が自動的に入ることになりますね。

 

つまり、ここでも繰り返し処理が使えるのです。

 

For j = 8 To 62 Step 6

「変数jに8~62までの数字を6個飛びで入れる。」

 

8、14、20…62ですね。

 

.Range(“A” & j).Value = k

「A列変数j行に変数kの値を入れる。」

 

先ほど何ページ目なのかで場合分けしましたね。1ページ目なら変数kは1、2ページ目なら11、3ページ目なら21が入ります。

 

さて、鑑別報告書それぞれのページでNo2~10、12~20、22~30をセルに入れるにはどうすればいいでしょうか?

 

ここで使うのが

k = k + 1

これです。変数kに変数kに1を足した数を入れる。ちょっとわかりづらいですかね。

 

鑑別報告書1ページ目の場合として解説していきますね。

 

まず変数kには1が入ります。そして印刷シートのA8セルに1が入ります。

 

次に変数k(1)に1を足した数(2)が変数kに入ります。ここまではいいですね。

 

繰り返し2回目に突入。この時点で変数kには2が入っていますね。そして印刷シートのA14セルに2が入ります。次に変数k(2)に1を足した数(3)が変数kに入ります。

 

上記を変数jが62になるまで繰り返す、となります。これで1ページ目なら1~10がNoセルに入るわけです。

 

変数i = 変数i+1

これはかなり使えるコードなのでぜひ覚えて下さいね。色んな場面で活用できますから。

 

vba5-13-10最後に今解説したコードを移動します。ブックが保存された後に処理しても意味がないので上に移動しましょう。

 

vba5-13-11これでOKです。ついでに変数kの宣言も他の変数とまとめました。

 

いや~今回は内容盛り沢山でしたね。本当にお疲れ様でした。

 

次回は鑑別報告書を印刷するコードについて解説します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-13-5187/feed/ 0
VBA講座5-12 タブの切替え時に入力した医薬品情報を表示 https://vba-beginner.com/vba5-12-5170/ https://vba-beginner.com/vba5-12-5170/#respond Mon, 09 Feb 2015 14:32:29 +0000 http://for-guests.com/?p=5170 VBA講座もいよいよ終わりに近づいてきました。よくここまで頑張りましたね。あと少しでシステムが完成しますよ。

 

今回はタブを切り替えた時に印刷シートに入力(転記)された医薬品情報をテキストボックス、コンボボックスに表示するコードを書いていきます。

 

それではいきましょう。

スポンサーリンク

TabStrip_Change()

実は今回はすごく簡単なんです(笑)。要は医薬品情報を登録する処理の逆をするだけなんですね。

 

vba5-12-1タブストリップの適当な場所でダブルクリックして下さい。又は右クリックからコードの表示。

 

vba5-12-2上の画像のようになりましたね。

 

「タブストリップがChangeした(変わった)ら以下の動作を行う」となります。

スポンサーリンク

登録ボタンのコードを使い回せば簡単

vba5-12-3登録ボタンのコードをそのまんま使うことができます。全てコピーして…

 

vba5-12-4先ほどのPrivate Sub TabStrip_Change()の下に貼り付けてください。

 

後はちょっと手直しすればOKです。

 

上の画像の波線の下のコードを見て下さい。

With Worksheets(“印刷シート”)
.Range(“B” & k) = txtKubun.Text

ここに注目。

 

このままですと、「印刷シートのB列変数k行にtxtKubunの値を入れる」となりますね。

 

これ、逆にしたらどうですか?

txtKubun.Text = .Range(“B” & k)

「txtKubunに印刷シートのB列変数k行の値を入れる」となりますね。

 

こうすると、タブを切り替える度に印刷シートの該当する医薬品情報が読み込まれるようになります。

 

では続く行も全て=の左右を逆にして下さい。

 

こうですね。ちょっと面倒臭いですが、頑張ってくださいね。

 

ショートカットキー「ctrl + C」、「ctrl + V」を使えば少し楽になるかと思います。

 

それでは今回は以上で終了となります。お疲れ様でした。

 

次回は鑑別報告書をExcelファイルで保存するコードについて解説します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-12-5170/feed/ 0
VBA講座5-11 印刷シートの医薬品情報を全て削除する https://vba-beginner.com/vba5-11-5143/ https://vba-beginner.com/vba5-11-5143/#respond Mon, 09 Feb 2015 02:09:18 +0000 http://for-guests.com/?p=5143 今回は印刷シートに転記された医薬品情報を全て削除するコードを書いていきます

 

持参薬の数が10を超えると、鑑別報告書は2枚目に突入するわけですが、その際患者情報や病棟、主治医等は2枚目でもそのまま使用します。

 

つまり、2枚目に突入する際は医薬品情報だけ削除すればよいという事になります。それでは早速進めていきましょう。

スポンサーリンク

印刷シートに転機された医薬品情報の全削除

vba5-11-1まずはシート薬品全削除ボタンをダブルクリック。または右クリックからコードの表示。

 

このように表示されましたね。早速コードを書いていくわけですが、ちょっと待ってください。

 

vba5-11-2削除ボタンを押した時のコードが使えますので、コピーしてそのまんま貼り付けてしまいましょう。

 

vba5-11-3こんな感じですね。これを加工すれば大した手間はかかりません。

スポンサーリンク

削除ボタンを押した時のコードを使えば楽チン

まず

i = TabStrip.Value + 1

を削除。

 

Msg = “No” & i & “に入力されたデータを削除します。よろしいですか?”

これを

Msg = “シートに入力された医薬品データを全て削除します。よろしいですか?”

とします。

 

vba5-11-4今回は印刷シートの全ての医薬品情報を削除しますので、上の画像の部分を削除して下さい。

 

vba5-11-5上が完成形です。

これでシートの医薬品情報を全て削除できます。

For j = 7 To 61 Step 6
Next

繰り返し処理を使います。削除ボタンを押した時の処理は、どのタブを選択しているかで場合分けしましたよね。

 

例えばNo1タブを選択している時は変数jに7を入れて、シートのNo1の医薬品情報も削除しました。

 

No2タブを選択している時は変数jに13を入れて、シートのNo2の医薬品情報を削除しました。

 

今回は全部削除するので場合分けの必要がないんです。

 

つまり…7、13、19…61を順番に入れていってそれぞれで削除処理を行えばいいですよね。しかもその数字は6個飛びなわけです。

 

だから繰り返しのFor~Next構文を使うことで、対応できるというわけです。

 

ご理解いただけましたでしょうか?

 

それでは今回は以上で終了とさせて頂きます。お疲れ様でした。

 

次回はNoタブをクリックした時に、印刷シートに入力されている医薬品情報を表示させるコードについて解説します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-11-5143/feed/ 0
VBA講座5-10 ワークシートに転記した医薬品情報の削除 https://vba-beginner.com/vba5-10-5096/ https://vba-beginner.com/vba5-10-5096/#respond Fri, 06 Feb 2015 15:35:05 +0000 http://for-guests.com/?p=5096 今回はワークシートに転記された医薬品情報を削除するコードを書いていきましょう。

 

間違って登録した場合は当然削除が必要になります。

 

具体的にはfrmInputの削除ボタンを押すと、印刷シートの該当する医薬品情報のセルを空欄にするというものです。

 

それではいきましょう。

スポンサーリンク

ワークシートの医薬品情報の削除

vba5-10-1まずは削除ボタンをダブルクリック。又は右クリックからコードの表示。

 

登録の場合は特別必要ありませんが、削除の場合は「本当に削除していいの?」の確認メッセージを表示させます。

 

医薬品の修正・削除画面でやりましたね。今回はそれをちょっとだけ応用します。

 

vba5-10-2

Dim Msg As String, title As String, i As Integer
i = TabStrip.Value + 1Msg = “No” & i & “に入力されたデータを削除します。よろしいですか?”
title = “医薬品データ削除の確認”Dim res As Integer
res = MsgBox(Msg, vbYesNo + vbExclamation + vbDefaultButton2, title)
If res <> vbYes Then Exit Sub

こんな感じで書いてみました。解説していきます。

 

Dim Msg As String, title As String, i As Integer

「変数Msgと変数titleを文字列と、変数iは整数と宣言する。」

 

i = TabStrip.Value + 1

「変数iにはタブストリップの値+1の値を入れる。」この理由は下を見ればわかります。

 

Msg = “No” & i & “に入力されたデータを削除します。よろしいですか?”

「変数Msgには=の右側の文字列を入れる。その文字列とは”No+変数iに入力されたデータを削除します。よろしいですか?”とする。」

 

今までは文章を入れるだけだったので=の右側は””で囲んでその中に文章を書けばよかったのですが、今回は変数iが入っています。

 

その場合は“文字列”& 変数i &”文字列”のように書きます。

 

変数には””を付けないことを知っておいてください。Noはタブの番号。例えばタブ1を開いている場合、タブストリップの値は0ですね。

 

つまりタブストップの値に1を足せば、タブの表示(No1)と整合性がとれるというわけです。

 

もし

i = TabStrip.Value + 1

の右側の+1がなければ、タブNo1が選択されている時に削除ボタンを押すと…「No0(ゼロ)に入力されたデータを削除します。よろしいですか?」と表示されてしまいます。

 

その後のメッセージの表示や、初期選択ボタンについては何回もやっているので解説は省略させて頂きます。

 

さて次に何をすればいいでしょうか?

 

  1. 医薬品情報のテキストボックスの削除
  2. コンボボックスの削除
  3. 印刷シートの医薬品情報を削除

という流れでいきたいと思います。

スポンサーリンク

医薬品情報の一括削除方法

vba5-10-3ユーザーフォーム上の医薬品情報を削除するのは上の画像のように書けばできます。これでも全然いいんですが、この前使った方法を思い出してみましょう。

 

今回ユーザーフォームには医薬品情報以外にもテキストボックスがたくさん配置されています。

 

つまりテキストボックスを一括指定して削除すると、患者情報や診療科、病棟なども削除されてしまいます。

 

そのためオブジェクト名で削除する(空欄にする)コントロールを指定するのがいいでしょう。

 

前にtxtのtを削除したのを覚えていますか?今回も同じように行います。一部のテキストボックスのtxtの2個目のtを削除しましょう。

 

上の画像の赤枠で囲った部分を参考にしてください。

 

テキストボックスを一括して空欄にするコードは以前書きました。覚えていますか?

 

vba5-10-5frmDCorrectのコードを表示。

 

vba5-10-6frmDCorrectの検索ボタンを押した時のコードをコピーしてしまいましょう。

 

vba5-10-7戻って貼り付ければOK。残っている処理は「印刷シートの医薬品情報を削除する」ですよね。

 

これめちゃくちゃ簡単です。前の講座でやったコードがそのまま使えます。では登録ボタンのコードを見て下さい。

 

vba5-10-8frmInputのコードを表示。

 

vba5-10-9そのまま全部コピーします。最初のPrivate Sub btnRegist_Click()と最後のEnd Subは不要です。

 

これをそのまま先ほどのコードの下に貼り付けて下さい。ちょうどその前に医薬品情報のテキストボックスを空欄にしているので、このコードを使い回せるんですよね。

 

これで完成といきたいところですが、一部コードを修正する必要があります。

 

スピンボタンの増減を表示するテキストボックス、txPage1とtxPage2、実施日を表示するtxJissibiですね。

 

vba5-10-10txtから2個目のtを取ります。

 

vba5-10-11同じくtxtから2個目のtを取ります。これで完成ですね。

 

それでは今回は以上で終了とします。お疲れ様でした。

 

次回は印刷シートに転記した医薬品情報を全て削除するコードを書いていきます。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-10-5096/feed/ 0
VBA講座5-9 検索した医薬品情報をワークシートに転記する https://vba-beginner.com/vba5-9-5075/ https://vba-beginner.com/vba5-9-5075/#respond Fri, 06 Feb 2015 05:41:30 +0000 http://for-guests.com/?p=5075 今回は鑑別報告書作成画面の登録ボタンを押すと、frmDSearchで選択した医薬品情報をワークシートに転記する、というコードを書いていきます。

 

それではいきましょう。

スポンサーリンク

ユーザーフォーム上のテキストボックスの値をワークシートに転記

vba5-9-1上の画像を見て下さい。この状態で登録ボタンを押すと、印刷シートの医薬品No1の部分に入力した情報が転記されるというコードを書きましょう。

 

まず重要なのは、どのタブが選択されているか、ということです。

 

Tab1(No1)なら印刷シートのNo1の場所に転記され、Tab2(No2)ならNo2の場所に転記されなければなりません。

 

ちなみにどのタブストリップを選択しているかについては、タブストリップ自身が情報を持っています。

 

タブの1個目は0、2個目は1…10個目は9となります。

 

コンボボックスでもお話しましたが、VBAでは先頭を0とするのでしたね。タブストリップも同様です。

 

vba5-9-2それでは登録ボタンをダブルクリック。または右クリックからコードの表示。

 

vba5-9-3タブNo1が選択されている時のコードを書いてみました。

 

テキストボックスに入っている値を該当するセルに転記するというものです。

 

ただですね…これをTabStrip.Value = 1の場合、2の場合なんてやってられませんよね。ものすごいことになりますよ。

 

ここも楽な方法を考えましょう。

 

書き方は色々ありますが、わかりやすさとある程度コードを短くする事を考慮します。

 

vba5-9-3もう一度この画像を見て下さい。セルの行番号に注目です。

 

まず7、8、9、10、11と5つの数字がある事、そしてそれらの差は1である事に注目します。

 

更に、この画像は医薬品No1の情報が転記される場所であり、No2ならば6個下の行、No3ならば12個下の行になります。これはVBA講座5-7でもやりましたね。

 

そしてなるべく同じようなコードは書きたくない。

スポンサーリンク

どのタブストップの場合でも対応可能なコードを書く

変数を使ってこのようにまとめてみました。みなさん理解できますでしょうか?

Dim i As Integer, j As Integer, k As Integer, _
l As Integer, m As Integer, n As Integeri = TabStrip.ValueIf i = 0 Then
j = 7
End Ifk = j + 1
l = k + 1
m = l + 1
n = m + 1With Worksheets(“印刷シート”).Range(“B” & k) = txtKubun.Text
.Range(“C” & k) = txtKigou.Text
.Range(“E” & j) = txtDname.Text
.Range(“E” & k) = txtGname.Text
.Range(“E” & m) = txtEffect.Text
.Range(“F” & k) = cboYouhou.Value
.Range(“G” & k) = txtKishou.Text
.Range(“H” & k) = txtAsa.Text
.Range(“I” & k) = txtHiru.Text
.Range(“J” & k) = txtYuu.Text
.Range(“k” & k) = txtVds.Text
.Range(“L” & k) = txtTani.Text
.Range(“M” & k) = txtNokori.Text
.Range(“G” & m) = txtBikou.Text
.Range(“N” & k) = txtSei1.Text
.Range(“N” & l) = txtSei2.Text
.Range(“N” & m) = txtSei3.Text
.Range(“N” & n) = txtSei4.Text
.Range(“R” & k) = txtKou1.Text
.Range(“R” & l) = txtKou2.Text
.Range(“R” & m) = txtKou3.Text
.Range(“R” & n) = txtKou4.Text

End With

1つずつ解説していきましょう。

 

Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer

「変数i、j、k、l、m、nを数字と宣言する」

 

i = TabStrip.Value

「変数iにタブストリップの値を入れる。」タブ1が選択されていれば変数iは0、タブ2なら1となります。

 

If i = 0 Then
j = 7
End If

「もし変数iが0ならば(No1のタブが選択されていれば)変数jに7を入れる。」

 

なぜ7を入れるかは下を見て下さい。

 

k = j + 1
l = k + 1
m = l + 1
n = m + 1

項目毎に列は決まっています。違うのは行番号だけですね。先ほど7~11の数字に注目と言いました。

 

だから7が決まれば後は1を足していくだけですよね。つまりjが7ならkは8、kが8ならlは9、lが9ならmは10、mが10ならnは11と自動的に決まります。

 

j=7、k=8、l=9、m=10、n=11を入れると…最初に書いたコードと同じになっているのを確認して下さい。

 

行を変数にすることで、コードを使いまわす事ができます。あとはちょっと工夫してあげればOKです。

If~Then…ElseIf ステートメント

医薬品No1を選択している時は下記のように書きましたね。

If i = 0 Then
j = 7
End If

医薬品No2の転記する場所はその6個下にある。つまり…

If i = 1 Then
j = 13
End If

と書くことができます。

 

ですがこれを「i=2の場合~i=9の場合」まで書くのはちょっと長くなりますよね。

 

そこで以下のように書いたらどうでしょうか。

 

vba5-9-6If~thenステートメントについては何回も使用していますが、今回は複数の条件と処理を一つにまとめて書いています。

 

If 条件1 then
処理1
End If
If 条件2 then
処理2
End If

これをまとめると…

 

If 条件1 then
処理1
ElseIf 条件2 then
処理2
End If

こうなります。

 

これで選択されたタブの該当するセルに医薬品情報が転記されるようになります。

 

実際に起動し各タブに医薬品を検索して登録した後、一度システムを終了して印刷シートを見て下さい。きちんと医薬品が登録されましたね。

 

それでは今回は以上で終了となります。お疲れ様でした。

 

次回はシートに転記した医薬品情報を削除するコードについてお話します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-9-5075/feed/ 0
VBA講座5-8 Showメソッド|ユーザーフォームの表示 https://vba-beginner.com/vba5-8-5034/ https://vba-beginner.com/vba5-8-5034/#respond Thu, 05 Feb 2015 09:57:35 +0000 http://for-guests.com/?p=5034 今回は鑑別報告書作成画面を他のユーザーフォームとリンクさせるコードを書いていきます。

 

とっても簡単です。それではいきましょう。

スポンサーリンク

Showメソッドについて

vba5-8-1ユーザーフォームfrmInputの検索ボタンをダブルクリック。または右クリックからコードの表示。

 

vba5-8-2

frmDSearch.Show

と入力します。Showはユーザーフォームを表示するメソッドになります。

 

vba5-8-3採用薬新規登録ボタンをダブルクリック。

 

vba5-8-4

frmDRegister.Show

と入力します。

 

vba5-8-5続いて採用薬修正・削除ボタンをダブルクリック。

 

vba5-8-6

frmDCorrect.Show

と入力します。

 

vba5-8-7続いて閉じるボタンをダブルクリックして…

 

vba5-8-8

Unload Me

と入力します。

スポンサーリンク

他のユーザーフォームの値を転記する

上の画像のようにfrmInputの検索ボタンを押すとfrmDSearchを表示されます。

 

さてここで、決定ボタンを押した時どのような処理が行われるとよいでしょうか?

 

frmInputのテキストボックスに医薬品情報が入ればOKですね。

 

vba5-8-10では上の画像のように、「frmDSearch→オブジェクトの表示」を選択して下さい。

 

vba5-8-11決定ボタンをダブルクリックします。

 

vba5-8-12そして上の画像のようにコードを書いていきます。

 

Private Sub btnDecide_Click()

If txtDname = “” Then
MsgBox “薬剤を選択して下さい。”, vbExclamation, “確認”
Exit Sub
End If

With frmInput
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.txtKubun = cboKubun.Value
.txtTani = cboTani.Value
End With

Unload Me

End Sub

それでは順番に解説していきます。

If txtDname = “” Then
MsgBox “薬剤を選択して下さい。”, vbExclamation, “確認”
Exit Sub
End If

「もしtxtDnameが空欄の時、薬剤を選択して下さいと表示する」

 

これはつまり、リストボックス内の医薬品を選択していない状態の時の注意喚起ですね。

 

With frmInput
.txtDname.Text = txtDname.Text

「frmInputのtxtDnameにfrmDSearchのtxtDnameの値を入れる。」

 

これでfrmDSearchで選択した医薬品情報がfrmInputに転記されます。

 

その後はfrmInputに戻る必要がありますね。なので…

 

Unload Me

検索画面が閉じて、鑑別報告書作成画面に戻ります。

 

最後にメニュー画面を開きましょう。

 

vba5-8-13frmMenuで「右クリック→オブジェクトの表示」

 

vba5-8-14新規作成ボタンをダブルクリック。

 

vba5-8-15

frmInput.Show

と入力します。

 

実際にfrmInputを起動して、きちんと選択した薬剤情報が入るか確かめてみて下さい。

 

それでは今回は以上で終了となります。お疲れ様でした。

 

次回は医薬品情報をワークシートに転記するコードについて解説します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-8-5034/feed/ 0
VBA講座5-7 鑑別報告書を初期化するコードを書く https://vba-beginner.com/vba5-7-4962/ https://vba-beginner.com/vba5-7-4962/#respond Wed, 04 Feb 2015 03:48:59 +0000 http://for-guests.com/?p=4962 今回はfrmInputを開いた時に、鑑別報告書のワークシートを初期化するコードを書いていきます。

 

具体的には値を入力するセルを空欄にする、または初期値を入れる動作ですね。

 

前に作成した鑑別書のデータが残っていると大変です。

 

例えば前の患者AさんのデータがNo1~5まで入っており、次の患者BさんのデータがNo1~4までだった場合、AさんのNo5の薬品がBさんのシートに載ってしまいます。

 

これに気付かなければインシデントレポート提出確定です(笑)。

 

それではいきましょう。

スポンサーリンク

鑑別報告書のワークシートの初期化

VBA講座5-3でダウンロードした鑑別報告書のワークシート「印刷シート」を見ながら読み進めて下さい。

 

vba5-7-1例えばD3セルは患者ID、D4セルには患者名(カナ)が入りますよね。これを空欄にする場合一番簡単な方法は、

Range(“D3”) = “”
Range(“D4”) = “”

になります。

 

しかしこの方法だと数が少ない場合はいいですが、今回のように医薬品名や用法、残数などのセルも全て同様に行うとコードがものすごく長くなり、非常に見づらくなってしまいます。

 

そこで今までに書いたコードをちょっと応用して、なるべく短くなるように書いてみましょう。

 

vba5-7-2

With Worksheets(“印刷シート”)

.Activate

.Range(“D3:D5”) = “”
.Range(“J3:J5”) = “”
.Range(“Q3:Q5”) = “”

For i = 8 To 62 Step 6

Dim j As Integer
j = i + 3

.Range(“B” & i).Value = “”
.Range(“C” & i).Value = “”

.Range(“G” & i & “:R” & j) = “”

.Range(Cells(i, “G”), Cells(j, “R”)) = “”

Next

.Range(“E7:E64”) = “”
.Range(“A68”) = “”

End With

これで入力されるセルは全て空欄になります。ですがいきなり上のコードを見ても訳がわからないですよね。

 

上のコードは完成形です。とりあえず入力してから途中で修正したりしますので、皆さんも順番に自分で入力しながら進めてください。

 

まずはシート上部の情報(患者ID、カナ、患者指名、診療科、病棟、主治医、入力日、入力者、確認媒体)を空欄にするコードを書いていきましょう。

 

.Range(“D3:D5”) = “”

「ワークシート印刷シートのD3からD5セルを空欄にする。」

 

「:」は「~」の意味で、セルの範囲を指定する方法でした。これで患者ID、患者名カナ、患者名セルが空欄になります。

 

.Range(“J3:J5”) = “”

「ワークシート印刷シートのJ3からJ5セルを空欄にする。」

 

これで診療科、病棟、主治医のセルが空欄になります。

 

.Range(“Q3:Q5”) = “”

「ワークシート印刷シートのQ3からQ5セルを空欄にする。」

 

これで入力日、入力者、確認媒体のセルが空欄になります。

 

以上で上部のセルの初期化はOKです。

 

vba5-7-4次にワークシートの採用区分のセル(B列)を見て下さい。

 

No1の採用区分のセルはB8セル、No2はB14セルになります。

 

画像にはないですが、No3はB20セル、No4はB26となり、…No10はB62セルになります。

 

よく見たら法則があるのがわかりますか?

 

B列は行番号8を開始として62まで、6個飛びになっていますよね。

 

セル同士が隣接していないので、セルの範囲を指定する方法「:」は今回は使えません。

 

そこで繰り返し処理を使用します。具体的に解説していきましょう。

スポンサーリンク

For~Nextステートメント+Step

For i = 8 To 62 Step 6

「変数iには8から62までの値を入れる。」これは何回もやっているのでOKですが、最後にStep 6というのが付いています。

 

これは何でしょうか?

 

実はStepは「何個飛ばすのか」を意味します。そのまんまですね。

 

もしstepを書かなければ連続で入れる(8、9、10、11、12…62)という意味になります。

 

今回は8から62まで6個飛ばしで入れるということになりますので、(8、14、20…62)のように6個飛ばしで変数iに入れるという意味になります。

 

.Range(“B” & i).Value = “”

「B列変数i行のセルを空欄にする。」

 

上で書きましたが、変数iには8、16…と入っていくわけです。

 

つまり動作としては「B8セルを空欄にする→B14を空欄にする…→B62を空欄にする。」ということが実行されます。

 

Next

「次に進む(iが62になるまで)」これで採用区分のセルの初期化はOKですね。

 

続いて記号・色のセルにいきます。

 

列がCになっただけで採用区分のセルと同じコードが使えます。

.Range(“C” & i).Value = “”

これでOK。

 

印刷シートの薬品名、成分名、薬効の部分はとりあえず置いておいて、その右側に注目して下さい。

 

鑑別報告書のワークシート「印刷シート」の一番上の部分に、上の画像のように適当に入力してみて下さい。

 

私は数字とアルファベットを入れましたが、きちんと処理が行われるか確認するだけなので全部1とかでも全然OKです。

 

今回はG8セルからR11セルの値を空欄にしたいわけです。一番右の継続の欄は基本的に医師が入力しますので、元々作成者が入力する事はありません。含めなくてOKでしょう。

 

vba5-7-8それでは

.Range(“G8:R11”).Value = “”

を追加して、F5を押して起動してみましょう。

 

先ほど入力した部分がきれいに削除されましたね。

 

続いて印刷シートのNo1とNo2のセルをちょっと比較してみます。下の画像をよく見て下さい。

 

どの部分もNo1に6足すとNo2になっているんですよ。規則性がある、つまり…繰り返し処理が使えるという事です。

 

ただ今回はセル~セルと範囲を指定する必要があります。そのため変数をもう1つ用意しなければなりません。

 

Dim j As Integer

「変数jを整数と宣言する。」

 

変数jはiが既に使用されているので順番的にjにしました。それ以外の意味はありません。ぶっちゃけ他のアルファベットでも構いません。

 

For i = 8 To 62 Step 6

「変数iには8から62まで6個飛ばしで入れる。」これは先ほどやりましたね。

 

j = i + 3

「変数jには変数iに3を加えた値を入れる」これの意味が分かりますか?

 

先ほどの

.Range(“G8:R11”).Value = “”

を見て下さい。この8と11に注目。この2つの数字は3の違いですね。

 

つまり…始点セルの数字に3を足せば終点セルの数字になります。ではこのコードを削除して下のコードに書き換えて下さい。

 

.Range(Cells(i, “G”), Cells(j, “R”)) = “”

これが今回最大のポイントですが、正直意味不明ですよね。なんとRangeの中にcellsが入っちゃってます。

 

今までの流れだと

Range(“G” & i) : Range(“R” & j) = “”

になるんじゃないかと思う方もいらっしゃるかもしれません。なんとなく合ってそうですよね?しかしこれだとダメなんです。

 

変数を使用してセルの範囲を指定する場合は、Rangeのカッコ内にcellsで範囲を指定します。更に「:」ではなく、「,」を使用します。

 

これは決まりなので覚えて下さい。

 

以上から

.Range(Cells(i, “G”), Cells(j, “R”)) = “”

は「セル(G列変数i行)からセル(R列変数j行)の値を空欄にする」という意味になります。

 

iには8、14、20…62まで、jには11、17、24…65の値が入ります。

 

つまり「セルG8~R11を空欄にする→セルG14~R17を空欄にする→…セルG62~R65を空欄にする」となります。

 

今回はわかりやすい方法という事で上記を使用しましたが、

.Range(“G” & i & “:R” & j) = “”

こう書いてもOKです。ただこれだとちょっとわかりにくいですし、構文エラーも出やすいので前述の書き方をオススメします。

 

Next

「次に進む(iが62になるまで)」これでOKです。

 

vba5-7-11続いて印刷シートをアクティブにしないとエラーが発生する可能性があります。上の画像を参考に

.Activate

も追加して下さい。あと2行です!頑張って下さい。

 

vba5-7-12No1の薬品名の右のセルはE7ですね。

 

vba5-7-13No10の薬効の右セルはE64です。という事は…

.Range(“E7:E64”) = “”

これでE列、つまりNo1~No10の薬品名、成分名、薬効を全て空欄にする事ができますね。最後です。

 

vba5-7-14一番下のコメント欄を初期化するために…

.Range(“A68”) = “”

これでOKです。

 

いや~長かったですね。お疲れ様でした。

 

今回は初心者の方でもわかるようになるべく簡単なコードを使用しましたが、きちんと動作するならばどう書いてもOKです。

 

このVBA講座を読み終えたら、「自分ならこうやるな」と色々試してみてください。勉強になりますよ。

 

それでは今回以上で終了です。次回は他のユーザーフォームとの連携についてお話します。

>>Excel VBA講座 目次はこちら

]]>
https://vba-beginner.com/vba5-7-4962/feed/ 0