1588900948 Acceess VBAで行われている処理の中身が把握できません

今、以下のようなVBAコードがあります。
フォームは添付ファイルのようなイメージです。

public dbinfo as database
private const frmWaterLevel as string = "水槽の水位の入力"
public const aqua_info as integer = 0

・・・

private sub Water()
 const fish as string ="Water"
 dim tSQL as string
 dim aquarium as DAO.recordset
 
 on error go to err_proc
 
 me.lblDate.caption = wDate
 
 me.txtDate.value = wDate
 
 tSQL = ""
 tSQL = tSQL & "select * from 水槽マスタ"
 tSQL = tSQL & "where 水族館種別 = " & aqua_info
 Set aquarium = dbinfo.OpenRecordset(tSQL,dbOpenDynaset)
  if aquarium.EOF then
    Call ShowMsg (frmWaterLevel,fish,"情報が未入力です。")
  cmdWater.Enabled = False
  cmdPrint.Enabled = False
  Else
    Me.lblTitle.caption = trim$(aquarium.fields("水族館名").value) & "の水槽情報"
Me.Caption = Me.lblTitle.Caption
  End If
  aquarium.close
  Set aquarium = nothing
 
  Call kansu1
 
  Exit Sub

err_proc:
  If not aquarium is nothing then Set aquarium = nothing
  Call ShowMsg(frmWaterLevel,fish,err.description)
 
End Sub

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/05/13 18:07:41
id:moon-fondu

この状況におきまして。
「コードが何をしているか」につきまして、以下の点が判らず、悩んでおります。

①「private sub Water()」と、新たに関数Waterの作成を宣言した後に。
「const fish as string ="Water"」と、関数名と同じ名称の文字列Waterを、変数fishに格納する意味。

②フォーム内のテキストボックス「lblDate」や「txtDate」につきまして、「= wDate」ということは、エラーではないとき(on error go to err_proc で飛ばされない時)はここを通るので。wDateの値が、lblDate(ラベル)とtxtDate(テキストボックス)に、パッと表示される…という認識で正しいかどうかにつきまして。

③err_procのエラーに飛んだ際、「If not aquarium is nothing then Set aquarium = nothing」が、何をやっているのか…「でないとき(If not~)は、ない(nothiing)」という文章ですが、aquariumデータベースがnothingになる…とは、どういうことでしょうか?
その次のCall ShowMsgは、メッセージを呼び出す関数を実行するという動きだろうと、何となくわかるのですが…。

④「Me.Caption = Me.lblTitle.Caption」の、必要性が不明でして。Me.Captionになぜ格納?し直しているのでしょうか…。

お力添えいただけますと助かります。よろしくお願い致します。

ベストアンサー

id:a-kuma3 No.1

回答回数4836ベストアンサー獲得回数2085

ポイント1300pt

> ①「private sub Water()」と、新たに関数Waterの作成を宣言した後に。
> 「const fish as string ="Water"」と、関数名と同じ名称の文字列Waterを、変数fishに格納する意味。
これは、コーディング規約、というレベルのやつです。

  • エラーメッセージを表示する ShowMsg() サブルーチンでは、エラーを検出したサブルーチン名を表示する決まりになっている
  • ShowMsg は、サブルーチンのあちこちに散らばっているので、それぞれに "Water" という文字定数を指定すると、コピペした場合に修正し忘れる可能性がある
  • なので、ShowMsg を使うサブルーチン(全サブルーチンでしょうけれど)では、サブルーチン名を宣言した次の行で、サブルーチン名を Const な変数に代入して、ShowMsg の第2引数には、その変数を指定すること

という決まりを作っているだけです。
コピペ文化がある VB や VBA のプロジェクトでは、よく見かけます。

実物の方では、fish の変数名は、もうちょっとサブルーチン名っぽい命名になっていないでしょうか?



> ②フォーム内のテキストボックス「lblDate」や「txtDate」につきまして、「= wDate」ということは、エラーではないとき(on error go to err_proc で飛ばされない時)はここを通るので。wDateの値が、lblDate(ラベル)とtxtDate(テキストボックス)に、パッと表示される…という認識で正しいかどうかにつきまして。
その認識で良いと思います。



> ③err_procのエラーに飛んだ際、「If not aquarium is nothing then Set aquarium = nothing」が、何をやっているのか…「でないとき(If not~)は、ない(nothiing)」という文章ですが、aquariumデータベースがnothingになる…とは、どういうことでしょうか?
オブジェクトが代入される変数では、Nothing を代入すると、そのオブジェクトがメモリから解放される、ということになっています。

 Set aquarium = dbinfo.OpenRecordset(tSQL,dbOpenDynaset)

の行が実行される前にエラーが出たのかどうか、という判定のために If があります。
この Set の行が実行されてからエラーが出た場合には、エラー処理で RecordSet のインスタンスをメモリから開放する、というような意味合いです。



> ④「Me.Caption = Me.lblTitle.Caption」の、必要性が不明でして。Me.Captionになぜ格納?し直しているのでしょうか…。
添付の画像では、Form のタイトルバーがありませんが、実物でもそうでしょうか。
「水族館名」を目立つように、フォームのタイトルバーにも表示する、ということだと思いますけれど。

id:moon-fondu

ありがとうございます。
constな変数に代入して、それを呼び出すことで、
修正忘れを起きにくくするんですね。

実物の方はサブルーチン名っぽい?名前かどうか、
判断基準がわからないのですが…fishではないです。
(ネット上の質問用に変えてしまい、わかりにくく
なりすみません…)

④につきまして、タイトルバーには表示されています。
Me.Caption = Me.lblTitle.Caption
があるおかげなんですね。

2020/05/11 11:54:03

その他の回答0件)

id:moon-fondu

質問文を編集しました。詳細はこちら

id:a-kuma3 No.1

回答回数4836ベストアンサー獲得回数2085ここでベストアンサー

ポイント1300pt

> ①「private sub Water()」と、新たに関数Waterの作成を宣言した後に。
> 「const fish as string ="Water"」と、関数名と同じ名称の文字列Waterを、変数fishに格納する意味。
これは、コーディング規約、というレベルのやつです。

  • エラーメッセージを表示する ShowMsg() サブルーチンでは、エラーを検出したサブルーチン名を表示する決まりになっている
  • ShowMsg は、サブルーチンのあちこちに散らばっているので、それぞれに "Water" という文字定数を指定すると、コピペした場合に修正し忘れる可能性がある
  • なので、ShowMsg を使うサブルーチン(全サブルーチンでしょうけれど)では、サブルーチン名を宣言した次の行で、サブルーチン名を Const な変数に代入して、ShowMsg の第2引数には、その変数を指定すること

という決まりを作っているだけです。
コピペ文化がある VB や VBA のプロジェクトでは、よく見かけます。

実物の方では、fish の変数名は、もうちょっとサブルーチン名っぽい命名になっていないでしょうか?



> ②フォーム内のテキストボックス「lblDate」や「txtDate」につきまして、「= wDate」ということは、エラーではないとき(on error go to err_proc で飛ばされない時)はここを通るので。wDateの値が、lblDate(ラベル)とtxtDate(テキストボックス)に、パッと表示される…という認識で正しいかどうかにつきまして。
その認識で良いと思います。



> ③err_procのエラーに飛んだ際、「If not aquarium is nothing then Set aquarium = nothing」が、何をやっているのか…「でないとき(If not~)は、ない(nothiing)」という文章ですが、aquariumデータベースがnothingになる…とは、どういうことでしょうか?
オブジェクトが代入される変数では、Nothing を代入すると、そのオブジェクトがメモリから解放される、ということになっています。

 Set aquarium = dbinfo.OpenRecordset(tSQL,dbOpenDynaset)

の行が実行される前にエラーが出たのかどうか、という判定のために If があります。
この Set の行が実行されてからエラーが出た場合には、エラー処理で RecordSet のインスタンスをメモリから開放する、というような意味合いです。



> ④「Me.Caption = Me.lblTitle.Caption」の、必要性が不明でして。Me.Captionになぜ格納?し直しているのでしょうか…。
添付の画像では、Form のタイトルバーがありませんが、実物でもそうでしょうか。
「水族館名」を目立つように、フォームのタイトルバーにも表示する、ということだと思いますけれど。

id:moon-fondu

ありがとうございます。
constな変数に代入して、それを呼び出すことで、
修正忘れを起きにくくするんですね。

実物の方はサブルーチン名っぽい?名前かどうか、
判断基準がわからないのですが…fishではないです。
(ネット上の質問用に変えてしまい、わかりにくく
なりすみません…)

④につきまして、タイトルバーには表示されています。
Me.Caption = Me.lblTitle.Caption
があるおかげなんですね。

2020/05/11 11:54:03
  • id:tobeoscontinue
    前回はすっきりしない点が残りましたがありがとうございました。

    > エラーではないとき(on error go to err_proc で飛ばされない時)
    on error はこの文以降を実行していって何処かでエラーが発生したらerr_procへ飛べという宣言のようなものです。
    プログラムする側からは一々エラーチェックをしなくてもよくなりますが何処でエラーが発生したのか単純にはわからないというデメリットもあります。

    If not aquarium is nothing then Set aquarium = nothing
    は文章のように感じてしまいますが
    If not (aquarium is nothing) then
    Set aquarium = nothing
    となり先ずaquarium is nothingでaquariumがnothingか調べます。それをnotで否定するのでaquariumがnothingで無い、つまりaquariumに何かが設定されているのならnothingを代入して解放するという意味になります。
  • id:moon-fondu
    腑に落ちました。
    ~でないかどうか、~でない時はメモリを解放、ですね。
    ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません