Access VBAで利用されている構造体とノードにつきまして


今、下記のようなVBAのコードがありまして
https://gist.github.com/AuroraNorthernQuarter/45cda9fbff0bc4e827bd410413fa69d6
大まかに、excelファイルの資料を作成するために、その資料内に入れる値を用意しているような。処理だと思うのですが…全体的に、把握できておりません。

構造体を利用して、たくさんの変数が出てきています。
(変数名は、オリジナルのコードが判明しないよう、適宜変更しております)

いくつか疑問点がありまして、アドバイスいただければと思い、投稿しました。
以下、その疑問点になります。

(1)このコードでは「構造体」というのが利用されているようです。Accessを使ってExcelの表を作成する際、構造体を使って配列を作る・資料を作るというのは、AccessでExcelドキュメントを作成する方法として、一般的なのでしょうか?

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/08/20 21:55:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:moon-fondu

(2)Access VBAで構造体を用いてドキュメントの元となるデータを作成する際、配列を作成しているようです。

質問では記載しておりませんが、変数「tSQL」に、各テーブルから情報を取得するための長大なSQL文が格納されています。

今回の質問では、そのSQL文作成後の、If文についてです。

excelの表を作成するために、配列を先に作成しているようなのですが。

なぜ配列を先に作成する必要があるのでしょうか…疑問です。

(3)レコードセットのaquariumの挙動につきまして、「facount = aquarium.recordcount」の箇所は、配列の数を設定しているようなのですが。

その上下にあります、

aquarium.movelast

facount = aquarium.recordcount

aquarium.movefirst

は、何をしているのでしょうか?レコードセットの最後の行にいって、また最初に戻る…なぜ、このようなことをしているのでしょうか?

(4)「public document1() as makedocuments」という宣言について、「makedocuments」という型は、Accessの本のどこにも載っていません。

構造体の名前と同じなので、構造体が型になっている…と思われるのですが。

それはvbaの用法としてあり得るのでしょうか?引数に何も入っていませんし…excelのワークシートを作るために用意している変数?のようですが、なぜこれが必要なのか理解できていない状況です。

(5)たくさんの変数が登場している中で「ノード」というのが利用されているようなのですが。例えば「.protits.kubun1」という箇所で、変数「protits」は構造体の要素の1つとして宣言されており、変数「kubun1」はノードという旨のコメントが、コード内記載されておりました。

単にexcel資料に反映するための値を変数に格納するなら、「.protits.kubun1」と、変数2つも並べる理由が判らず…ややこしくなるだけな気がするのですが。

VBAにて、構造体となる変数、ノードとなる変数、それを「.」(ピリオド)で繋げることで、何を示そうとしているのでしょうか。

たくさんの質問になり恐れ入りますが、お力添えいただけますと幸いです。

よろしくお願い致します。

ベストアンサー

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141

ポイント1400pt

(1)は、正直なところ微妙です。
個人の経験ではあまりいません。
VBやVBAを主にやるような人は、設計をあまりせずに動くコードをちょっとずつ足していくような作り方をする人が多いです。
構造体の配列よりも、複数の配列がたくさん存在するというような書き方をする人が多いような印象です。

(2)は以下のところでしょうか。

	redim document1(facount)

先に入れ物を作っておかないと、入れる場所がないではありませんか。

(3)については、以下の注意のところが参考になると思います。
https://docs.microsoft.com/ja-jp/office/vba/access/concepts/data-access-objects/count-the-number-of-records-in-a-dao-recordset

実は、SQL を実行してテーブルを検索したときに、結果がどかんと作成されるわけではありません。
何十万件もひっかかる場合もあるので、Recordset.MoveNext をする際にちょっとずつ読み込むようになってます。
なので、Recordset.RecordCount は、Recordset.Open をした直後に引っかかった件数を正しく表しているわけではありません。

(4)は「構造体が型になっている」という理解で良いです。
makedocuments は、自分で勝手に作った構造体の名前なので、検索しても引っかかることは、まずないでしょう。

(5)は VBA標準で用意されているオブジェクトでオブジェクトのメンバが別のオブジェクトになっているケースがあります。
それと同じです。
包含関係になっていると言えば良いでしょうか。
もちろんコードの書き方によるので、そう書くことが読みやすくなるかどうかは個人に寄ります。

id:moon-fondu

gizmo5さん、遅くなりましてすみません。
(1)につきましては、そうなんですね。少し安心しました。この手法が一般的だとしましたら…自分には複雑すぎです。
(2)は、redim関数で要素の入れ物を確保しているんですね。
(3)は、直後ではないのですね。直後ですと、ちょっとずつ読み込む間になってしまうので、貼っていただいたリンクに「レコードがないrecordsetオブジェクトでは、RecordCountプロパティの値は0です。」とあるように、0になってしまいますね。movelastで最後の行に来たところでカウントすれば、全レコードが集計できるということなのですね。
(5)につきましては、2つの変数、2つのメンバ同士を繋げるためのピリオドなのですね。

ありがとうございました。

2020/08/20 21:54:44

その他の回答0件)

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141ここでベストアンサー

ポイント1400pt

(1)は、正直なところ微妙です。
個人の経験ではあまりいません。
VBやVBAを主にやるような人は、設計をあまりせずに動くコードをちょっとずつ足していくような作り方をする人が多いです。
構造体の配列よりも、複数の配列がたくさん存在するというような書き方をする人が多いような印象です。

(2)は以下のところでしょうか。

	redim document1(facount)

先に入れ物を作っておかないと、入れる場所がないではありませんか。

(3)については、以下の注意のところが参考になると思います。
https://docs.microsoft.com/ja-jp/office/vba/access/concepts/data-access-objects/count-the-number-of-records-in-a-dao-recordset

実は、SQL を実行してテーブルを検索したときに、結果がどかんと作成されるわけではありません。
何十万件もひっかかる場合もあるので、Recordset.MoveNext をする際にちょっとずつ読み込むようになってます。
なので、Recordset.RecordCount は、Recordset.Open をした直後に引っかかった件数を正しく表しているわけではありません。

(4)は「構造体が型になっている」という理解で良いです。
makedocuments は、自分で勝手に作った構造体の名前なので、検索しても引っかかることは、まずないでしょう。

(5)は VBA標準で用意されているオブジェクトでオブジェクトのメンバが別のオブジェクトになっているケースがあります。
それと同じです。
包含関係になっていると言えば良いでしょうか。
もちろんコードの書き方によるので、そう書くことが読みやすくなるかどうかは個人に寄ります。

id:moon-fondu

gizmo5さん、遅くなりましてすみません。
(1)につきましては、そうなんですね。少し安心しました。この手法が一般的だとしましたら…自分には複雑すぎです。
(2)は、redim関数で要素の入れ物を確保しているんですね。
(3)は、直後ではないのですね。直後ですと、ちょっとずつ読み込む間になってしまうので、貼っていただいたリンクに「レコードがないrecordsetオブジェクトでは、RecordCountプロパティの値は0です。」とあるように、0になってしまいますね。movelastで最後の行に来たところでカウントすれば、全レコードが集計できるということなのですね。
(5)につきましては、2つの変数、2つのメンバ同士を繋げるためのピリオドなのですね。

ありがとうございました。

2020/08/20 21:54:44
  • id:tobeoscontinue
    (1)> AccessでExcelドキュメントを作成する方法として、一般的なのでしょうか?
    プログラミングとしては一般的で重要です。例えばカレーを作るとして人参、ジャガイモ、玉葱、肉を買ってきて
    と言うよりカレーの具を買ってきてと言うほうが簡単です。

    (2)> excelの表を作成するために、配列を先に作成しているようなのですが。
    > なぜ配列を先に作成する必要があるのでしょうか…疑問です。
    レコードセットから直接セルに書き込むようにVBAで書いてしまうとその目的にしか使えません。
    一方一度配列に落とすことで後に加工が必要になった時に配列だけに注目すればいいので楽に加工できます。

    (5)> 単にexcel資料に反映するための値を変数に格納するなら、「.protits.kubun1」と、変数2つも並べる理由が判らず…ややこしくなるだけな気がするのですが。
    単にexcel資料に反映するためだけじゃないとすればややこしくするだけの意味があるのです。
    木を見て森を見ず。まず全体を大まかに理解すれば細かな点の意味も分かってくるように思います。
  • id:moon-fondu
    tobeoscontinueさん、コメントありがとうございます。
    構造体を使う理由、配列を使う理由、イメージが湧きました!


    構造体の変数と、ノードになる変数、それをピリオドで繋げている箇所はまだまだ実感が湧かないですが、まず森を理解できるように励みます!

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

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

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

回答リクエストを送信したユーザーはいません