Access VBAにおけるDo...Loopステートメント内にあるAdd Trueメソッド?につきまして


今、以下のようなコードがあります。

----------
Public Const Admission_Category as Integer = 1

・・・

Public Const Handing_Category as Integer = 0

・・・

Private Const fwater as String = "水族館の会計"
Private Accounting as Collection

・・・

Private Function Water() as Boolean
Const aquarium_n as String = "Water"
Dim tSql as String
Dim Aquarium as DAO.Recordset
On Error GoTo ERR_PROC
Water = False

tSql = ""
tSql = "select 水族館ID,都道府県ID from 基本情報"
tSql = tSql & "where 集計日 = " & Format(Me.txtDate.Value,"YYYYMMDD")
tSql = tSql & "and 集計区分 = " & Admission_Category
tSql = tSql & "and 経費区分 =" & Handing_Category
Set Aquarium = dbinfo.OpenRecordset(tSql,dbOpenDynaset)
With Aquarium
Do Until .EOF
Accounting.Add True, .Fields(0).Value & "@" & .Fields(1).Value
.MoveNext
Loop
End With
Set Aquarium = Nothing
Water = True
Exit Function
ERR_PROC:
If Not Aquarium Is Nothing Then Set Aquarium = Nothing
Call ShowMsg(fwater,aquarium_n,Err.Descrioption)
End Function
----------

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

このコード上で「Accounting.Add True, .Fields(0).Value & "@" & .Fields(1).Value」という箇所がありますが。
一体、何をしているのでしょうか?
Do...Loopステートメントで、条件を満たしている場合は繰り返すということですが。
その条件を示しているのか、それとも、条件ではなく具体的な処理なのか、どっちなのか判断できず…。

また、「Water = False」と「Water = True」の部分がありますが。
「Water = False」の時に、「tSql = ""…」といったSQL文の作成が行われている…という認識で正しいでしょうか?

ご助言いただけますと有難いです。
よろしくお願い致します。

ベストアンサー

id:a-kuma3 No.1

回答回数4856ベストアンサー獲得回数2095

ポイント1200pt

このコード上で「Accounting.Add True, .Fields(0).Value & "@" & .Fields(1).Value」という箇所がありますが。
一体、何をしているのでしょうか?

一応、Collection のマニュアルの URL を記載しておきます。
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.collection.add?view=netcore-3.1

Collection は、配列のようなオブジェクトです。
0から始まる何番目、という取り出し方以外に、文字列で目印をつけて内容を取り出すこともできます。
Add メソッドは、その中身を追加するためのメソッドで、

  • 1番目 : 追加するオブジェクト
  • 2番目 : もし、指定したら、その文字列でオブジェクトを取り出せる(省略もできます

関数 Water の外側で宣言されている Accounting ですが、このモジュール内の別の関数かサブルーチンで利用されているはずです。
水族館ID+都道府県IDの文字列("@" が間に入ります)で判定して、Accounting にあるかどうかを判定するような使い方で。

この Collection に追加する値(Add メソッドの 1番目の引数である True)は、多分、何でも良いんです。
水族館ID+都道府県ID で探して値がある → 先の SQL で検索に引っかかった、という目印の役目のはずです。


また、「Water = False」と「Water = True」の部分がありますが。

これは、認識が違います。
この関数 Water が True を返したときには、処理がひと通りうまく動いた、という目印です。
False を返すということは On Error の方に処理が移ったということなので、どこかでエラーがあったんだな、ということが、関数 Water を呼び出した側が分かります。
# あまり褒められるような仕様ではありません

id:moon-fondu

ご助言ありがとうございます。
はい、a-kuma3さんの仰るように、
確かに(質問用に変えましたが)Accountingに相当する関数は、
色々な場所で利用されていることを確認しました。
CollectionオブジェクトとAddメソッドの関係も、少しクリアになりました。
書き方、公式と違いますね。
「family.Add(New child(newName), newName)」のように書くなら、
「Accounting.Add(True, .Fields(0).Value & "@" & .Fields(1).Value)」の方がいいですね。

Before と After 引数の両方は省略されているということは、Accountingコレクションの末尾に
「Fields(0).Value & "@" & .Fields(1).Value」、すなわち列の1行目&@&2行目の値、
「水族館ID+@+都道府県IDの文字列」が、追加されたんですね。

「Water = False」は、On Errorの方に処理が移ったことを示す役割なんですね。
先にFalseにしておいて、どこかでエラーが発生したら、「ERR_PROC:
If Not Aquarium Is Nothing Then Set Aquarium = Nothing…」に飛んでしまうので、
「Water = True」には通らず、Falseのままということですね。

追加されたAccountingコレクションの全体像や、なぜFalseとTrueで判定させているかの理由は
掴み切れていないですが、この箇所はa-kuma3さんのアドバイスで、大まかな処理内容を把握できた気がします。

ありがとうございます。

2020/05/26 10:18:13

その他の回答0件)

id:a-kuma3 No.1

回答回数4856ベストアンサー獲得回数2095ここでベストアンサー

ポイント1200pt

このコード上で「Accounting.Add True, .Fields(0).Value & "@" & .Fields(1).Value」という箇所がありますが。
一体、何をしているのでしょうか?

一応、Collection のマニュアルの URL を記載しておきます。
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.collection.add?view=netcore-3.1

Collection は、配列のようなオブジェクトです。
0から始まる何番目、という取り出し方以外に、文字列で目印をつけて内容を取り出すこともできます。
Add メソッドは、その中身を追加するためのメソッドで、

  • 1番目 : 追加するオブジェクト
  • 2番目 : もし、指定したら、その文字列でオブジェクトを取り出せる(省略もできます

関数 Water の外側で宣言されている Accounting ですが、このモジュール内の別の関数かサブルーチンで利用されているはずです。
水族館ID+都道府県IDの文字列("@" が間に入ります)で判定して、Accounting にあるかどうかを判定するような使い方で。

この Collection に追加する値(Add メソッドの 1番目の引数である True)は、多分、何でも良いんです。
水族館ID+都道府県ID で探して値がある → 先の SQL で検索に引っかかった、という目印の役目のはずです。


また、「Water = False」と「Water = True」の部分がありますが。

これは、認識が違います。
この関数 Water が True を返したときには、処理がひと通りうまく動いた、という目印です。
False を返すということは On Error の方に処理が移ったということなので、どこかでエラーがあったんだな、ということが、関数 Water を呼び出した側が分かります。
# あまり褒められるような仕様ではありません

id:moon-fondu

ご助言ありがとうございます。
はい、a-kuma3さんの仰るように、
確かに(質問用に変えましたが)Accountingに相当する関数は、
色々な場所で利用されていることを確認しました。
CollectionオブジェクトとAddメソッドの関係も、少しクリアになりました。
書き方、公式と違いますね。
「family.Add(New child(newName), newName)」のように書くなら、
「Accounting.Add(True, .Fields(0).Value & "@" & .Fields(1).Value)」の方がいいですね。

Before と After 引数の両方は省略されているということは、Accountingコレクションの末尾に
「Fields(0).Value & "@" & .Fields(1).Value」、すなわち列の1行目&@&2行目の値、
「水族館ID+@+都道府県IDの文字列」が、追加されたんですね。

「Water = False」は、On Errorの方に処理が移ったことを示す役割なんですね。
先にFalseにしておいて、どこかでエラーが発生したら、「ERR_PROC:
If Not Aquarium Is Nothing Then Set Aquarium = Nothing…」に飛んでしまうので、
「Water = True」には通らず、Falseのままということですね。

追加されたAccountingコレクションの全体像や、なぜFalseとTrueで判定させているかの理由は
掴み切れていないですが、この箇所はa-kuma3さんのアドバイスで、大まかな処理内容を把握できた気がします。

ありがとうございます。

2020/05/26 10:18:13

コメントはまだありません

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

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

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

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