アクセスリストボックスから選択したデータを抽出条件にする方法

このQ&Aのポイント
  • アクセスリストボックスから選択したデータを抽出条件にする方法について説明します。
  • 質問者はアクセス超初心者で、フォーム上のリストボックスで選択した項目を条件にデータを抽出したいと考えています。
  • また、ランキングを作成し、新たに追加したテーブルからデータを抽出したいという要望もあります。
回答を見る
  • ベストアンサー

アクセス リストボックスから選択したデータを抽出条件にするには…

アクセス超初心者です。 フォーム上のリストボックスで選択した項目を条件にデータ抽出しています。 そこで、その抽出されたデータの中に商品コードがあるのですが、 その商品コードを条件にして他のデータを抽出したいと思っています。 (↓説明が長いですが、お願いします↓) 出来ていること フォームでコードを入力すると、商品名が表示されます。 同じくコードを条件にリストボックスにカテゴリ1表示され、 そのリストのいずれかをクリックすると、別のリストボックスにカテゴリ2が表示され、 そのいずれかをクリックすると詳細に必要情報が表示される。 http://accessclub.info/beginer/cd/part_07.htm ここを参考に作成しました。 したいこと ランキング作成。 今回新たにテーブルを追加しました。 リストボックス_カテゴリ2を条件に抽出されたデータにある商品コードを、 条件として、新たに追加したテーブル_ランキングからデータを抽出したい。 また、ランキングの上位順に並び替えした状態で抽出したい。 ------------------- 抽出結果はこのようにしたいです。 ランキング順位/商品コード/商品名/生産工場/カテゴリ1/カテゴリ2 ------------------- T_商品名 ID(主キー) 商品コード 商品名 生産工場 カテゴリID※T_カテゴリ_IDとリレーション ------------------- T_カテゴリ カテゴリ1 ・・・(大分類カテゴリ) カテゴリ2 ・・・(大分類の中の詳細分類) ID(主キー)※T_商品名_カテゴリIDとリレーション ------------------- (今回は新たに追加したテーブル) T_ランキング ランキング順位 商品コード 商品名 ポイント ID(主キー)(リレーション無し) ------------------- F_総合検索  ヘッダー部分   (1)コード入力欄(テキストボックス非連結)   (2)商品名(テキストボックス非連結)   (3)カテゴリ1(リストボックス)   (4)カテゴリ2(リストボックス)   (5)ボタン ------  詳細部分    商品コード/商品名/生産工場/カテゴリ1/カテゴリ2 ------------------- しくみ  I (1)にコードを入力する   →II (2)に商品名が表示/(同時に)(3)カテゴリ1が表示(そのいずれかをクリック)   →III その商品が属しているかつ、選択されたカテゴリ1に属す、カテゴリ2が(4)に表示   →IV(4)のクリックされたカテゴリを条件に、そのカテゴリに属すレコードが詳細に表示    ※(5)ボタンは詳細の表示と同じものを別途クエリを作成し、開くようにしています。     (今はまだランキングが出来ていないので、クエリをコピーしエクセルでランキングを作っています。) ---補足-------------------- もともとエクセルで管理していたデータをインポートしてテーブルを作成しています。 ------------------------------------------------------------ 【カテゴリシート】商品コード/商品名/生産工場/カテゴリ1/カテゴリ2 というシート(4500件くらい) ※商品コード重複あり 例: 商品コード 商品名 生産工場 カテゴリ1 カテゴリ2 0003 キャラクターペン 東京 玩具 対象小学生以上 0003 キャラクターペン 東京 文具 筆記用具 0003 キャラクターペン 東京 文具 消耗品 ※カテゴリ1 ・・・(大分類カテゴリ)/カテゴリ2 ・・・(大分類の中の詳細分類) ------------------------------------------------------------ 【ランキング2007シート】ランキング順位/商品コード/商品名/ポイント/調査日 というシート(4000件くらい) ※商品コード重複なし ※ランキングは廃盤の商品コード(100件くらい)もあり、その商品に関しては順位とポイントが空欄です。   (空欄セルがあるとエラーの原因になるかと思い、念のため補足。) ------------------------------------------------------------ ここから、ある商品はどのカテゴリに属しているか、また同カテゴリに含まれる商品はランキング内で何位にいるのか。 という情報を出すように、と仕事で依頼されます。(同類商品の中でどう評価されているのかを比較するため) いつもは、エクセルで作業シートを作っており、関数で呼び出しているのですが、 関数が複雑かつ多いせいか、計算時間が長く、効率が悪くなっています。 VBA、マクロ、SQLはわかりません。 そんな私でも学習していきたいと思っています。 よろしくお願いします。

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

  • ベストアンサー
noname#140971
noname#140971
回答No.9

補足:商品枝番!カテゴリ1等と分類名テーブルとの関連 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ カテゴリ1!表示コントロール=コンボボックス 値集合ソース=テーブル/クエリ 値集合ソース=SELECT 枝番大分類.ID, 枝番大分類.名称 FROM 枝番大分類 ORDER BY 枝番大分類.並び順; 連結列=1 列数=2 列幅=0cm;3cm Access では、枝番大分類!名称も名称で各テーブルが記憶することはしません。 あくまでも参照するに必要な索引のみを記憶します。 こうすることで、名称を登録ミスしても自由に訂正できる訳です。 こうすることで、顧客は名称をちと変更したいにも対応できる訳です。 [並び順]はクエリ等で参照した場合の並びを制御するためのもの。 通常は登録順で参照されますが、決して、これは保証の限りではありません。 01:大分類名01 02:大分類名02 と名称そのものが昇順に揃うようにして対応することも可能でしょう。 が、これはあくまでも顧客との話し合いの上で決めること。 私は、この方式を押し通しています。 まあ、「01、02で選択できるよ!」が説得文句です。

yellow-
質問者

補足

ありがとうございます! 番号で簡潔に管理、選択できるという利点ということでしょうか。 確かに分類が多かったりする場合は、目視でもNo.リストがあって、照らし合わせたりしますね。 効率的を第一にアドバイスしてくださって感謝です! 本当にありがとうございました!!

その他の回答 (8)

noname#140971
noname#140971
回答No.8

[商品コード]に応じて大分類[リスト0]を更新する。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 商品: テーブル [ID]_[商品コード]_[商品名___________]_[生産工場]_[ポイント]_[ランキング] __1___0003_________キャラクタキペン1__東京_______98.5________________1 __2___0004_________キャラクタキペン2__東京_______92.0________________3 商品枝番: テーブル [ID]_[商品_ID]_[枝番名_____________]_[カテゴリ1]_[カテゴリ2] __1_________1___キャラクタペン1_01___文具_________その他_1 __2_________1___キャラクタペン1_02___文具_________文具_2 __3_________2___キャラクタペン2_01___玩具_________玩具_1 __4_________2___キャラクタペン2_02___玩具_________玩具_2 __5_________1___キャラクタペン1_03___その他_______その他_1 枝番大分類: テーブル つまり、’キャラクタキペン1’が選ばれたら大分類は’文具’と’玩具’ということ。 [イミディエイト] ? DBSELECT("SELECT DISTINCT [カテゴリ1], DBLookup('名称', '枝番大分類', 'ID=' & [カテゴリ1]) FROM 商品枝番 WHERE [商品_ID]=1", ";") 1;文具;3;その他; ? DBSELECT("SELECT DISTINCT [カテゴリ1], DBLookup('名称', '枝番大分類', 'ID=' & [カテゴリ1]) FROM 商品枝番 WHERE [商品_ID]=2", ";") 2;玩具; 検索・参照フォームの初手の課題は、<[商品コード]に応じて大分類[リスト0]を更新する>だと思います。 リスト?!値集合タイプ=値リスト リスト?!列数=2 リスト?!列幅=0cm;3cm Dim lngID   As Long Private Sub リスト0_AfterUpdate()   Me.リスト1.RowSource = DBSelect( _                     "SELECT DISTINCT [カテゴリ2]," & _                     "DBLookup('名称', '枝番中分類', 'ID=' & [カテゴリ2])" & _                     " FROM 商品枝番 WHERE [商品_ID]=" & lngID) End Sub Private Sub 商品コード_AfterUpdate()   lngID = DBLookup("ID", "商品", "[商品コード]='" & Me.商品コード & "'", 0)   If lngID > 0 Then     Me.リスト0.RowSource = DBSelect( _                     "SELECT DISTINCT [カテゴリ1]," & _                     "DBLookup('名称', '枝番大分類', 'ID=' & [カテゴリ1])" & _                     " FROM 商品枝番 WHERE [商品_ID]=" & lngID)     Me.リスト0.Value = Me.リスト0.ItemData(0)     リスト0_AfterUpdate   End If End Sub これでOKです。 テストは一回のみしかしていませんが、[商品枝番]に存在する各商品に対応する大分類と中分類をこれで抽出する筈です。 さて、ここではVBAコードを簡略化するために DBSelect関数と DBLookup関数を用いています。 ※ Access のプログラミングは正に千差万別です。 ※ コンボボックスやリストボックスへの値のセットは常に発生します。 ※ で、いちいちプログラムコードを書いていたのでは幾ら時間があっても足りません。 ※ ですから、その辺りは関数化する訳です。 以上で下部に対応するデータを表示すれば検索・参照フォームは完成すると思います。 頑張って下さい。 ublic Function DBSelect(ByVal strQuerySQL As String, _              Optional ByVal strSeparator1 As String = ";", _              Optional ByVal strSeparator2 As String = ";") As String On Error GoTo Err_DBSelect   Dim I   As Integer   Dim J   As Integer   Dim R   As Integer   Dim C   As Integer   Dim M   As Integer   Dim N   As Integer   Dim rst  As ADODB.Recordset   Dim fld  As ADODB.Field   Dim Datas As String      Set rst = New ADODB.Recordset   ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       M = .RecordCount - 1       N = .Fields.Count - 1       .MoveFirst       For R = 0 To M         For C = 0 To N           Datas = Datas & .Fields(C)           If C <> N Then             Datas = Datas & strSeparator1           End If         Next C         If Len(strSeparator2) Then           Datas = Datas & strSeparator2         End If         .MoveNext       Next R      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect:   DBSelect = Datas   Exit Function Err_DBSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = "") As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim strQuerySQL As String   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   strQuerySQL = "SELECT " & strField & " FROM " & strTable   If Len(strWhere) > 0 Then     strQuerySQL = strQuerySQL & " WHERE " & strWhere   End If   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function *************************************************************** どうするかは質問されないがいいです。 「こうしようと思うが、ここが判らない!」という質問がいいです。 なりゆきで最後まで答えましたが、噛みあっているか不明。 で、ステップ毎に質問されたがいいです。 回答は、幾つかのステップを段階を追って攻めています。 で、こういうステップ毎に流儀も作法も千差万別。 ですから、自分の流儀でステップ毎に質問。 そうであれば、幾多の回答が集中すると思いますよ! ***************************************************************

yellow-
質問者

お礼

ありがとうございます! 教えていただいたことを試してみます! 試してからだと遅くなってしまうので、 先にお礼まで。 アドバイスの通り、 >「こうしようと思うが、ここが判らない!」という質問がいいです。 という風に、質問からして見直します(^^;) 個人レッスンみたいになってしまってすいませんでした。。。 いろいろありがとうございます! 今回の回答が全て理解し、活用できるまで学習頑張ります!

noname#140971
noname#140971
回答No.7

【Microsoft Access のヘルプ】-UPDATE ステートメントの使用例 UPDATE Employees SET ReportsTo = 5 WHERE ReportsTo = 2;" 【テーマ】テーブル[商品]の列[ランキング]の値を更新。 そのためには、Microsoft Access のヘルプのUPDATE ステートメントの使用例を参照。 その例にならって以下のクエリを作成。 クエリ3: クエリ UPDATE 商品 SET [ランキング]= _   IIf(Len([ポイント] & ""),DBCount("*","商品","[ポイント]>" & [ポイント])+1,-1) [ポイント]が空値でなければ--->DBCount()で現行より上位のポイントを持つレコード数を求めて+1. [ポイント]が空値であるなら--->-1 空値かどうかを<Len([ポイント] & "">で判定するやり方は Microsoft のヘルプで見られるやり方。 <[ポイント] is not null>と書くかどうかは趣味と好みの問題。 ともあれ、以下のように[ランキング]列が更新されます。 商品: テーブル [ID]_[商品コード]_[商品名]____________[生産工場]_[ポイント]_[ランキング] __1___0003_________キャラクタキペン1__東京_______98.5________________1 __2___0004_________キャラクタキペン2__東京_______92.0________________3 __3___1085_________香り消しゴム________東京_______96.3________________2 __4___7563_________下敷き______________東京_______32.0________________5 __5___4826_________シャープペン________東京_______廃盤_______________-1 __6___9325_________卓上ホルダー________東京_______廃盤_______________-1 __7___0005_________キャラクタキペン3__東京_______92.0________________3 ※SQL文に IIf関数やDBCount関数を組み込んで安直なUPDATE文を作成するのは一種の邪道。 ※Access だから許される手法。 【標準モジュールにDBCount()をコピペ】 Public Function DBCount(ByVal strField As String, _             ByVal strTable As String, _             Optional ByVal strWhere As String = "", _             Optional ByVal ReturnValue = 0) As Variant On Error GoTo Err_DBCount    Dim N    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Set rst = New ADODB.Recordset    strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        N = .Fields(0)      End If    End With Exit_DBCount: On Error Resume Next    rst.Close    Set rst = Nothing    DBCount = IIf(N <> 0, N, ReturnValue)    Exit Function Err_DBCount:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBCount End Function ※Access には DBCount関数と同じ働きをするDCount関数が用意されています。 ※ですから、別に DBCount関数を用いる必要はありません。 ※ただ、クエリやSQL文の実行速度は1:3程度と思われます。 ※高速処理を目指さなければDCount関数でも宜しいと思います。

noname#140971
noname#140971
回答No.6

<既に完成した部分の確認> 商品大分類: テーブル [ID]_[並び順]_[名称] __1________1___文具 __2________2___玩具 __3________3___その他 商品中分類: テーブル [ID]_[商品大分類_ID]_[並び順]_[名称] __1_______________1________1___文具_1 __2_______________1________2___文具_2 __3_______________2________1___玩具_1 __4_______________2________2___玩具_2 __5_______________3________1___その他_1 __6_______________3________2___その他_2 リスト0!値集合ソース=SELECT 枝番大分類.ID, 枝番大分類.名称 FROM 枝番大分類 ORDER BY 並び順; リスト1!値集合ソース=SELECT 商品中分類.ID, 商品中分類.名称 FROM 商品中分類 WHERE (((商品中分類.商品大分類_ID)=Forms!フォーム1!リスト0)) ORDER BY 商品中分類.並び順; Private Sub Form_Load()   Me.リスト0.Value = Me.リスト0.ItemData(0)   リスト0_AfterUpdate End Sub Private Sub リスト0_AfterUpdate()   Me.リスト1.Requery End Sub 一応、これで大分類のリストが選ばれると中分類のリストが対応するものにチェンジします。 質問1、[カテゴリ1]は、テーブル[商品大分類]![ID]なのか? 質問2、[カテゴリ2]は、テーブル[商品中分類]![ID]なのか? [カテゴリ1][カテゴリ2]が具体的な分類名だとすると全てが文字列検索になるかと思います。 主マスターの主キーは長整数、純データテーブルの主キーは整数ないしバイト型(0-255)。 そうすれば、検索速度も改善すると思います。 ※テーブル[商品大分類]と[商品中分類]とをメインとサブフォームで管理。 ※これは、顧客の要求の核心部に応えるには必須な作業かと推察しました。 ※で、[商品大分類]![ID]と[商品中分類]![ID]とをキーにテーブル[商品]を[ランキング]付きで高速表示。 ※こういうことかと思います。 ※ならば、邪道ではありますが[商品]![ランキング]という列を生成するのも手だとは思います。 ※次の回答は、その要領に関してです。

yellow-
質問者

補足

現在完成しているテーブルについて。 T_商品 ID 商品コード 商品名       生産工場  ポイント 1  0003    キャラクターペン  東京     98.5 2  1085    香り消しゴム    東京     97.6 T_商品枝番 ID 商品ID 枝番 カテゴリ1 カテゴリ2 1  1   1-1  玩具    対象小学生以下 2  1   1-2  文具    筆記用具 3  1   1-3  文具    消耗品 4  2   2-1  文具    筆記用具 5  2   2-2  文具    消耗品 ですが、これとは別に、 検索用リストボックスのために 商品大分類: テーブル 商品中分類: テーブル を作るということでいいのでしょうか? >質問1、[カテゴリ1]は、テーブル[商品大分類]![ID]なのか? >質問2、[カテゴリ2]は、テーブル[商品中分類]![ID]なのか? というのは、上記の解釈でいうと、新しく作った商品各分類の各テーブルのIDということでしょうか? [並び順]というのは上から下への連番でしょうか? 先日作成した商品枝番はどのような役割になりますか? その場合、商品コードとのリレーションはどのようになりますか? 商品コードを元に商品大分類(カテゴリ1)を選抜、そこから商品中分類(カテゴリ2)を選抜。 という検索フォームで行きたいと思っています。 >※で、[商品大分類]![ID]と[商品中分類]![ID]とをキーにテーブル[商品]を[ランキング]付きで高速表示。 今、自分で既に作成済みのフォームで、[詳細]に表示される元データテーブル自体にランキングとポイントデータを追加(エクセルで作成しインポート)して、表示させ、並べ替えさせてしまうというのがいいのでしょうか。

noname#140971
noname#140971
回答No.5

次は、連休明けに・・・。 1、ランキングはポイント順に、1、2、3、3、5となるのは先の回答の通りです。 2、その生成方法は別に難しいことではありません。 ここまでくれば、その生成方法は誰かが答えてくれると思います。 そして、全て、当初の問いに答えることが可能な状況が出現。 ですから、連休明けはお呼びではないでしょう。

yellow-
質問者

補足

ありがとうございます! >1、ランキングはポイント順に、1、2、3、3、5となるのは先の回答の通りです。 >2、その生成方法は別に難しいことではありません。 >ここまでくれば、その生成方法は誰かが答えてくれると思います。 お助けください!! SQLとかVBAとかでしょうか? >そして、全て、当初の問いに答えることが可能な状況が出現。 どんな状況でしょうか? >ですから、連休明けはお呼びではないでしょう。 およびしたい限りですが。。。 >次は、連休明けに・・・。 私の自宅のPCにはアクセスが入っていないので、 是非連休明けによろしくお願いします。

noname#140971
noname#140971
回答No.4

<ランキングシートに関する確認> 商品: テーブル [ID]_[商品コード]_[商品名_____________]_[生産工場]_[ポイント] __1___0003_________キャラクタキペン1____東京___________98.5 __2___0004_________キャラクタキペン2____東京___________92.0 __3___1085_________香り消しゴム__________東京___________96.3 __4___7563_________下敷き________________東京___________32.0 __5___4826_________シャープペン__________東京___________廃盤 __6___9325_________卓上ホルダー__________東京___________廃盤 テーブル[商品]に列[ポイント]を追加してみました。 ほぼ、ランキングシートそのものですよね。 列[ポイント]の書式=0.0;0.0;0.0;"廃盤" ランキングクエリ: クエリ [ランキング]_[商品コード]_[商品名]____________[生産工場]_[ポイント] __________1___0003_________キャラクタキペン1__東京_______98.5 __________3___0004_________キャラクタキペン2__東京_______92.0 __________2___1085_________香り消しゴム________東京_______96.3 __________4___7563_________下敷き______________東京_______32.0 ______________4826_________シャープペン________東京_______廃盤 ______________9325_________卓上ホルダー________東京_______廃盤 冒頭の新しいテーブル[商品]をクエリで参照してみました。 列[ランキング]はクエリで生成しています。 仮に、[ランキング]が幾つかの条件でもっての[ポイント]の並び順だとすればこのように。 さて、今回のテストで<ランキングシート>は不要で[商品]![ポイント]さえ更新できれば良い。 そういう可能性もあることが判ると思います。 先の回答にSQLのUPDATE文を更に1行追加するだけかも知れませんね。 先ずは、お知らせしておきます。

yellow-
質問者

補足

ありがとうございます! ひとまずエクセルから作ったテーブル T_商品 にポイント列を増やしました。 クエリは[ランキング]の生成がわからず作成していません。。。 ランキングは同点の場合は同位にしたいです。 >仮に、[ランキング]が幾つかの条件でもっての[ポイント]の並び順だとすればこのように。 実はポイントの出し方が、3項目あるチェック条件(項目1.項目2.項目3.)の得点を元に算出されています。 実はその3項目も表示したいのですが、これを言うとややこしくなるかと思って出していませんでした。 ポイントの高い順にランキングをつけるのですが、同点の場合、同位になりますが、データの並び順においては、エクセルで言う並べ替えの優先順位が項目1.→2.→3.としたいと思います。 ランキング(順位)を自動的に与える方がいいのか、既にエクセル上で付与されている順位列を用いた方がいいのか、どうでしょうか?

noname#140971
noname#140971
回答No.3

As キーワードが一部欠落していました! Private Sub コマンド0_Click()   Dim strSQLDELETE As String   Dim strSQLINSERT As String      strSQLDELETE = "DELETE FROM 新商品枝番"   strSQLINSERT = "INSERT INTO 新商品枝番 " & _           "SELECT ID, " & _           "DBLookup('ID', '商品', '商品コード=''' & [商品コード] & '''') AS [商品_ID]," & _           "'' AS 枝番名," & _           "[カテゴリ1]," & _           "[カテゴリ2] FROM クエリ1"   CnnExecute (strSQLDELETE)   CnnExecute (strSQLINSERT) End Sub 最善のやり方は、高度(?)なそれではなく自分と相性の良いそれです。 相性が悪いと思われたら止められたがいいです。

noname#140971
noname#140971
回答No.2

<テーブル再作成要領> 商品枝番: テーブル [ID][商品_ID][枝番名][カテゴリ1][カテゴリ2] __0________0_________________________________ このような空のテーブル[商品枝番](仮称)を用意します。 クエリ1: クエリ [ID]_[商品コード]_[商品名______]_[枝番名_____________]_[生産工場]_[カテゴリ1]_[カテゴリ2] ___1__0003_________キャラクタ1___キャラクタ1_枝番01___東京_______玩具_________幼児用 こういうテーブルは既に出来ていますね。 で、これから一気にテーブル[商品枝番]を作成することも可能です。 新商品枝番: テーブル [ID]_[商品_ID]_[枝番名]_[カテゴリ1]_[カテゴリ2] __1_________1____________玩具_________幼児用 __2_________1____________文具_________筆記具 __3_________2____________玩具_________小学生用 __4_________2____________文具_________消耗品 これが、たった今、クエリ1から生成した[新商品枝番]です。 ([新商品枝番]というのはクエリが[商品枝番]を使用しているため!) (実際は、質問者の環境でアレンジを) これは、フォーム[商品枝番更新]を用意してコマンドボタンをクリックしただけです。 Private Sub コマンド0_Click()   Dim strSQLDELETE As String   Dim strSQLINSERT As String      strSQLDELETE = "DELETE FROM 新商品枝番"   strSQLINSERT = "INSERT INTO 新商品枝番 " & _           "SELECT ID, " _           "DBLookup('ID', '商品', '商品コード=''' & [商品コード] & '''') AS [商品_ID]," _           "''," & _           "[カテゴリ1]," &_           "[カテゴリ2] FROM クエリ1"   CnnExecute (strSQLDELETE)   CnnExecute (strSQLINSERT) End Sub DELETE文はみたまんまです。 INSERT INTO 文がチトややこしいです。 SELECT 文で取得したデータをインサートする命令です。 注意1、列名を ’As 列名’で指定する必要があります。(同じ列名同士は指定不要) 注意2、文字列内のシングルクォーテーションなどは2つ続けて書く必要があります。 さて、ここで、私は CnnExecute()、DBLookup() という自作関数を使っています。 こういうやり方ですと、苦も無く[商品枝番]は生成できます。 1、取りあえず既存のテーブルからフォーム[商品枝番更新]で[商品枝番]を更新。 2、いやいや、エクセルそのものを[商品枝番]と[クエリ]とに分割する。 3、で、Access では[商品枝番]を最初から使う。 で、1ならば、CnnExecute()、DBLookup()を補足します。

yellow-
質問者

補足

ありがとうございます! >1、取りあえず既存のテーブルからフォーム[商品枝番更新]で[商品枝番]を更新。 にチャレンジしてみたいと思います。 >商品枝番: テーブル >[ID][商品_ID][枝番名][カテゴリ1][カテゴリ2] >このような空のテーブル[商品枝番](仮称)を用意します。 用意しました! >クエリ1: クエリ >[ID]_[商品コード]_[商品名______]_[枝番名_____________]_[生産工場]_[カテゴリ1]_[カテゴリ2] >___1__0003_________キャラクタ1___キャラクタ1_枝番01___東京_______玩具_________幼児用 >こういうテーブルは既に出来ていますね。 ここで、[枝番名_____________]がわかりません。 「空のテーブル[商品枝番](仮称)」の、「枝番名」フィールドということでしょうか? と、仮定してT_商品とT_カテゴリとT_商品枝番から、上記項目でクエリを作成しました。 しかしデータシートビューで表示した際、レコードは表示されません。 私は正しく作業できているでしょうか? ※このご回答を頂く前にエクセルで枝番をつけたシートを作成し、新規アクセスへインポートしてテーブルとクエリを作成しました。 T_商品 ID 商品コード 商品名       生産工場 1  0003    キャラクターペン  東京 2  1085    香り消しゴム    東京 T_商品枝番 ID 商品ID 枝番 カテゴリ1 カテゴリ2 1  1   1-1  玩具    対象小学生以下 2  1   1-2  文具    筆記用具 3  1   1-3  文具    消耗品 4  2   2-1  文具    筆記用具 5  2   2-2  文具    消耗品 Q_クエリ1 T_商品_ID/T_商品_商品コード/T_商品_商品名/T_商品枝番_枝番/T_商品_生産工場/T_商品枝番_カテゴリ1/T_商品枝番_カテゴリ2 元のアクセスがごちゃごちゃしちゃっているので新規にしました。 必要フォームとかはコピペすればいいかと思って。 高度な方を学びたい気持ちは山々です。 が、なんだか教える方が大変なんじゃないかと思えたり… もし、このエクセルのデータを使った方が説明し易いようでしたら。 Husky2007さんのやり易い形でお願いします。

noname#140971
noname#140971
回答No.1

少し、確認したいことがあります。 テーブル名は、私流に変更しています。 商品: テーブル [ID]_[商品コード]_[商品名_______]_[生産工場] __1___0003_________キャラクタ1____東京 __2___0004_________キャラクタ2____東京 商品枝番: テーブル [ID]_[商品_ID]_[枝番名______________]_[カテゴリ1]_[カテゴリ2] __1_________1___キャラクタ1_枝番01____玩具_________幼児用 __2_________1___キャラクタ1_枝番02____文具_________筆記具 __3_________2___キャラクタ2_枝番01____玩具_________小学生用 __4_________2___キャラクタ2_枝番02____文具_________消耗品 まず、[カテゴリーシート]ですが、これはいわゆる<商品枝番>なのでは? 「販売管理」では、このように[商品マスター]と[商品枝番一覧]とを有するのは常識。 この場合、[商品]![ID]と[商品枝番]![商品_ID]とが連結するのが常道。 エクセルのシートも本来はそうあるべきかと・・・。 クエリ1: クエリ [ID]_[商品コード]_[商品名______]_[枝番名_____________]_[生産工場]_[カテゴリ1]_[カテゴリ2] ___1__0003_________キャラクタ1___キャラクタ1_枝番01___東京_______玩具_________幼児用 ___2__0003_________キャラクタ1___キャラクタ1_枝番02___東京_______文具_________筆記具 ___3__0004_________キャラクタ2___キャラクタ2_枝番01___東京_______玩具_________小学生用 ___4__0004_________キャラクタ2___キャラクタ2_枝番02___東京_______文具_________消耗品 さて、ここでテーブル[商品]と[商品枝番]を参照してみましょう。 [カテゴリーシート]は、正に、この形になっていますね。 私的には、[商品枝番]![枝番名]が必須だとは思いますが、それはさておいて・・・。 テーブルとクエリとの混同という不具合をどうしますか? そもそも、データには3種類あります。 1、カテゴリー名等のセットアップデータ。 2、商品等のマスターデータ。 3、履歴、伝票等の記録データ。 この3タイプのデータをそのタイプ毎に保持し管理されたがいいです。 で、Access では上記のようにキー列を連結することでデータの重複記録を避けます。 それを[カテゴリーシート]のように参照するのはクエリ(SQL文)の仕事です。 ここの不味さを放置したまま進みますか? ※不具合は、まあ、考え方がややこしいに尽きます。 ※不具合は、まあ、処理速度に影響がでるかも位でしょう。 <お願い> テーブル[ランキング]も具体的なデータを。 逐一、このようにテーブルを作成してテストしていますので自分で考えるのはややこしいです。

yellow-
質問者

補足

ありがとうございます!! >ここの不味さを放置したまま進みますか? いいえ、私が会社に入る前からあるデータだったので、手を付けるのは良くないかと思っていましたが、今回用に新たにしてみようと思います。 >テーブルとクエリとの混同という不具合をどうしますか? これは枝番テーブルを作ることで解消しますか? >そもそも、データには3種類あります。 今回は3の履歴・伝票は無いので2種にしてみます。 枝番シートを作成し、インポートして教えていただいた 商品: テーブル 商品枝番: テーブル を2つ作成してみます。 >ここの不味さを放置したまま進みますか? >※不具合は、まあ、考え方がややこしいに尽きます。 放置せずに進みたいと思います。 テーブルの作り直しをします。 基盤修正は他にありますでしょうか? ランキングシートについて 順位 商品コード 商品名  ポイント 1    0003   キャラクターペン  98.5 2    1085   香り消しゴム   96.3 | 3800  7563   下敷き    32.0 | -   4826   シャーペン芯LD3 廃盤 -   9325   卓上ホルダー    廃盤 ※廃盤商品はエクセル上順位が"-"となっています。 アクセスにインポートすると空欄になります。 >逐一、このようにテーブルを作成してテストしていますので自分で考えるのはややこしいです。 本当にありがとうございます。 とても心強く感じております。 よろしくお願いします!!

関連するQ&A

  • 抽出結果を条件に、抽出

    アクセス超初心者です。 商品コードを基に、いろいろ情報を検索し、閲覧できるフォームを作りたいと思っています。 (↓説明が長いですが、お願いします↓) エクセルで 【カテゴリシート】商品コード/商品名/生産工場/カテゴリ1/カテゴリ2 というシート(4500件くらい)(商品コード重複あり)と、 【ランキング2007シート】人気ランキング順位/商品コード/商品名/ポイント/調査日 というシート(4000件くらい)(商品コード重複なし)があります。 ※カテゴリ1 ・・・(大分類カテゴリ)/カテゴリ2 ・・・(大分類の中の詳細分類) ※カテゴリ1は1つの商品に1種ではなく、複数の場合があります。 必然的にその分カテゴリ2も複数になります。 例:キャラクターペン カテゴリ1=玩具―カテゴリ2対象小学生以上             =文具―カテゴリ2筆記用具             =文具―カテゴリ2消耗品 ※ランキングは廃盤の商品コードもあり、そこ商品に関しては順位とポイントが空欄です。 ここから、ある商品はどのカテゴリに属しているか、また同カテゴリに含まれる商品のみでの人気ランキングを出すように、と仕事で依頼されます。 いつもは、カテゴリシートでオートフィルタをかけ、必要商品コードを抽出し、作業シートを使ってランキングシートから関数で各コードのランキング/ポイントを拾い出し、昇順で並び替えては提出していました。 しかし、このデータは増える予定が無く、ランキングも年に1回更新されるだけなので、みんなが簡単に検索できるようにしたいと思います。 出来ていること フォームでコードを入力すると、その商品名が表示され、カテゴリ1がリストボックスに表示され、そのリストのいずれかをクリックすると、もうひとつのリストボックスにカテゴリ2が表示され、そのいずれかをクリックすると詳細に必要情報が表示される。 したいこと ランキング作成。 リストボックス、カテゴリ2をクリックすると詳細へ表示される、複数のコード。これを検索条件にしてランキングを抽出。 T_商品名 ID(主キー) 商品コード 商品名 生産工場 テーブル2ID※T_テーブル2のNo.とリレーション T_カテゴリ カテゴリ1 ・・・(大分類カテゴリ) カテゴリ2 ・・・(大分類の中の詳細分類) ID(主キー)※T_テーブル1のテーブル2IDとリレーション T_ランキング2007 ランキング順位 商品コード 商品名 ポイント ID(主キー)(リレーション無し) F_総合検索  ヘッダー部分   (1)コード入力欄(テキストボックス非連結)   (2)商品名(テキストボックス非連結)   (3)カテゴリ1(リストボックス)   (4)カテゴリ2(リストボックス)   (5)ボタン  詳細部分    商品コード/商品名/生産工場/カテゴリ1/カテゴリ2 しくみ  I(1)にコードを入力する   →II(2)に商品名が表示/(同時に)(3)カテゴリ1が表示   →III(3)のどれかクリックすると、そこに属する(4)が表示   →IV(4)のクリックされたカテゴリを条件に詳細が表示    ※(5)ボタンは詳細の表示と同じものを別途クエリを作成し、開くようにしています。(今はまだランキングが出来ていないので、クエリをコピーしエクセルでランキングを作っています。) ランキングは毎年あるので過去のもものもあります。 出来ればボタンで『2007』『2006』・・・と作って、クリックすると、現在フォームヘッダーで指定されている条件を基に、クリックされたボタンの年度内でのランキングを作成したいです。 結果は順位の昇順になるようにしたいです。 また、詳細への表示を今はカテゴリ内のコード他が表示されていますが、それをラジオボタン等のチェックでランキングに切り替えたり、出来るでしょうか? VBA、マクロ、SQLは全くわかりません。 そんな私でもどうにかできないものでしょうか。。 お願いします。

  • ACCESSのリストボックス抽出について

    ACCESSにおいて、住所録テーブルを用意します。 フォーム上で県、市のリストボックスを作ります。 住所録テーブルには県と市のフィールドを作り、県名と市名を入力しておきます。クエリを用意し、リストボックスの県で例えば東京を指定するとそれに該当する市が抽出されて市のリストボックスから選択できるようにしたいのですがクエリ上では表示されるのですがリストボックスに反映されません。 どのようにすれば出来るのでしょうか。 (ちょうど教えて!gooで質問する際にカテゴリーの大分類から小分類を選択する時のようにです。)

  • Accessのリストボックスを使って抽出

    抽出用のフォームを作成しているのですが、その中にリストボックスがあり、何も選択しなかった場合は、すべての項目が表示される様にしたいと思っております。自分なりに色々と調べたのですが、どうしても希望の動作になりません。どの様にすれば良いのか教えて頂けないでしょうか? Access2003を使用しております。 Form-A(メインフォーム名)←テーブルAを元に作成(項目名同じ) 番号(主キー)、氏名、性別、A1、A2・・・ A1、A2は、する・しないのどちらかを入力。 Form-B(サブフォーム名)←テーブルBを元に作成(項目名同じ) ID(主キー)、番号、担当、訪問日、次回訪問日、期間 担当は、値集合タイプ:テーブル/クエリ、値集合ソース:テーブルあ(フィールドは担当のみ)5名程の名前を登録しし、リストボックスにて選択できる様にしています。 現在、下記の様な抽出用のフォームがあります。 Form-抽出(抽出用フォーム名) A1(チェックボックス) A2(チェックボックス) 担当(リストボックス:値集合タイプ:テーブル/クエリ、値集合ソース:テーブルあを設定) [OK]ボタンを押すと抽出(クエリQにて条件を設定)する様にしています。 クエリQ(テーブルA、テーブルBを元に作成) 番号(主キー)、氏名、性別、A1、A2、ID(主キー)、番号、担当、訪問日、次回訪問日、期間 現在設定しているのは、 A1の抽出条件:IIf([forms]![Form-抽出]![A1]=True,True,False) A2の抽出条件:IIf([forms]![Form-抽出]![A2]=True,True,False) 担当の抽出条件:[Forms]![Form-抽出]![担当リストボックス] 訪問日の抽出条件(複数情報がある為、最近の訪問日のデータのみ対象となる様にしています。):DMax("訪問日","テーブルB","[テーブルB]![番号] ='" & [テーブルB]![番号] & "' And 訪問日 <Date()") 今の設定ですと、担当を選択しなかった場合、何も抽出されてきません。 これを、すべて表示出来る様にしたいのが希望です。 Access初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますので、どうぞよろしくお願い致します。

  • リストボックスから選択したデーターの一つだけを取得する

    VB5.0を使っています。 WIN2000です。 MDBとVBを使っています。 まず、顧客ID・顧客氏名・電話番号  この3つが1つのデータとして横並びの文字列で、リストボックスに表示されてゆきます。 リストボックスに表示したデータを選択し、その選択したデータの”顧客ID”だけを取り出して同じフォーム内のテキストボックスにいったん出し、そこから別のフォームに飛んでその”顧客ID”を元にデータの詳細を出す、といったものを作っていますが、 今のわたしの書いてるコードだけでは、何番の顧客IDを出しても、 別のフォーム(契約入力)に行くときには同じ1番の人のデータ詳細しか出ません。 「リストボックスから選択したデーターの一つだけを取得する」 には、どのようなコードを書けばいいか、教えていただけないでしょうか・・。 リストボックス(List1)から選択してテキストボックス(Text5)に取得する際にはすでに”顧客ID”だけを取り出したいのです。 今のコードでは、顧客ID・顧客氏名・電話番号 とすべてテキストボックス(Text5)にでてきてしまいます。 Private Sub cmnd2_Click()’選択ボタンclickでリストボックスのデータを取得。 Dim ListIndex As Integer Dim SelectedIndex As Integer Text5.Text = List1.List(List1.ListIndex)'→ここでリストボックスからデータを取得しています。 End Sub

  • Access リストボックス複数選択を抽出条件に

    Access リストボックスで複数選択した値をクエリの抽出条件にしたいです。 ※PC環境:Win7 Access2007 Excel2007 リストボックスで複数選択した値を取得する事はできるのですが、 クエリ実行をすると結果が0件になってしまいます。 他の方のQAなどを参考に以下を作成しましたが、ほしい結果が得られず困っています。 おわかりになる方、ご教示いただけますようお願い致します。 <動作概要> 「画面」の「リストボックス」で複数選択し、 [実行]ボタンを押して、「リストボックス」で選択した値を、「テキストボックス」にセットし、 クエリの抽出条件に、in(テキストボックス)をセットし、テーブルから合致するデータを抽出したい <リストボックス> ※年区分テーブル参照 区分,区分名 1,1年 2,2~3年 3,4~5年 「2,2~3年」「3,4~5年」を選択 ※「区分」は数値型 <VBA> Private Sub 実行_Click()  Dim i As Variant  Me.テキストボックス = Null  For Each i In Me.リストボックス.ItemsSelected Me.テキストボックス = Me.テキストボックス & Me.リストボックス.Column(0, i) & "," Next If Me.テキストボックス <> "" Then  Me.テキストボックス = Left(Me.テキストボックス, Len(Me.テキストボックス) - 1) End If   'ここで画面を確認すると「テキストボックス」には、「2,3」 がセットされている DoCmd.OpenQuery "クエリ"   'テーブルには抽出条件に該当するデータがあるが、クエリ実行結果は0件 End Sub <クエリ SQL> SELECT テーブル FROM テーブル WHERE (((テーブル.区分) in([Forms]![画面]![テキストボックス]))); ※「テーブル.区分」は、数値型 どうぞよろしくお願い致します。

  • ACCESS2010テキストボックス値を抽出条件に

    ACCESS2010にて、フォームに作ったテキストボックスの入力値(数字3桁)をクエリの抽出条件にしたいと考えています。 ただ、そのテキストボックスの数が30個の為、クエリデザイン画面の抽出条件欄にorを用いた条件式で設定することが出来ませんでした。(文字数上限超?) そこで、VBAを用いて抽出条件を設定しようと考えているのですが、初心者のため全く勝手が分かりません。VBAでの設定方法やVBA以外での抽出方法があれば教えて頂けないでしょうか。 尚、テキストボックスには商品コード(数字3桁)を入力し、売上データを集計したクエリにおいて、フォームのテキストボックスに入力された複数の商品コードを抽出条件に設定したいと考えております。 以上、どうかお願い致します。

  • アクセス2000でデータ抽出できない

    アクセス2000でデータ抽出できない サブフォーム上でコンボリストを使用して入力し、その条件にあったものだけを別のコンボボックスに表示したい。 フォーム:[取引名][種別][資材名] ※全てコンボリスト 取引先を選択し、種別を選択し、その2つの条件を満たすものだけテーブルから抽出し、資材名のリストに表示したいのですが、どうしたらできるかわかりません。

  • Access2003でコンボボックスからデータを抽出したい

    自己啓発でAccess2003を勉強しています。 Access2003でコンボボックスで名前を選択して、データ(住所)を抽出したものをリストボックスに表示させたいのですがどこがまちがっているかわかりません。こんなことで3週間ぐらい悩んでいます。 回答またはアドバイスをお願いします。 もしくはもっと簡単なやりかたがあればお願いします。 (1)「氏名」、「住所」のテーブルを作成。テーブル名は「01データ」 (2)「氏名」、「住所」のクエリを作成。クエリ名は「クエリ1」 (3)フォームでコンボボックスとリストを作成。フォーム名は「印刷」 ⇒コンボボックスの名前は「検索」。 ⇒値集合ソースはSELECT [01データ].ID, [01データ].氏名 FROM 01データ; これで「氏名」が選択できた。 (4)クエリの「氏名」抽出条件にLike [forms]![印刷]![検索] (5)検索するマクロを作成。マクロ名「M検索」 アクションは 全レコードの表示 フィルタの実行 ⇒Where条件は[Forms]![印刷]![検索]=[クエリ1]![氏名] (6)マクロ「M検索」をコンボボックスのプロパティ「イベント」タブから変更時に設定する。 (7)フォーム「印刷」を開き、コンボボックスで氏名を選択すると『クエリ1!氏名』と表示されてしまいます。 (8)フォーム「印刷」のリストボックスは全レコードが表示されている。

  • ACCESSクエリ抽出条件について

    フォーム画面のリストボックスで複数選択が出来るよう設定し、その結果をクエリの抽出条件で forms![フォーム名].[リストボックス名] としたのですが全く反映されません。 複数選択が出来ないようにしたら問題なく表示されるのですが、上記の記述以外に入力しないといけないのでしょうか?

  • ACCESS / 抽出条件によってレポートの種類を変えたい

    初歩的な質問ですが、アドバイスをお願い致します。 FormAというフォームに、複数のテキストボックスを作成して、 店舗コード・商品名・担当者のどれかを選択して抽出した結果をレポートに出力する、という形を考えております。 (店舗コード・商品名の両方を選択することも可など、複数の条件でも出力させるつもりです。) 悩んでいるのが、 ★店舗コードで抽出した場合→店舗コードをキーに見たレポート ★商品名で抽出した場合→商品名をキーに見たレポート ・・・といったように、複数の条件で出力可能にしてしまうと、 レポートをいくつ作成すればいいのか初心者の私は考えてしまっています。 できれば1枚のレポートを作成して、抽出条件によってレポートの中身、見た目を変えたいと思ってるのですが、どのような方法がありますでしょうか。宜しくお願い致しますm(__)m

専門家に質問してみよう