Access VBA質問箱 IV

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

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


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

【3429】リストボックスの値取得 saikoro 04/9/7(火) 8:51 質問[未読]
【3430】Re:リストボックスの値取得 Gin_II 04/9/7(火) 9:23 回答[未読]
【3431】Re:リストボックスの値取得 saikoro 04/9/7(火) 9:51 発言[未読]
【3432】Re:リストボックスの値取得 こもれび 04/9/7(火) 10:08 回答[未読]
【3433】Re:リストボックスの値取得 Gin_II 04/9/7(火) 10:14 回答[未読]
【3434】Re:リストボックスの値取得 こもれび 04/9/7(火) 10:44 回答[未読]
【3440】Re:リストボックスの値取得 saikoro 04/9/7(火) 13:04 質問[未読]
【3441】Re:リストボックスの値取得 こもれび 04/9/7(火) 15:04 回答[未読]
【3442】Re:リストボックスの値取得 saikoro 04/9/7(火) 15:57 お礼[未読]

【3429】リストボックスの値取得
質問  saikoro  - 04/9/7(火) 8:51 -

引用なし
パスワード
   リストボックスに列が3で、行は増やしていく(データを増やすと増えるので)というqryを
表示させています。

このリストボックスに表示されているデータを一つづつ、格納して、
値を取って置きたいのですが、その仕方がわかりません。

qryTabemono

番号    種類    名称
1    果物    バナナ
2    果物    ぶどう
3    野菜    白菜
4    野菜    キャベツ


以下10個位までデータがあれば、データを保存しておきたいのですが、
どのようにすればよろしいですか?

こうすれば最後の行だけは、とれるのですが。。。
あたりまえですが・・・

Dim Bangou as Integer
Dim Syurui as String
Dim Meisyou as String

Dim db As DAO.Database
Dim qry As DAO.Recordset
  
'DBセット
Set db = CurrentDb
Set qry = db.OpenRecordset("qryTabemono", dbOpenDynaset)
  
If qry.EOF = True Then
  MsgBox ("データがありません")
  Exit Sub
End If
  
Do While qry.EOF = False
    
  Bangou = qry.Fields(0) '番号
  Syurui = qry.Fields(1) '種類
  Meisyou = qry.Fields(2) '名称

  qry.MoveNext
    
Loop

全データを格納しておきたいのですが、
どのようにすればよろしいですか?
初歩的ですが、よろしくおねがいします。

【3430】Re:リストボックスの値取得
回答  Gin_II  - 04/9/7(火) 9:23 -

引用なし
パスワード
   >全データを格納しておきたいのですが、
>どのようにすればよろしいですか?

どこに格納しておきたいのでしょうか?
追加クエリなり、テーブル作成クエリなりを作成して実行すればいいと思いますが。。

【3431】Re:リストボックスの値取得
発言  saikoro  - 04/9/7(火) 9:51 -

引用なし
パスワード
   Gin_II 様 返信ありがとうございます。

>>全データを格納しておきたいのですが、
>>どのようにすればよろしいですか?
>
>どこに格納しておきたいのでしょうか?
>追加クエリなり、テーブル作成クエリなりを作成して実行すればいいと思いますが。。

格納場所を指定していませんでした。。申し訳ありません。

最終的には、テーブルに追加させようと思っているのですが、
一時的に、変数で格納しておく場合どのようにすればよろしいでしょうか?

自分がやった奴だと、最後の一行しかとれないのですが。
数が定かでないので、どのように格納しておけば、よろしいですか?

【3432】Re:リストボックスの値取得
回答  こもれび  - 04/9/7(火) 10:08 -

引用なし
パスワード
   こもれびです こんにちは

テーブルに格納する方法を記述します。( テーブル名:T_TABEMONO )

○ 追加
  Dim tb as Recordset

  Set tb = db.OpenRecordset("T_TABEMONO",dbOpenDynaset,dbAppendOnly)

○ 変更

Do While qry.EOF = False
 tb.AddNew
  tb![番号] = qry.Fields(0) '番号
  tb![種類] = qry.Fields(1) '種類
  tb![名称] = qry.Fields(2) '名称
 tb.Update
 qry.MoveNext
Loop
tb.Close

【3433】Re:リストボックスの値取得
回答  Gin_II  - 04/9/7(火) 10:14 -

引用なし
パスワード
   >最終的には、テーブルに追加させようと思っているのですが、
>一時的に、変数で格納しておく場合どのようにすればよろしいでしょうか?
>
>自分がやった奴だと、最後の一行しかとれないのですが。
>数が定かでないので、どのように格納しておけば、よろしいですか?

配列に、1データずつ格納していってもいいですが、元がレコードセットなら、
GetRows メソッド
を使ってもいいかな。

ヘルプで、上記メソッドを確認してください。

【3434】Re:リストボックスの値取得
回答  こもれび  - 04/9/7(火) 10:44 -

引用なし
パスワード
   こもれびです

その2
変数に代入

○ 追加
  Dim TabemonoArray() as String
  Dim RC as Integer
  Dim K as Integer

> Set qry = db.OpenRecordset("qryTabemono", dbOpenDynaset)
  
> If qry.EOF = True Then
>  MsgBox ("データがありません")
>  Exit Sub
> End If

の後に
  RC = qry.RecordCount-1
  K = RC
  Redim TabemonoArray(2,RC)

○ 変更

Do While qry.EOF = False
    
  TabemonoArray(0,RC-K) = qry.Fields(0) '番号
  TabemonoArray(1,RC-K) = qry.Fields(1) '種類
  TabemonoArray(2,RC-K) = qry.Fields(2) '名称
  K = K - 1
  qry.MoveNext
    
Loop

これで何とかなるかな〜。

【3440】Re:リストボックスの値取得
質問  saikoro  - 04/9/7(火) 13:04 -

引用なし
パスワード
   Gin_II様、こもれび様 返信ありがとうございます。
お二方とも以前にもお世話になり、その節はありがとうございます。

○Gin_II様

>配列に、1データずつ格納していってもいいですが、元がレコードセットなら、
>GetRows メソッド
>を使ってもいいかな。

なるほど!Recordset オブジェクトの複数のレコードを配列に取り込んでくれて、
戻り値にバリアント型 (Variant) の二次元配列の値を返してくれるんですね。
これを、使うと実現できそうです。勉強しておきます。

○こもれび様

変数に代入の件で、指定して下さったソースを差し込んだ所、
インデックスが有効範囲にありません、エラーが出ました;;

それで、列が3、行が3のクエリで動かしたですが、
この部分RC = qry.RecordCount-1が”0”になっています;;
qry.RecordCountが”1”なのです;;
なので、行が1のデータ(最初のデータですが)は、きちんと配列に
入っているようなのですが、行が2に移ったところで、
インデックスが有効範囲にありません、というエラーがでてきます。

なにか、違うところでエラーがでてるっぽいですが、対処方法など
ありましたら助言おねがいします。

【3441】Re:リストボックスの値取得
回答  こもれび  - 04/9/7(火) 15:04 -

引用なし
パスワード
   こもれびです

ごめんなさい 1行漏れていました

  qry.MoveLast      ' <-- 漏れた行
  RC = qry.RecordCount-1

お手数おかけして申し訳ありません <m(__)m>

【3442】Re:リストボックスの値取得
お礼  saikoro  - 04/9/7(火) 15:57 -

引用なし
パスワード
   こもれび様 返信ありがとうございます。

あ、やはり最後から格納していってるんですね。
と、いうことは、
抜けている一行とやらを追加して、
qry.EOF→qry.BOF、
qry.MoveNext→qry.MovePrevious
として格納できました。以下にそのソースを・・
ソース何かへんですかね?^^;
お二方ありがとうございました!m(_ _)m


Dim TabemonoArray() As String
Dim RC As Integer
Dim K As Integer

Dim db As DAO.Database
Dim qry As DAO.Recordset

'DBセット, dbOpenDynaset
Set db = CurrentDb
Set qry = db.OpenRecordset("qryメモリ表示", dbOpenDynaset)

If qry.EOF = True Then
   MsgBox ("メモリが表示されていません")
   Exit Sub
End If

qry.MoveLast

RC = qry.RecordCount - 1
K = RC
ReDim TabemonoArray(2, RC)

Do While qry.BOF = False

   TabemonoArray(0, RC - K) = qry.Fields(0) '番号
     Debug.Print TabemonoArray(0, RC - K) 'デバッグ用
   TabemonoArray(1, RC - K) = qry.Fields(1) '種類
     Debug.Print TabemonoArray(1, RC - K) 'デバッグ用
   TabemonoArray(2, RC - K) = qry.Fields(2) '名称
     Debug.Print TabemonoArray(2, RC - K) 'デバッグ用
  
   K = K - 1
qry.MovePrevious

Loop

db.Close

追伸で、こもれび様以前にファイルが大きくなっていくのですが・・という
題名でスレ立てたとき、返信に気づかなくて申し訳ありません。気づいた時には
もう流れまくっていたので。。。この場で謝罪を。確かにおっしゃってる通りです。
以降気をつけます。ありがとうございましたm(_ _)m・・・な、長くなった^^;

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