• ベストアンサー

Accessでの抽出方法を教えてください。

Access初心者の域を脱しきれない者です。 質問するにも説明が難しく、悩みましたが画像を添付すれば解っていただけると思い質問させていただきます。 サケ科の魚を一匹ずつランダムに比較、同族(属)とした固有名(魚名)が対になったたデータ存在します。この際、比較する/される側のいずれになるかは分からないとする。 このデータから、個々の魚名に対し同族(属)の魚名を抽出した表を作成する方法を教えてください。(画像のデータでは、便宜上、サケ属とイワナ属の一部としています。) 初心者の私にとっては、クエリで処理できればありがたいのですが、VBでないと無理なのでしょうか。

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

  • ベストアンサー
回答No.8

【確認とVBの提示】  以下のVBコードを書いて実行すると添付図のような結果を得ました。このようなVBコードで宜しいのかどうかは判りませんので、コード中で使用している関数の紹介は割愛します。  なお、元テーブルと同じ構造のテーブルを別途用意して、それに結果をINSERTしています。また、テストテーブルの列名は以下のようです。 ・No.--->ID ・個有名--->name ・属名------>family Private Sub コマンド0_Click()   Dim H       As Integer   Dim I       As Integer   Dim N       As Integer   Dim M       As Integer   Dim intTotal   As Integer   Dim strDatas(1)  As String ' DBSelect()の戻り値を格納する配列   Dim strNames()  As String ' 列[name]の値を格納する配列   Dim strFamilies() As String ' 列[family]の値を格納する配列   Dim strSQL    As String ' SQL文をセットする変数      DoCmd.SetWarnings (False)      ' ----------------------------------------   ' name 一覧を取得する   ' ----------------------------------------   strSQL = "SELECT name FROM FamilyList ORDER BY ID"   strDatas(0) = DBSelect(strSQL, ",", ",")   strSQL = "SELECT family FROM FamilyList ORDER BY ID"   strDatas(1) = DBSelect(strSQL, ",", ",")   If Len(strDatas(0) & "") Then     strNames() = Split(PackList(strDatas(0) & "," & strDatas(1)), ",")   Else     strNames() = Split(PackList(strDatas(1)), ",")   End If   ' ----------------------------------------   ' [FamilyList_ALL] をクリアする   ' ----------------------------------------   DoCmd.RunSQL "DELETE FROM FamilyList_ALL"   ' --------------------------------------------------------   ' テーブル[FamilyList_ALL]に固有名と属名を挿入する   ' --------------------------------------------------------   intTotal = UBound(strNames)   For I = 0 To intTotal     '     ' name に対応する主属名と副属名を取得し配列に代入     '     strFamilies() = Split(GetFamilies(strNames(I)), ",")     '     ' テーブル[FamilyList_ALL]の現在の行数を取得     '     N = DBLookup("SELECT COUNT(*) FROM FamilyList_ALL")     '     ' For-Next     '     M = UBound(strFamilies)     For H = 0 To M       '       ' テーブル[FamilyList_ALL]に'固有名'対'属名'関係を登録       '       ' 注意1: <個有名=属名> も発生する!       '       If Len(strFamilies(H) & "") And strNames(I) <> strFamilies(H) Then         N = N + 1         strSQL = "INSERT INTO FamilyList_ALL (ID,name,family)" & _             " VALUES (" & N & ",'" & strNames(I) & "','" & strFamilies(H) & "');"         DoCmd.RunSQL strSQL       End If     Next H   Next I   DoCmd.SetWarnings (True) End Sub

その他の回答 (11)

  • tamu1129
  • ベストアンサー率58% (1295/2224)
回答No.1

>画像を添付すれば解っていただけると思い いえ画像付けても言ってる事がさっぱり理解できません テーブルを作成、そのテーブルに NO・項目A・項目Bというフィールドがありデータ入力が済んでいるって所までは理解できます この項目Aまたは項目Bが 魚の固有名称でもう一つが 属 を表しているという事ですよね? この考え方だと、添付している表では合点がいきません 項目Aが固有名称だとしたら、その固有名称の属性は複数にわたるって事なのですか? シロサケを例にすれば、シロサケは属性がギンザケでもありサクラマスでもあるように取れます moco-don さんは質問内容に >族(属)とした固有名(魚名)が対になった と書かれていますが、ぜんぜん対になっていませんよ

moco-don
質問者

お礼

ご回答有難うございました。質問内容を理解していただくために工夫したつもりですが、分かり難かったでしょうか。出直したいと思います。

関連するQ&A