今、下記のようなVBAのコードがありまして
https://gist.github.com/AuroraNorthernQuarter/45cda9fbff0bc4e827bd410413fa69d6
大まかに、excelファイルの資料を作成するために、その資料内に入れる値を用意しているような。処理だと思うのですが…全体的に、把握できておりません。
構造体を利用して、たくさんの変数が出てきています。
(変数名は、オリジナルのコードが判明しないよう、適宜変更しております)
いくつか疑問点がありまして、アドバイスいただければと思い、投稿しました。
以下、その疑問点になります。
(1)このコードでは「構造体」というのが利用されているようです。Accessを使ってExcelの表を作成する際、構造体を使って配列を作る・資料を作るというのは、AccessでExcelドキュメントを作成する方法として、一般的なのでしょうか?
(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にて、構造体となる変数、ノードとなる変数、それを「.」(ピリオド)で繋げることで、何を示そうとしているのでしょうか。
たくさんの質問になり恐れ入りますが、お力添えいただけますと幸いです。
よろしくお願い致します。
(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標準で用意されているオブジェクトでオブジェクトのメンバが別のオブジェクトになっているケースがあります。
それと同じです。
包含関係になっていると言えば良いでしょうか。
もちろんコードの書き方によるので、そう書くことが読みやすくなるかどうかは個人に寄ります。
(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標準で用意されているオブジェクトでオブジェクトのメンバが別のオブジェクトになっているケースがあります。
それと同じです。
包含関係になっていると言えば良いでしょうか。
もちろんコードの書き方によるので、そう書くことが読みやすくなるかどうかは個人に寄ります。
gizmo5さん、遅くなりましてすみません。
(1)につきましては、そうなんですね。少し安心しました。この手法が一般的だとしましたら…自分には複雑すぎです。
(2)は、redim関数で要素の入れ物を確保しているんですね。
(3)は、直後ではないのですね。直後ですと、ちょっとずつ読み込む間になってしまうので、貼っていただいたリンクに「レコードがないrecordsetオブジェクトでは、RecordCountプロパティの値は0です。」とあるように、0になってしまいますね。movelastで最後の行に来たところでカウントすれば、全レコードが集計できるということなのですね。
(5)につきましては、2つの変数、2つのメンバ同士を繋げるためのピリオドなのですね。
ありがとうございました。
gizmo5さん、遅くなりましてすみません。
2020/08/20 21:54:44(1)につきましては、そうなんですね。少し安心しました。この手法が一般的だとしましたら…自分には複雑すぎです。
(2)は、redim関数で要素の入れ物を確保しているんですね。
(3)は、直後ではないのですね。直後ですと、ちょっとずつ読み込む間になってしまうので、貼っていただいたリンクに「レコードがないrecordsetオブジェクトでは、RecordCountプロパティの値は0です。」とあるように、0になってしまいますね。movelastで最後の行に来たところでカウントすれば、全レコードが集計できるということなのですね。
(5)につきましては、2つの変数、2つのメンバ同士を繋げるためのピリオドなのですね。
ありがとうございました。