Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


71 / 2272 ツリー ←次へ | 前へ→

【13120】数量が2つならレコードをコピー まき 16/12/1(木) 19:41 質問[未読]
【13121】Re:数量が2つならレコードをコピー hatena 16/12/3(土) 16:51 回答[未読]
【13122】Re:数量が2つならレコードをコピー まき 16/12/5(月) 8:19 発言[未読]
【13124】Re:数量が2つならレコードをコピー まき 16/12/5(月) 12:14 発言[未読]
【13126】Re:数量が2つならレコードをコピー hatena 16/12/6(火) 17:57 回答[未読]
【13130】Re:数量が2つならレコードをコピー まき 16/12/11(日) 22:15 お礼[未読]

【13120】数量が2つならレコードをコピー
質問  まき  - 16/12/1(木) 19:41 -

引用なし
パスワード
   こんばんは

いつもお世話になります

access DAOについて質問です

よろしくお願

テーブルAで数量が2だったら、同じレコードをコピーして同じテーブルに新しく追加するということをやりたくてコードを書きました所、

ループが終わりません

よく考えたらデータをどんどん追加するんだからいつまでたっても終わりませんよね(笑)

テーブルに追加する前の一番最初のレコード数分だけ終わったらループが終わるようにしたいんですが

どのようにすればよろしいでしょうか?


Public Function AutoNew()

Dim db As DAO.Database

Dim Data1, Data2, Data3, Data4, Data5, Data6, Data7

Set db = CurrentDb
Dim rs As DAO.Recordset

Set rs = db.OpenRecordset("テーブルA")

Do Until rs.EOF

rs.Edit


If rs!数量 > 1 Then


Data1 = rs!フィールド1

Data2 = rs!フィールド2

Data3 = rs!フィールド3

Data4 = rs!フィールド4

Data5 = rs!フィールド5

Data6 = rs!フィールド6


rs.AddNew


rs!フィールド1 = Data1

rs!フィールド2 = Data2

rs!フィールド3 = Data3

rs!フィールド4 = Data4

rs!フィールド5 = Data5

rs!フィールド6 = Data6


End If


rs.Update

rs.MoveNext

Loop

rs.Close

Set rs = Nothing

db.Close

Set db = Nothing

End Function

【13121】Re:数量が2つならレコードをコピー
回答  hatena  - 16/12/3(土) 16:51 -

引用なし
パスワード
   ▼まき さん:
>テーブルAで数量が2だったら、同じレコードをコピーして同じテーブルに新しく追加するということをやりたくてコードを書きました所、
>
>ループが終わりません
>
>よく考えたらデータをどんどん追加するんだからいつまでたっても終わりませんよね(笑)
>
>テーブルに追加する前の一番最初のレコード数分だけ終わったらループが終わるようにしたいんですが
>
>どのようにすればよろしいでしょうか?

やりたいことが分かりません。
もう少し分かるように書き直してください。
最終目的を書いたほうがいいかも。

下記のようなことがしたいのかな。

テーブルに下記のようなデータがある。

テーブル1

ID フィールド1 数量
1 データ1 2
2 データ2 3
3 データ3 1

それから、下記のような出力結果が欲しい。

ID フィールド1
1  データ1
1  データ1
2  データ2
2  データ2
2  データ2
3  データ3


最終目的
商品の数量分のラベルを印刷したい。

ちがうなら、上記のような感じで具体例を出して説明してもらうとやりたいことが伝わりやすいですね。
最終目的も書いてくださいね。

上記の場合なら、クエリだけで希望の結果を出すことができます。
(VBAでテーブルを書き換えちゃうと後々面倒ですからね。)

【13122】Re:数量が2つならレコードをコピー
発言  まき  - 16/12/5(月) 8:19 -

引用なし
パスワード
   hatena様

ご回答ありがとうございます

やりたいことはhatenaさまのおっしゃる通りです
数量分レコードをづくりたいです
最終目的はラベルと台帳です
商品1 3個なら

商品1 1
商品1 1
商品1 1

としたいです

クエリで出来るのですか?

【13124】Re:数量が2つならレコードをコピー
発言  まき  - 16/12/5(月) 12:14 -

引用なし
パスワード
   ▼hatena さま

書き忘れました
概ねhatena様のご回答通りのことがしたいのですが、一点追加がありまして、

テーブル1

ID フィールド1 数量
1 データ1 2
2 データ2 3
3 データ3 1

欲しい出力結果

ID フィールド1 数量
1  データ1    1
1  データ1   1
2  データ2    1
2  データ2   1
2  データ2   1
3  データ3   1

と言うように、数量を入れたいです
(数量はすはすべて1)
宜しくお願いします

【13126】Re:数量が2つならレコードをコピー
回答  hatena  - 16/12/6(火) 17:57 -

引用なし
パスワード
   商品数分のラベルを作成したいということなら、クエリでいいでしょう。
ただし、クエリだと更新できませんので、台帳として使用して、
他にもフィールドがあり入力する必用があるならテーブルにする必用がありますね。

その場合、現状のテーブル「テーブル1」自体を書き換えるという方法と、
別に台帳用のテーブルを用意してそこに追加していくという方法が考えられます。

使用方法によって最適な方法は変わってきますのでよく検討してみてください。

とりあえず、現状のテーブルを書き換える場合のコードを例示しておきます。


テーブル1
ID フィールド1 数量
1 データ1 2
2 データ2 3
3 データ3 1



ID フィールド1 数量
1  データ1    1
1  データ1   1
2  データ2    1
2  データ2   1
2  データ2   1
3  データ3   1

に変換Public Function AutoNew()

  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim rsA As DAO.Recordset
  Dim c As Long, i As Long

  Set db = CurrentDb
  Set rs = db.OpenRecordset("SELECT * FROM テーブル1 WHERE 数量>1;", dbOpenDynaset)
  Set rsA = db.OpenRecordset("テーブル1", dbOpenTable, dbAppendOnly) '追加のみ許可

  Do Until rs.EOF
    c = rs!数量 - 1
    rs.Edit
    rs!数量 = 1
    rs.Update
    For i = 1 To c
      rsA.AddNew
      rsA!ID = rs!ID
      rsA!フィールド1 = rs!フィールド1
      rsA!数量 = rs!数量
      rsA.Update
    Next
    rs.MoveNext
  Loop

  rs.Close: Set rs = Nothing
  rsA.Close: Set rsA = Nothing
  db.Close: Set db = Nothing

End Function

【13130】Re:数量が2つならレコードをコピー
お礼  まき  - 16/12/11(日) 22:15 -

引用なし
パスワード
   hatena様

お礼が遅くなってすみません
教えていただいたテーブルで書き換える方法で
できました

ありがとうございました!

71 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free