• ベストアンサー

マイクロソフトアクセスの抽出

マイクロソフトアクセス2010の使い方の質問です。 次のようなテーブルがあります。 ID   名前1   名前2   名前3 1    A      B○     C 2    D○     E       F○ 3    G      H○     I○ このデータで○がついているもののみを抽出し ID   名前(○あり) 1    B○ 2    D○、F○ 3    H○、I○ このようなテーブルを作成するにはどうしたらいいですか? 各行に必ず○は1つ以上あります。 アクセスは、ド素人ですよろしくお願いします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

No1とNo7のコードの中の変数宣言で Dim fld As Field といれていますが、使っていないので コメントアウトするか削除しておいてください。

abcdefg123456
質問者

お礼

できました!! 大変ご丁寧な回答ありがとうございます。 コード!?っていうのをはじめて使用しましたが、難しいですね。 コピペでできたので助かりました、ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.6

クエリで 新しいフィールドに 名前: Mid(IIf(Right([名前1],1)="○","、" & [名前1],"") & IIf(Right([名前2],1)="○","、" & [名前2],"") & IIf(Right([名前3],1)="○","、" & [名前3],""),2) で、抽出できます。 テーブルにしたかったら 上記を「テーブル作成クエリ」にするなり 予めテーブルを作っておいて「追加クエリ」でデータを追加するなりしてください。 「名前(○あり)」 というフィールド名はトラブルの元ですので、 ここでは単に「名前」にしています。

abcdefg123456
質問者

お礼

ご回答ありがとうございます。 こちらの回答のほうが簡単そうな感じなのですが、ド素人なので「クエリで新しいフィールドに」とか「テーブル作成クエリ」とか「追加クエリ」とかが、さっぱりわかりませんでした。 もう少し勉強してこちらの方法も試してみます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No1のコードに説明をいれておきます。 Private Sub コマンド0_Click() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim fld As Field Dim i As Integer Dim str As String Set db = CurrentDb Set rs1 = db.OpenRecordset("T横") '書き込みなどをする場合はdbOpenDynasetを指定する Set rs2 = db.OpenRecordset("T縦", dbOpenDynaset) 'T横にレコードがあるなら以下に突入 If rs1.RecordCount > 0 Then Do Until rs1.EOF '各レコードのフィールドの名前1から検索 '変数iは実際には0から始まるが「ID」を読み飛ばすので 'iを1から始める。ただこの場合はiは0から初めてもよい。 For i = 1 To rs1.Fields.Count - 1 'フィールドの値の末尾に○があるか確認 If Right(rs1.Fields(i).Value, 1) = "○" Then 'あれば変数strに追加し、ついでにカンマも追加 str = str & rs1.Fields(i).Value & "," End If '次のフィールドも同じ処理をしてstrに追加するために '次のフィールドに向かう(フィールドがなくなるまで) Next i 'strの末尾にカンマがあるとみっともないのでカンマを除いたものを '再度変数strに入れ込む If Right(str, 1) = "," Then str = Left(str, Len(str) - 1) End If 'めでたく取り出せたらデータをT縦に追加 rs2.AddNew rs2!ID = rs1!ID rs2!名前 = str rs2.Update '変数strを空にしておく str = "" '次のレコードの処理に向かう rs1.MoveNext Loop End If rs1.Close :Set rs1 = Nothing rs2.Close :Set rs2 = Nothing db.Close :Set db = Nothing End Sub

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

>「この名前は既にあるモジュール、プロジェクト、 >オブジェクトライブラリで使われています」との表示が出て、 >チェックがつきません… ということはすでにDAOにチェックが入っていると思われるので このまま実行してみてください。 >ちなみに、フィールド名が「ID、名前1、名前2、名前3」 >のほかに追加した場合も同じコードで大丈夫でしょうか? >(追加するフィールドには○印は絶対につきません。) 大丈夫です。ただし、最初に「ID」をおいておいてください。 回答したVBAコードは、最初を「ID」として読み飛ばす ようにしています。また、文字列の末尾に○がつくものを選び出す だけの内容です。これを説明すると、 rs.Fields(0)  はテーブルの「ID」 rs.Fields(1)  はテーブルの「名前1」 rs.Fields(2)  はテーブルの「名前2」 rs.Fields(3)  はテーブルの「名前3」   ・   ・   ・ のようになっているので○があるフィールドが さらに増えても大丈夫ですし、○が絶対にない フィールドが増えても構いません。 補足の内容からすると、IDは○が絶対につかない でしょうから、本来からすると >For i = 1 To rs1.Fields.Count - 1 を For i = 0 To rs1.Fields.Count - 1 としてもかまわないのかもしれませんが、 一応このままでも支障はないはずです。 というのも、 rs.Fields(i)とすると、 iは0から始まります。つまりフィールドの Indexは0からはじまるということです。 もう少し説明をしておくと、質問の場合は、 rs!ID rs.Fields(0) rs.Fields("ID") は同じです。このあたりはいつか役に 立つかもしれません。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1です。 T縦のフィールドは ID 名前 を設定しておきます。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

基のテーブルをT横とします。 追加先のテーブルをT縦とします。 新しいフォームにボタンを一つ設定し、 そのボタンのクリック時のイベントに 以下を設定します。 クリック時のイベントの設定がわからなければ 以下のコードをコピーし、フォームのコード表を 開き、貼り付け保存します。 なお、以下はDAOを使っているので、コード表の ツールから参照設定を開き、 Microsoft DAO xx Object Library にチェックを入れ↑ボタンで上げられるところまで あげてください。xxは3.6のような数字です。 Private Sub コマンド0_Click() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim fld As Field Dim i As Integer Dim str As String Set db = CurrentDb Set rs1 = db.OpenRecordset("T横") Set rs2 = db.OpenRecordset("T縦", dbOpenDynaset) If rs1.RecordCount > 0 Then Do Until rs1.EOF For i = 1 To rs1.Fields.Count - 1 If Right(rs1.Fields(i).Value, 1) = "○" Then str = str & rs1.Fields(i).Value & "," End If Next i If Right(str, 1) = "," Then str = Left(str, Len(str) - 1) End If rs2.AddNew rs2!ID = rs1!ID rs2!名前 = str rs2.Update str = "" rs1.MoveNext Loop End If rs1.Close :Set rs1 = Nothing rs2.Close :Set rs2 = Nothing db.Close :Set db = Nothing End Sub わからないことがあれば補足してください。

abcdefg123456
質問者

補足

Microsoft DAO xx Object Library にチェックを入れ↑ボタンで上げられるところまで あげてください。xxは3.6のような数字です。 というところでチェックをいれてOKボタンを押すと。 「この名前は既にあるモジュール、プロジェクト、オブジェクトライブラリで使われています」との表示が出て、チェックがつきません… 基のテーブル(T横)はすでに、ほかのテーブルからクエリで項目選択をしているからいけないのでしょうか?関係ない?? ちなみに、フィールド名が「ID、名前1、名前2、名前3」のほかに追加した場合も同じコードで大丈夫でしょうか?(追加するフィールドには○印は絶対につきません。)

すると、全ての回答が全文表示されます。