• ベストアンサー
  • すぐに回答を!

データ処理に関する質問(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
  • 閲覧数285
  • ありがとう数4

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

  • ベストアンサー
  • 回答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の値をとります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • Accessコピーについて(お願いします)

    AccessVBA初心者です。  OS XP ACCESS2003 テーブル1とテーブル2 データ構造が同じです。 テーブル2はデータ空です。 テーブル1 ----------------ーー ID  氏名    回数 1  Aさん    2 2  Bさん    3 ----------------ーーーー テーブル1のデータをテーブル2に回数分コピーしたいですが、VBA書き方どうしてもうまくいかないです。SQL文使用しない。 ほしい結果 テーブル2 ----------------ーー ID  氏名    回数 1  Aさん    2 2  Aさん    2 3  Bさん    3 4  Bさん    3 5   Bさん    3 ----------------ーーーー 教えてください。

  • Access2003 オートナンバーの現在値取得方法

    Access2003 オートナンバーの現在値取得方法 Access2003 VBAでDAO.DBEngineオブジェクトを使用して テーブル定義の取得を行っています。 オートナンバー型のシーケンスの現在値を取得する方法はないでしょうか? MAX関数で最大値を取得する方法は不可です。

  • Access連番(VBA)についてアドバイスください。

     環境OSーXP ACCESS2003 ID(オートナンバー)  社名  連番 1           A社 2           A社 3           A社 4           B社 5           B社 6           C社 7           C社 求める結果(VBAーCMDボタンでイベント) ID(オートナンバー)  社名  連番 1           A社   1 2           A社   1 3           A社   1 4           B社   2 5           B社   2 6           C社   3 7           C社   3 Accessculbなどで検索しましたが、グループごとに連番振り方の教程ありますが、↑のような教程まだ見つからないです。 VBA勉強して、まだ浅いので、ぜひ教えてください。 考え方を教えてください。

その他の回答 (3)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答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 とか、得たい順を)

共感・感謝の気持ちを伝えよう!

質問者からの補足

早速テストしてみたら、結果はぴったりでした。 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 この部分どうしでも解読できません。どうしても、知りたいので、 すこし説明のほうお願いできますか。動いたわけを。。。

  • 回答No.1
  • 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; な、感じ・・・これを追加クエリで挙動させるとか? 表示上の話だけなら、レポートのレイアウトの行列設定を使用するのですが・・・

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • ACCESS2003 VBAよりVB.NETを使った方がいい?

    ACCESS2003 VBAよりVB.NETを使った方がいい? プログラマーでもないのですが、仕事でAccess2003でVBAを書いています。フォームにテーブルから引っ張てきたデータを表示させてデータを閲覧したり、データを加工してExcelにデータを吐き出したりしています。テーブルには10万件程度のデータがあります。 特に私は便利に使っているのですが、上司がVB.netとMYSQLでプログラム書いた方が楽じゃない?VB.NETよかったら買ってあげるよと言われました。買ってくれるのは嬉しいのですが、.netなんてやったこともないですし、DAOしか使ったことがなくADOなんて全くわかりません。 何かACCESS VBAよりVB.net+MYSQLのメリットって何かありますでしょうか?ちなみに業務で使うためのものなので、家からアクセスして何かするというのは考えていません。あくまで社内で使う時にメリットはあるでしょうか?

  • DAOでテーブルを作成

    DAOでテーブルを作成したいのですが 主キーにしてオートナンバー型にするにはどうすればいいですか? Sub MyTableCreate() Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim Field1 As DAO.Field Dim Field2 As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("T_test") Set Field1 = tbdef.CreateField("ID", dbInteger) Set Field2 = tbdef.CreateField("氏名", dbText, 20) tbdef.Fields.Append Field1 tbdef.Fields.Append Field2 db.TableDefs.Append tbdef db.Close: Set db = Nothing End Sub これで、IDフィールドを主キーにしつつ、 dbIntegerではなくオートナンバー型にしつつ、 主キーを付与する方法を教えてください。 DAOのType プロパティのヘルプを見たのですがありませんでした。 今回は http://www.accessclub.jp/dao/20.html を参考にしました。

  • Accessのテーブルへのデータインポートについて

    Accessのテーブルへのデータインポートについて Access2002で、A.mdbのTESTテーブルからB.mdbのTESTテーブル(構造は同じ)へテーブルデータをインポートしたいのです。 TESTテーブルの主キーはSEQ(オートナンバー)しかありません。 そのときに、コピー元とコピー先の主キーに重複があった場合、オートナンバーなので自動で再付番しデータが追加して欲しかったのですが、 Accessの機能のエクスポート、インポートでは、コピー先に主キーに重複があったデータは上書きされてしまいます。 テーブルを開き、データをコピー&ペーストしますと、ペーストしたときにオートナンバーで自動で再付番されます。 この方法でもいいのですが、データが数百万件あるので、現実的ではありません。 Accessのインポート・エクスポートで、オートナンバーで主キーを再付番してから、B.mdbのTESTテーブルにデータ追加する方法はないでしょうか? よろしくお願いいたします。

  • AccessVBAでADOとDAOとDoCmd

    いつもお世話になっています。access超初心者です。 いろいろまちがっているかもしれませんが、よろしくお願いします。 フォームやクエリを使うのにDoCmd、検索はSQL文、 テーブルとの接続やデータの追加はDAOですが、 Access以外のデータベースの値も必要なのでADOも使用して・・・と考えています。 たとえば、データがあるかを確認するにはフォームを開き、そこのテキストボックスに探すデータを入力、ボタンをクリックすると DoCmdで表示用フォームを用意、SQL文で検索、DAOで検索結果を表示・・・としていますが、このように一つのデータベースを作成するのに、DoCmdやDAOやADOの使用が入り乱れてもよいのでしょうか? まったく知識がなく学習本を頼りにしていますので、ツギハギだらけになってしまっているのでは?と不安です。 アドバイスのほど、よろしくおねがいいたします。

  • Access VBAで自動連番を振るには

    【テーブル名】T_株券管理 【フォーム名】F_株主入力 【フィールド名】株主ID(テキスト型)(主キー) フォームに入力する際にオートナンバーを使用せずに、 レコードが切り替わると「株主ID」が「00001」「00002」「00003」・・・・というように1づつ発番されるようにしたく、AccessVBAの本を読んだり、ネットでDmax等調べているのですが、必要な情報が探せずに困っています。 本当はオートナンバーでIDを振っても良いのですが、レコードの削除等行った時に歯抜けになってしまうので、うる覚えで申し訳ないのですが・・・確か、フォームのテキストボックスのプロパティ、コードビルダでVBを「レコードが移動した際に」→「株主IDが0の場合に”00001”を、0でない場合には既存の数値に+1した数値をテーブルT_株券管理の”株主ID”に入力する。」といった感じの記述がしてあったと思います。VB初心者なので、説明が上手くできずにすみません。 このような記述方法はありますでしょうか?

  • access IDの振り直しについて

    皆さん、明けましておめでとうございます。今年もいろいろとお世話になりますm(_ _)m さて、accessに挑戦しているところですが、データをいろいろいじくっているうちに、オートナンバー型のIDが不整列となってしまいました。そこで、いったん「デザイン」からIDを削除し、再び「行の挿入」でIDを作成したところ、今度はまたIDが別の形で(飛び番=例えば、100の次に1000が来て、1100の次に101が来るというような)不整列となりました。 テーブルのフィールドには「No」というのを設けてあり、これはデータのレコード番号なのですが、それとIDが一致するようにするつもりでした。 このような場合、IDの「振り直し」はどのようにやれば出来るのでしょうか? もう一つお尋ねです。最終「No」とレコード数は一致するはずなのですが、レコードが1個足りません。このような場合、何番のレコード(No)が抜けているのか知るには、どのようにすればよろしいでしょうか? access初心者ですので、いろんなところでつまづいてしまいます。どうかご教示のほどよろしくお願いしますm(_ _)m xp+office2003です。

  • Accessでのエラー

    Access修行中の身で、勉強をかねて書類BOXのデータベースを作成中です。 親テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・・・、保存箱ID 子テーブルのフィールド  保存箱ID(主キー、オートナンバー)、保存箱名、・・・・ リレーション  親:保存箱ID-子:保存箱ID という構成です。 クエリで以下のような複合テーブルを作成し、 複合テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・、保存箱名、・・・・ データを入力しようとすると、「レコードを追加できません。テーブルの結合キーがレコードセットにありません。」というエラーがでます。また、保存箱IDに入力のないレコードは、抽出されません。 どのようにしたいかというと、保存箱IDは入力しなくてもいいフィールド(関連させなくてもよいデータ)にしたく、複合テーブルで保存箱名を入れると、子テーブルに新たにレコードが追加されるようにしたいです。 できれば、SQLを使用せずに解決したいと甘えておりますが、無理でしょうか。

  • Accessでの設定について

     データベースソフトAccessを用いて、以下の用件を設定するにはどのようにフォームを設定したら良いか教えて下さい。 例)社員テーブルが、社員マスターID(オートナンバー型)、管理番号(テキスト型)、氏名(テキスト型)、時給単価(通貨型)で作成されている場合。  管理番号を入力すると、データ(氏名や時給単価)を呼び出すことができるようなフォームを作成するには、どのように設定したらよいのでしょうか? 教えて下さい。

  • Accessでのテーブル作成や追加クエリなどについての質問です。

    ◆テーブル作成クエリで作成するテーブルにオートナンバー型のフィールドを設けたい。◆ (ナンバーが必ず1から振られることが条件) ※補足※ あらかじめオートナンバー型を含むテーブルを用意し、追加クエリ&削除クエリを使用すればよいという意見もありますが、この場合オートナンバー型のフィールドはカウントをアップし続けてしまう為断念。 ★教えてほしい事★ テーブル作成クエリからオートナンバー型のフィールドを作成できるのか? もしくは あらかじめオートナンバー型を含むテーブルを用意し削除クエリでテーブルのデータを空にしてから追加クエリでデータを入力しても必ずオートナンバー型のフィールドの先頭値は"1"から始まるようにできるか? 宜しくお願い致します。

  • 難問です。ACCESSでの・・

    ACCESSで、テーブルにデータを入力しましたが、 一番左の列にオートナンバーで、 1,2,3,4、5・・・・と打っています。 2列目の氏名で昇順にした場合、列ごと 同時に番号まで、移動してしまい、左の列の番号はばらばらになります。 氏名を昇順にした場合も、左の列の番号が動かないで 上から1,2,3,4と打たれるにはどうすればよいでしょうか? どなたかお願いいたします!!!