- ベストアンサー
データ処理に関する質問(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での書く方 教えてください。宜しくお願い足します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> すこし説明のほうお願いできますか。 > 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の値をとります。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
バッチ処理ならDAOでテーブル1を読んで、テーブル2のフィールドに書き、フィールドのインデックス番号をどんどん進めれば仕舞いではないか(レコードは進めない)。どの点を聞いているのか。WEBのコード例でも(途中まででも)やってみたのか。丸投げ的質問。 フィールドを都度増やす、CreateFieldは http://www.accessclub.jp/bbs2/0077/beginter24062.html を参照。 ーーー データを横に(フィールドを増やして)記録していくなんて、アクセスでは(エクセルでもそうだが特にアクセスは)非常識だ思うよ。 どれくらい量が有るかに拠るが。 ーー コンピュタ処理の設計思想は、初心者の間は十分気をつけること。 そうする理由が薄弱だったり、とりあえず思い付いたのでそれでやる、が多くなる。後の処理でまた困ることが多い。 この質問も全貌(その後のテーブル2の使い道、役立て方など)を質問に書かず、「やりたいのだ」「その路線でのやり方を教えてくれればよい」と言う風に感じる。 ーー それにイベント(バッチ処理の反対)処理の臭いがするが(テーブルにデータが追加されると質問のテーブル2に増やしていく)それは初心者が出来ることではないと思うが。 私見なので諸賢のご批判を乞う。
お礼
勉強の方向性と質問の仕方についてアドバイスしてくださって、ありがとうございます。 実際の業務にこういう例がたまたまあるようです。量的に何万件かぐらいだそうです。 後処理のことの話でましたが、貴重なアドバイスとして受け止めます。前回質問をしたとき、順番に意識していないことから初心者の証拠など、厳しい意見を書いた人もいました。
- 30246kiku
- ベストアンサー率73% (370/504)
> [店名]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 とか、得たい順を)
補足
早速テストしてみたら、結果はぴったりでした。 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)
う~ん?べたですが・・・ クエリで 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; な、感じ・・・これを追加クエリで挙動させるとか? 表示上の話だけなら、レポートのレイアウトの行列設定を使用するのですが・・・
お礼
ありがとうございます。これも大変勉強になりました。
お礼
ありがとうございます。大変勉強になりました。後の修正についても説明があって、大変うれしいです。 順番意識、後処理に意識する。これもこの間質問していく中で得た貴重なアドバイスだと思っています。