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での書く方
教えてください。宜しくお願い足します。

このQ&Aに関連する最新のQ&A

A 回答 (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の値をとります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/15 21:32

バッチ処理ならDAOでテーブル1を読んで、テーブル2のフィールドに書き、フィールドのインデックス番号をどんどん進めれば仕舞いではないか(レコードは進めない)。

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

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

お礼日時:2009/05/15 21:28

> [店名]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
この部分どうしでも解読できません。どうしても、知りたいので、
すこし説明のほうお願いできますか。動いたわけを。。。

補足日時:2009/05/15 18:06
    • good
    • 0

う~ん?べたですが・・・



クエリで

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;

な、感じ・・・これを追加クエリで挙動させるとか?
表示上の話だけなら、レポートのレイアウトの行列設定を使用するのですが・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/15 18:11

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング