- ベストアンサー
Access2010で範囲内の値をリスト化する方法
- Access2010で範囲内の値をリスト化する方法について教えてください。
- 現在、範囲値のアタマとオワリがリスト化されたテーブルがありますが、そのアタマとオワリまでの数値を一覧化したいです。リストではなく単体であればできますが、リスト化する方法がわかりません。
- 具体的なイメージとしては、例えば年齢の始まりと終わりのフィールドがあり、それに対応する獲得ポイントを一覧化したいです。15歳から30歳までの獲得ポイント、31歳から35歳までの獲得ポイント...といったように表示したいです。どのように設定すればよいでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
一応、すべてのデータを一覧にするようにします。 クエリでは無理なのでテーブルを一つ作成します。 テーブル名は「テーブル一覧」とします。 また、データのあるテーブルを「テーブル1」としておきます。 「テーブル一覧」の構造は以下です。フィールドはすべて 数値型としておきます。 テーブル一覧 ID 数値型 年齢 数値型 獲得ポイント 数値型 以下のコードを標準モジュールに貼り付け、実行すれば 「テーブル一覧」にデータが一覧表示されます。 なお、DAOを使用しているの参照設定でDAOの参照設定を 確認しておいてください。 Sub test() Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set db = CurrentDb Set rs1 = db.OpenRecordset("テーブル1") Set rs2 = db.OpenRecordset("テーブル一覧", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!年齢_始 = rs1!年齢_終 Then rs2.AddNew rs2!ID = rs1!ID rs2!年齢 = rs1!年齢_始 rs2!獲得ポイント = rs1!獲得ポイント rs2.Update End If If rs1!年齢_始 < rs1!年齢_終 Then For i = rs1!年齢_始 To rs1!年齢_終 Step 1 s2.AddNew rs2!ID = rs1!ID rs2!年齢 = i rs2!獲得ポイント = rs1!獲得ポイント rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub ところで、補足の中の 16|150 17|150 18|150・・・・29|150 30|150 31|180・・・・ の、 18|150・・・・29|150 のところは、 18|150 19|150 ・ ・ 28|150 29|150 ということなのでしょうか。 あるいは、 18|150|19|150|20|150|・・・・|29|150 ということなのでしょうか。もしそうならばそのように なるデータ上の法則が必要になりますが。 データの表記が端折ってあったり、付け加えてあったりで つかみにくいので、現在の回答は上記のようにしておきます。 なお、コードにおいて、年齢_始 と年齢_終が同じである場合 も含めておきます。 また、 ID|年齢_始|年齢_終|獲得ポイント 1|15|30|150 2|31|35|180 3|36|50|200 4|51|60|350 というテーブルにおいて、もし、 ID|年齢_始|年齢_終|獲得ポイント 1|15|30|150 2|31|35|180 3|36|50|200 4|51|60|350 5|70|78|500 のようにIDが4と5のレコード間で データが飛んでいますがこのような データが存在した場合は一覧には 年齢が61から69までのデータは 存在しません。 一応、年齢がどこから始まってもいいように コードが書かれています。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17070)
#3です。 よりアクセス利用らしく、テーブルAに 数値(フィールド名)以下は、質問例では年齢数字らしい。 15 16 17 18 19 20 21 22 23 24 25 26 27 ・・ 60までの年齢?を作る。 ーー テーブルBとして 区間初値 区間終値 該当値 15 30 150 31 35 180 36 50 200 51 60 350 の区間表を作る。 ーー SQLで、SQL文の部分は strSQL = " SELECT A.数値,B.該当値 FROM [Sheet1$A1:A47] as A ,[Sheet2$A1:C5] as B WHERE A.数値 >= B.区間初値 AND A.数値<=B.区間終値" 小生は、エクセルVBAでADOでやったので、アクセスのクエリ画面やアクセスのテーブル名を用いたSQL文に修正してください。 実行結果 15 150 16 150 17 150 18 150 ・・・ 29 150 30 150 31 180 32 180 33 180 ・・ 48 200 49 200 50 200 51 350 52 350 53 350 ・・
補足
なるほど・・・ わざわざ文字列にしてくださったんですね? ご教示、ありがとうございます。 ただ・・・ 当方としては、「|」を(エクセルでいう)別セルの区切りとして使いました。 なので、エクセルで例えるなら A列に年齢・B列に獲得ポイント ※IDが入るなら、1列ズレますが。 リストのイメージとしては伝わったと感じていますが、 配列としては、 「15150」の場合は「15」と「150」は同じ行の別セル(アクセスだと別フィールド)に・・・ というイメージです。 説明が伝わりくかったようで すみません。 このイメージでも 処理は可能でしょうか? 何度もご面倒で申し訳ありませんが、よろしくお願い致します。
- imogasi
- ベストアンサー率27% (4737/17070)
>リスト化されたテーブルがあります とは俗語的表現ではないのか。よくわからない。全般に推測して、やるが。 エクセルでは術語化され決まった意味があるが、Accessにも使うのかな。 ーー (質問者にとっても昔懐かしかと思うが)エクセルでやってみた。ここの質問者はエクセル関数好きが多いので、思い立った。 ーー 現状のテーブルは 質問データをコピー貼り付けして、操作の「データー区切り位置」でセルに分離 E1:H5 1 15 30 150 2 31 35 180 3 36 50 200 4 51 60 350 又はAccessテーブルから、エクセルに持ってくる(インポート)。 ーー A2:A47に連続整数を作る。連蔵数の作成操作やオートフィル操作。 B2にエクセル関数 =VLOOKUP(A2,$F$2:$H$5,3,TRUE) を入れる 第4引数はFALSEがよく使われるが、本件はTRUE型。F2の列は昇順の表」でsること。 式を下方向に複写する。 Accessのテーブルに戻すのもたやすいのはご存じの通り。
- piroin654
- ベストアンサー率75% (692/917)
No1です。 追加ですが、年齢の低いほうから並べるならば、 SELECT テーブル名.ID, テーブル名.年齢_始 AS 年齢, テーブル名.獲得ポイント FROM テーブル名 UNION SELECT テーブル名.ID, テーブル名.年齢_終 AS 年齢, テーブル名.獲得ポイント FROM テーブル名 ORDER BY 年齢; 年齢の高いほうから並べるならば、 SELECT テーブル名.ID, テーブル名.年齢_始 AS 年齢, テーブル名.獲得ポイント FROM テーブル名 UNION SELECT テーブル名.ID, テーブル名.年齢_終 AS 年齢, テーブル名.獲得ポイント FROM テーブル名 ORDER BY 年齢 DESC; とします。 なお、ユニオンクエリはSQL文で保存しますので、新規のクエリをSQLビューで 開き、そこに上記のようなSQL文を書いて保存します。
- piroin654
- ベストアンサー率75% (692/917)
IDも含めていますが、クエリで取得するならばユニオンクエリで。 テーブル名は実際に合わせて変更してください。 SELECT テーブル名.ID, テーブル名.年齢_始 AS 年齢, テーブル名.獲得ポイント FROM テーブル名 UNION SELECT テーブル名.ID, テーブル名.年齢_終 AS 年齢, テーブル名.獲得ポイント FROM テーブル名; これをこのままテーブル作成クエリに利用するとテーブルが作成します・ 上記のクエリをクエリ1とし、新しいテーブル名はそのまま新しいテーブル名 にしておきますが必要なら変更してください。、テーブル作成クエリは、 SELECT クエリ1.ID, クエリ1.年齢, クエリ1.獲得ポイント INTO 新しいテーブル名 FROM クエリ1; です。
補足
せっかくご教示いただいたのに、当方がうまく説明できていなかったようで、追加質問のようになってしまって申し訳ありませんが・・ 年齢_始~年齢_終 の「間」の(明記されていない)年齢も入れた状態の一覧を作りたいと考えています。 例えば、 15歳~30歳が150ポイントなので 15|150 16|150 17|150 18|150・・・・29|150 30|150 31|180・・・・ といったカタチです。 このようなイメージで 一覧化することは可能でしょうか。 お手数おかけしますが、よろしくお願い致します。
お礼
思った動きになりました! クエリ等の基本仕様では対応できないとのことで、とても勉強になりました。また、予測までしてご教示いただき、とても助かりました。 ありがとうございました!