• ベストアンサー

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

マイクロソフトアクセス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% (295/459)
回答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」のほかに追加した場合も同じコードで大丈夫でしょうか?(追加するフィールドには○印は絶対につきません。)

関連するQ&A

  • マイクロソフト アクセス使い方

    マイクロソフトのアクセスの使い方について教えてください。(初心者です) 【やりたい事】 Aというテーブルの企業IDに別のテーブルBの請求情報を付加したい。 どちらのテーブルにも企業IDが付加されています。 【プロセス】 ・アクセスに二つのテーブルを作成 ・クエリを作成 【困っている事】 フィールドに「企業ID」が表示されない。 故に、テーブルAとテーブルBにリレーションをつくれず、ひも付できない。 なぜフィールどが非表示になるのか?? ※「F1」と表示されてしまします。 どなたか教えていただけないでしょうか。 もしくは詳しい説明の仕方が書いてあるサイトを教えていただけないでしょうか。 何卒よろしくお願いいたします。

  • アクセスの抽出で

    1をIDとする会社名を抽出とすると、11や21のIDの会社も抽出されるんですが 何ででしょう? ちなみに、ド素人です。

  • ACCESSでの結合プロパティについて

    ACCESSでの結合プロパティは、3つあって、1つ目は2つのテーブルに共通するものだけを引っ張ってくる。 2つ目は片方の全部と、もう1方では、共通するものだけ。3つ目は、2つ目の逆。 両方のレコードを持ってくるということは出来ないのでしょうか? 例:「data」で結合して、表示は、今回厳密には定義しません。 テーブル1 ID data 1 a 2 b 3 c 4 d 5 e 6 f テーブルB ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j 結合プロパティ(1)では、 ID data 4 d 5 e 6 f 結合プロパティ(2)では、 ID data 1 a 2 b 3 c 4 d 5 e 6 f 結合プロパティ(3)では、 ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j となると思います。 今やりたいことは、全部持ってくることです。 ID data 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 I 10 j よろしくお願い致します。

  • 抽出した表でデータをカウントしたいのですが・・・

    タイトルにあるとおり、あるデータをオートフィルで抽出した状態で、その抽出結果からデータをカウントしたいのです。 以下のような表があったとします。    A  B  C  D  E   F  G  H  I 1  ○           ○  ○  ○ 2     ○  ○     ○        ○ 3        ○  ○  ○  ○ 4  ○  ○     ○     ○ 5     ○            ○  ○    ○ 6     ○  ○     ○        ○ 7  ○        ○        ○     ○ 8     ○  ○     ○        ○ 9  ○        ○  ○     ○ この表では、仮に各行○が4つとして、ランダムに各列に○が振り分けられています。 A列・4個、B列・5個、C列・4個、D列・4個、E列・6個、F列・4個、G列・4個、H列・3個、I列・2個 という状態です。    A  B  C  D  E   F  G  H  I 1  ○           ○  ○  ○ 2     ○  ○     ○        ○ 3        ○  ○  ○  ○ 4  ○  ○     ○     ○ 5     ○            ○  ○    ○ 8     ○  ○     ○        ○ 9  ○        ○  ○     ○ ある条件でオートフィルによって、抽出した結果が上の表です。 今回の例では6,7行が消えた状態だったとします。 それぞれ、A列・3個、B列・4個、C列・3個、D列・3個、E列・5個、F列・4個、G列・3個、H列・2個、I列・1個 と、いう結果になりました。 このような状態になった表で最下段、この場合9から上に向かって3行分の○をカウントするような方法、または便利な関数はありますでしょうか? 今回の例ですと、最下段から、3行分、5、8、9のそれぞれの列の○をカウントするという感じです。 A列・1個、B列・2個、C列・1個、D列・1個、E列・2個、F列・1個、G列・2個、H列・1個、I列・1個 これが今回の例における求めたい結果です。 抽出してない状態でしたら、OFFSET関数でいけるのですが、抽出した状態からだと私のスキルでは解決できません。 どなたか、ご存知の方ご教示よろしくお願いします^^;

  • ACCESS 比較後の抽出

    テーブル1 a_b テーブル2 c_d クエリ1 a&b:[a]+[b] c&d:[c]+[d] クエリでiif([a&b]=[c&d],"○","×") としたとき抽出条件に○としてもパラメータクエリが出てしまいます。 サブクエリを使うのでしょうが今一使い方が分かりません。 ご教授お願いします。

  • ACCESSでの日付抽出を教えて下さい

    Accessで日付を管理しているのですが、「yyyy/m/d h:mm」の形式から月ごとに抽出したいと考えています。テーブルで年と月と日付を別々に組めば抽出できるのですが、全て一括した形式での抽出はできるのでしょうか。

  • 巨大なCSVの加工(指定列のみの抽出)について

    巨大なCSVの加工(指定列のみの抽出)について 下記のような構成のCSVファイルがあります。 "ID","a","b","c","d","e","f","g","h","i","j","k","l","m" "0001","a","b","c","d","e","f","g","h","i","j","k","l","m" "0003","a","b","c","d","e","f","g","h","i","j","k","l","m" "0004","a","b","c","d","e","f","g","h","i","j","k","l","m" ・ ・ ・ 例えば、 ここから"ID"列と"c"列と"f"列のみ抽出して新たなCSVファイルで保存。 という処理を行いたいのですが、行数が5000万行近くあり、ファイルサイズが80GB程あるので エクセルはおろかアクセスでも開くことができません。 テキストエディタの秀丸64bit版なら開くことができますが、指定列の抽出方法が分かりません。 秀丸のマクロでもVBSでも良く、また膨大な待ち時間がかかっても構わないので実現する方法について お知恵をお貸しください。

  • マイクロソフトのアクセスでいくつかのデータと組み合わせて、

    マイクロソフトのアクセスでいくつかのデータと組み合わせて、 数値を並べたり、○×をつけることは可能でしょうか? アクセス初心者です。 もし分る方がいたら教えていただきたいです。 (1)【3月の来店者】 Aさん Bさん Cさん Dさん (4)【3月のA購入者】 Aさん Cさん Dさん (5)【3月のB購入者】 Cさん Dさん (6)【来店者の来店回数】 Aさん 1 Bさん 4 Cさん 7 Dさん 2 上記データを使って下記のようなデータベースを作りたいと考えています。 来店者 A購入 B購入 来店回数 Aさん ○ × 1 Bさん × × 4 Cさん ○ ○ 7 Dさん ○ ○ 2 (1)来店者から(2)Aを買った人の抽出や (1)来店者の(4)来店回数を出すのは 選択クエリを使いだすことができたのですが このようにすべての来店者のデータをリスト化することは可能でしょうか? すべてのデータ抽出後にIF関数などを使いエクセルでなら行えるかもしれないのですが データが180万行あるのでアクセス内で行えたら嬉しいです。 説明がわかりにくくて申し訳ないです。。。 もし分る方がいたら助けていただきたいです。 宜しくお願いいたします。

  • アクセスの抽出の仕方

    アクセス、クエリーの抽出方法を教えてください。 全くの素人です。 たとえば ○は1000件 ×は200件 ○は×を含んでいます ○中から×を抜いた件数を出すには、どう指定したらいいのでしょうか?

  • Excel のセル内の数字抽出

    セルの中にランダムの数字が入っている状態から、共通する数字を抽出する方法を教えてください。 例    A  B   C  D  E   F  G  H   I 1 228 236 246 258 241 452 785 453 741 2 478 247 236 159 147 236 478 345 236 3 222 223 445 160 401 305 360 236 474 この様な数字が1つのセルの中に入力されていて 1、236という数字がこの表の中にいくつ存在するかを抽出する方法。 2、各行・列を参照して共通する236を抽出する方法。 以上2点についてお願いいたします。

専門家に質問してみよう