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

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

2次元配列の使い方

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

  • 多次元配列の一次元目の最大値の求め方

    多次元配列の一次元目の最大値の求め方 下記のような多次元配列(ちなみに、これって二次元配列ですか?)があるとき、 常に、「一次元目の最大値+1」を返すようにしたいのですが、 どうすればよいのでしょうか? $data[0][0]とか$data[1][0]とか$data[2][0]とかの最大値の意味です。 下記の例でいくと、一次元目の最大値が3なので、数値の4を返したいのですが…、 ■$data 1,0,A1,B1,C1 2,5,A2,B2,C2 3,0,A3,B3,C3 3,2,A4,B4,C4

    • ベストアンサー
    • PHP
  • 多次元配列のポインタ渡し

    C++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

  • 二次元配列について

    $recordは二次元配列です。 こういうものを書いておりまして、    foreach($record as $key => $val) { if($key > 18){   for($i=1; $i<=25; $i++){ $data = $record[0].",".$i.",".★★★; ★★★の位置に$record[19][1]、$record[20][1]…$record[19][2]、$record[20][2]… という値を順に入れていきたいのですが、どうしたらよいでしょうか。

    • 締切済み
    • PHP
  • 多次元の配列を[ ]で括って見やすくトレースするには?

    多次元の配列を[ ]で括って見やすくトレースするには? 何次元か特定される配列ならばforなどで次元の数だけ繰り返せばできるとは思うのですが そうでないときにも [ [ [a,b,c,...],[],[],...],[],[],... ] のように隣り合う要素(配列)との切れ目が見やすいようにトレースする方法はありますか? プログラムには影響しませんが、トレースすると1次元の配列と同じように , だけで区切られてトレースされてしまい見にくいですので 配列が何次元か返させる関数など書ければ良いと思うのですが FlashPlayer10、ActionScript3.0です 質問の意味理解していただけるでしょうか お願いします

    • ベストアンサー
    • Flash
  • PHPで2次元配列を1次元配列にしたいのですが、わからないので教えてく

    PHPで2次元配列を1次元配列にしたいのですが、わからないので教えてください。 例えば2次元配列を以下のようにします。 $ss[0][0]=a $ss[0][1]=b $ss[0][2]=c $ss[1][0]=あ $ss[2][0]=い $ss[3][0]=う これを以下のような1次元配列にしたいです。、 $ss[0][0]→$g[0],$ss[0][1]→$g[1],$ss[0][2]=$g[2] $ss[1][0]→$h[0],$ss[2][0]→$h[1],$ss[3][0]=$h[2] よろしくお願いします。

    • ベストアンサー
    • PHP
  • 二次元配列が、勝手に一次元配列になってしまう

    Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。

  • PHP で Excel を2次元配列で取出したい

    PHP で Excel ファイルのデータを取り出して、単純な2次元配列にしたいのですが、なかなかうまく行かず、ここ2~3日、はまっています。サポートをお願い頂けたら幸いです。 <これまでやった事> ・ネット情報を参考に、phpspreadsheet が使える環境にし必要処理を実施後、以下のように rangeToArray 関数を使い、 print_r で中身を見ると、エクセルの A1 から N7 まで、連想配列として取り出されます。 $data = $sheet->rangeToArray("A1:N9"); print_r($data);  連想配列の型式で、   Array ( [0] => Array ( [0] => (A1 のデータ)[1] => (A2 のデータ)..... [12] => (A13のデータ)) [1] => Array ( [0] => (A2のデータ) [1] =>(B2のデータ).......   が表示されます。 しかし私には以下のような単純な2次元配の方が理解しやすいので、      $data[0][0] ならば A1 のデータ、$data[12][0] ならば A13 のデータ、     $data[2][6] ならば C7 のデータを意味し、 例えば、C1 に「コスト」   というタイトル名が表示されている場合、   $cost = $data[2][0]; で C1 の内容を $cost という変数に入れたいのですが、どうすれば良いのでしょうか? なお、現在は、$data 変数に添え字 [0][5] を入れると文法エラーでます。 ちなみに、私は連想配列の理解に追いついていけないほど、PHP の初心者です。 以上、コメントを頂けたら幸いです。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 多次元配列のカウント+1の仕方

    多次元配列のカウント+1の仕方 下記のような多次元配列(ちなみに、これって二次元配列ですか?)があるとき、 常に、「2列目の0がある数+1」を返すようにしたいのですが、 どうすればよいのでしょうか? $data[0][1]とか$data[1][1]とか$data[2][1]とかの意味です。 下記の例でいくと、2列目に0が3つあるので、数値の4を返したいのですが…、 ■$data 1,0,A1,B1,C1 2,0,A2,B2,C2 3,0,A3,B3,C3 4,2,A4,B4,C4 ■var_dump($data); array(4) { [0]=> array(5) { [0]=> string(1) "1" [1]=> string(1) "0" [2]=> string(2) "A1" [3]=> string(2) "B1" [4]=> string(2) "C1" } [1]=> array(5) { [0]=> string(1) "2" [1]=> string(1) "0" [2]=> string(2) "A2" [3]=> string(2) "B2" [4]=> string(2) "C2" } [2]=> array(5) { [0]=> string(1) "3" [1]=> string(1) "0" [2]=> string(2) "A3" [3]=> string(2) "B3" [4]=> string(2) "C3" } [3]=> array(5) { [0]=> string(1) "4" [1]=> string(1) "2" [2]=> string(2) "A4" [3]=> string(2) "B4" [4]=> string(2) "C4" } }

    • ベストアンサー
    • PHP
  • 3次元配列から2次元配列への代入

    C言語初心者です。 詳しい方、宜しくお願い致します。 下記のような三次元配列(Sanjigen[2][5][5])があります。 ダンプしたもので見難くてすみません。 00FFBCBC [0][0][0] 01 02 03 04 05 00FFBCC1 [0][1][0] 06 07 08 09 10 00FFBCC6 [0][2][0] 11 12 13 14 15 00FFBCCB [0][3][0] 16 17 18 19 20 00FFBCD0 [0][4][0] 21 22 23 24 25 00FFBCE4 [1][0][0] 26 27 28 29 30 00FFBCE9 [1][1][0] 31 32 33 34 35 00FFBCEE [1][2][0] 36 37 38 39 40 00FFBCF3 [1][3][0] 41 42 43 44 45 00FFBCF8 [1][4][0] 46 47 48 49 50 このデータ(Sanjigen[2][5][5])を、二次元配列にしまう方法をご教授ください。 Nijigen1[5][5]には三次元配列のデータ(1~25)と(26~50)をアンドしたデータを格納します。 Nijigen2[5][5]には三次元配列のデータ(1~25)と(26~50)をオアしたデータを格納します。 下記は自分の作ったプログラムですが、うまくいきません。 char Sanjigen[2][5][5]; char Nijigen1[5][5]; char Nijigen2[5][5]; void get_data( void ) { char i; for( i=0; i<8; ++i ){ Nijigen1[i] = Sanjigen[0][i] & Sanjigen[1][i]; Nijigen2[i] = Sanjigen[0][i] ^ Sanjigen[1][i]; } } 説明わかりにくくて申し訳ありません。 宜しくお願い致します。

  • MFCのCArrayを使った二次元配列

    CSVファイルの内容をCArrayを使って二次元配列に 格納する処理を作っています。 CSVファイルの内容は A1,B1,C1 A2,B2,C2,D2 A3,B3 : のように、縦横のレコード数が決まっていません。 なので、CArrayのAddで動的に配列を拡張できたら 楽だと思い挑戦しているのですが、分かりません。 また、CArrayで作られた配列はdeleteしなくては いけないのですか? どなたかご教授お願いします。