• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2次元配列の使い方)

2次元配列の使い方とエクセルへの出力について

このQ&Aのポイント
  • Access 2013 VBAを使用して、メイン画面に2つのサブフォームを配置し、親→子→孫の関係でデータを取得します。エクセルに出力する際、親のデータを変数Aに、子のデータを一次元配列B()に、孫のデータを一次元配列C(0)~C(3)に格納して、更に子用の一次元配列B1()~B4()に入れます。
  • 子画面で次の2レコード目に進むと、B1...B4の配列変数に入れられる孫のC(0)~C(3)の配列の中身は、子画面の一レコードと二レコード目で同じものになります。
  • この方法が使用できない場合、Accessでクラスを作成し、配列変数に格納する方法もあります。他にもさまざまな方法があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

細かいことですが「RecordsetClone」は「変数」ではなくて「プロパティ」です。 さて、本題ですが、 > 一つお聞きしたいのですが、RecordsetClone変数だと、フィールド更新後に使うと、値が古いものが取得されてしまい、うまく計算が出来ない時があります。 フィールドは更新したが、まだレコード保存していない状態だとそうなるかもしれません。 フィールドを更新して、それを参照して使用する場合は、事前にレコード保存してテーブルに格納しておくべきですね。 テーブルに格納せずに、エラーや操作ミスで終了してしまった場合、テーブルの値と参照使用した値に矛盾が生じてしまう可能性があります。 フィールドを更新した場合は、RecordsetClone でデータを参照する前に、 DoCmd.RunCommand acCmdSaveRecord でレコード保存しておくといいでしょう。。 Me.Recordset だと、レコードセットでの操作(レコード移動など)が直接フォームに影響を与えてしまうので、 処理が重くなるので避けるべきです。 他にもフォームのレコードセットを参照する方法として、RecordSet.Clone があります。 「フォームの Recordset, RecorsetClone, RecordSet.Clone の違い」はWEB検索すると詳しい解説が見つかると思います。

superwonderful
質問者

お礼

ご回答ありがとうございます。 RecordsetCloneを取得する前に、レコード保存をする・・・ これをしているとうまく処理ができています。ありがとうございます。 >「フォームの Recordset, RecorsetClone, RecordSet.Clone の違い」はWEB検索すると詳しい解説が見つかると思います。 こちらは、参照してみました。処理速度の違いもあるということですね。ありがとうございます

その他の回答 (2)

回答No.2

Accessのテーブルデータを他のアプリケーションに渡す一つの手法としてユーザー定義型(C言語の構造体)を利用する手があります。その場合、 BSave(変数名) などの関数で、バイナリーデータとして一気に吐き出し BLoad(変数名) などの関数で、バイナリーデータを変数に一気に取り込むことも可能です。 http://www.cc.kyoto-su.ac.jp/~yamada/pB/struct.html#nest 質問の案件では、構造体をメンバにする構造体を作成することになるかと思います。

superwonderful
質問者

お礼

fa007さん、ご説明ありがとうございました。 ご説明していただいた構造体.構造体変数を使いました。 またよろしくお願いします。

回答No.1

RecordsetCloneプロパティで直接フォームのレコードセットにアクセスできます。 あるいは、レコードソースのテーブルをレコードセットとして開いてアクセスすることもできます。 レコードセットは、配列の高機能版と考えられるので、わざわざ配列に格納したり、クラスを作成するという手間をかける必要はないでしょう。

superwonderful
質問者

お礼

hatenaさん、ご回答ありがとうございます。 親フォームに複数のサブフォームが有り、そこからまた、マスターの値などを取得しなくてはいけなくて、なかなか複雑になりそうなので、RecordsetCloneを使うのと、同時に、構造体の構造体変数も使う事になりました。 一つお聞きしたいのですが、RecordsetClone変数だと、フィールド更新後に使うと、値が古いものが取得されてしまい、うまく計算が出来ない時があります。 この時には、Me.Recordset で画面に直結したレコードセットを取得して値を取得するようにしましたが、これでもよろしいのでしょうか? 不都合があるとすれば、間違ってCloseしてしまうと、画面もエラーになってしまうぐらいかなと思いますが・・・ よろしくお願いします

関連するQ&A