• ベストアンサー

データ処理に関する質問(Access VBAーDAO)

 AccessVBA初心者です。いつもお世話なっております。 環境 OSーXPsp2 office2003 テーブル1とテーブル2あって、テーブル1にデータはいってます。テーブル2は空です。 ACCESS VBA DAOで テーブル1のデータの[店名]、[氏名]を テーブル2に横に追加していきたいです。 テーブル2 構造 ID(オートナンバー)  [店名]1 [氏名]1 [店名]2 [氏名]2  --------------------------------------------------------- テーブル1のデータ ID(オートナンバー)  [店名] [氏名]   1           A    Aさん   2           B     Bさん    3           C     Cさん    4    D       Dさん ----------------------------------------------------- 結果 テーブル2 ID(オートナンバー)  [店名]1 [氏名]1 [店名]2 [氏名]2  1            A   Aさん   B   Bさん 2            C   Cさん   D   Dさん ACCESS VBAでの書く方 教えてください。宜しくお願い足します。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

> すこし説明のほうお願いできますか。 >    If (iFlg = 0) Then >      rsTo.AddNew >      rsTo("店名1") = rsFrom("店名") >      rsTo("氏名1") = rsFrom("氏名") >    Else >      rsTo("店名2") = rsFrom("店名") >      rsTo("氏名2") = rsFrom("氏名") >    End If >    iFlg = 1 - iFlg >    If (iFlg = 0) Then >      rsTo.Update >    End If >    rsFrom.MoveNext >  Wend >  If (iFlg <> 0) Then >    rsTo.Update >  End If では、拙い説明になりますが上記部分について以下に。 iFlg は、0か1を取るようにしています。 iFlg = 1 - iFlg  これで、0、1を反転させています。 0の場合、rsTo.AddNew 処理し、iFlg を1に 1の場合、既に rsTo.AddNew しているので、代入だけし、iFlg を0に 代入処理(前半のIF)後、iFlg が0の場合、2つの処理が終わっているので rsTo 側を確定(Update) While を抜けた後、iFlg が0でなければ、奇数レコードを処理して確定していない状態なので Update ※ この書き方にしていると、後の修正が楽です(私にとっては) 例えば、店名3, 氏名3 をテーブル2に追加して3組の列にしたいとなった場合、 >    If (iFlg = 0) Then >      rsTo.AddNew >      rsTo("店名1") = rsFrom("店名") >      rsTo("氏名1") = rsFrom("氏名") >    Else >      rsTo("店名2") = rsFrom("店名") >      rsTo("氏名2") = rsFrom("氏名") >    End If >    iFlg = 1 - iFlg ↓以下の変更で対処できます(★部分変更) >    If (iFlg = 0) Then >      rsTo.AddNew >      rsTo("店名1") = rsFrom("店名") >      rsTo("氏名1") = rsFrom("氏名")     Else If (iFlg = 1 ) Then ' ★ >      rsTo("店名2") = rsFrom("店名") >      rsTo("氏名2") = rsFrom("氏名") >    Else       rsTo("店名3") = rsFrom("店名") ' ★       rsTo("氏名3") = rsFrom("氏名") ' ★ >    End If     iFlg = (iFlg + 1) Mod 3 ' ★ この場合 iFlg は、0,1,2の値をとります。

sky070
質問者

お礼

 ありがとうございます。大変勉強になりました。後の修正についても説明があって、大変うれしいです。  順番意識、後処理に意識する。これもこの間質問していく中で得た貴重なアドバイスだと思っています。  

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

バッチ処理ならDAOでテーブル1を読んで、テーブル2のフィールドに書き、フィールドのインデックス番号をどんどん進めれば仕舞いではないか(レコードは進めない)。どの点を聞いているのか。WEBのコード例でも(途中まででも)やってみたのか。丸投げ的質問。 フィールドを都度増やす、CreateFieldは http://www.accessclub.jp/bbs2/0077/beginter24062.html を参照。 ーーー データを横に(フィールドを増やして)記録していくなんて、アクセスでは(エクセルでもそうだが特にアクセスは)非常識だ思うよ。 どれくらい量が有るかに拠るが。 ーー コンピュタ処理の設計思想は、初心者の間は十分気をつけること。 そうする理由が薄弱だったり、とりあえず思い付いたのでそれでやる、が多くなる。後の処理でまた困ることが多い。 この質問も全貌(その後のテーブル2の使い道、役立て方など)を質問に書かず、「やりたいのだ」「その路線でのやり方を教えてくれればよい」と言う風に感じる。 ーー それにイベント(バッチ処理の反対)処理の臭いがするが(テーブルにデータが追加されると質問のテーブル2に増やしていく)それは初心者が出来ることではないと思うが。 私見なので諸賢のご批判を乞う。

sky070
質問者

お礼

 勉強の方向性と質問の仕方についてアドバイスしてくださって、ありがとうございます。  実際の業務にこういう例がたまたまあるようです。量的に何万件かぐらいだそうです。  後処理のことの話でましたが、貴重なアドバイスとして受け止めます。前回質問をしたとき、順番に意識していないことから初心者の証拠など、厳しい意見を書いた人もいました。   

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> [店名]1 [氏名]1 ・・・ は [店名1] [氏名1] ・・・ ということで DAOは不慣れなので、参考程度で。 Private Sub Sample1()   Dim rsFrom As DAO.Recordset   Dim rsTo As DAO.Recordset   Dim iFlg As Integer   iFlg = 0   Set rsFrom = CurrentDb.OpenRecordset("SELECT * FROM テーブル1") '★   Set rsTo = CurrentDb.OpenRecordset("SELECT * FROM テーブル2")   While (Not rsFrom.EOF)     If (iFlg = 0) Then       rsTo.AddNew       rsTo("店名1") = rsFrom("店名")       rsTo("氏名1") = rsFrom("氏名")     Else       rsTo("店名2") = rsFrom("店名")       rsTo("氏名2") = rsFrom("氏名")     End If     iFlg = 1 - iFlg     If (iFlg = 0) Then       rsTo.Update     End If     rsFrom.MoveNext   Wend   If (iFlg <> 0) Then     rsTo.Update   End If   rsFrom.Close   rsTo.Close   Set rsFrom = Nothing   Set rsTo = Nothing End Sub ※ ★でレコード順を追加指定してください。  ( 最後に ORDER BY ID とか、得たい順を)

sky070
質問者

補足

早速テストしてみたら、結果はぴったりでした。 If (iFlg = 0) Then と iFlg = 1 - iFlg     If (iFlg = 0) Then       rsTo.Update     End If     rsFrom.MoveNext   Wend   If (iFlg <> 0) Then     rsTo.Update   End If この部分どうしでも解読できません。どうしても、知りたいので、 すこし説明のほうお願いできますか。動いたわけを。。。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

う~ん?べたですが・・・ クエリで SELECT DLookUp("店名","テーブル1","ID = " & [NewID]*2-1) AS 店舗1, DLookUp("氏名","テーブル1","ID = " & [NewID]*2-1) AS 氏名1, DLookUp("店名","テーブル1","ID = " & [NewID]*2+0) AS 店舗2, DLookUp("氏名","テーブル1","ID = " & [NewID]*2+0) AS 氏名2 FROM (SELECT Int(([id]+1)/2) AS NewID FROM テーブル1 GROUP BY Int(([id]+1)/2)) AS UsTable; な、感じ・・・これを追加クエリで挙動させるとか? 表示上の話だけなら、レポートのレイアウトの行列設定を使用するのですが・・・

sky070
質問者

お礼

ありがとうございます。これも大変勉強になりました。

関連するQ&A

専門家に質問してみよう