• ベストアンサー

ACCESS クエリの抽出項目をEXCELから

Access2000のクエリの抽出項目をExcel2013の内容を抽出項目として指定するにはどうすればよいでしょうか。 Excelには、 佐藤 田中 鈴木 ......... のように縦に名前が最大18名分入っています。 この(最大)18名の名前をAccessの抽出項目とします(フィールドは10あってその6番目に抽出項目を18名分入力したいのです)。 18名を一人一人コピペしていたのですが、何とか簡素化できないものかな?と思っています。 できれば、マクロで一発で抽出項目を貼り付けたいのですが。 よろしくお願いします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.8

#7です 修正量がそう多くなかったので回答してみます。 修正点 ・ハイパーリンクしない ・出来上がるシート名は「1R」「2R」・・・「xR」 ・抽出内容が無くてもシートは初期化する ・騎手名は C1 から始まり、終了は空白が2行続いたら  (24 に限定せず、書かれていた分を処理する) Public Sub Samp2()   Dim cn As Object, rs As Object   Dim sSql As String, sS As String   Dim v As Variant   Dim iRow As Long, iRowN As Long, iR As Long   Dim i As Integer   Const adStateOpen = 1   Const PN2007 As String = "Microsoft.ACE.OLEDB.12.0"   Const PN2003 As String = "Microsoft.Jet.OLEDB.4.0"   Const CMDB As String = "\2014.mdb"   Const CSQL = "SELECT * FROM 2014 WHERE 騎手名 IN ('{%1}');"   On Error Resume Next   Set cn = CreateObject("ADODB.Connection")   For Each v In Array(PN2007, PN2003)     cn.Open "Provider=" & v _       & ";Data Source=" & ThisWorkbook.Path & CMDB     If (cn.State = adStateOpen) Then Exit For   Next   If (IsEmpty(v)) Then     MsgBox "環境不足で処理中断", vbCritical     Set cn = Nothing     Exit Sub   End If   On Error GoTo 0   Application.ScreenUpdating = False   With Worksheets("SheetDB")     iR = 1     iRow = 1     While (.Cells(iRow, "C") <> "")       iRowN = iRow       With .Cells(iRow, "C")         If (.Offset(1) <> "") Then iRowN = .End(xlDown).Row         v = WorksheetFunction.Transpose(.Resize(iRowN - iRow + 1))       End With       If (IsArray(v)) Then         sSql = Replace(CSQL, "{%1}", Join(v, "','"))       Else         sSql = Replace(CSQL, "{%1}", v)       End If       sS = iR & "R"       For Each v In Worksheets         If (v.Name = sS) Then Exit For       Next       If (IsEmpty(v)) Then         With Worksheets.Add(After:=Worksheets(Worksheets.Count))           .Name = sS         End With       Else         v.Activate         Cells.ClearContents       End If       Set rs = cn.Execute(sSql)       If (Not rs.EOF) Then         With Range("A1")           For i = 0 To rs.Fields.Count - 1             .Offset(, i) = rs(i).Name           Next           .Offset(1).CopyFromRecordset rs         End With       End If       rs.Close       Set rs = Nothing       iRow = iRowN + 2       iR = iR + 1     Wend     .Activate   End With   cn.Close   Set cn = Nothing   Application.ScreenUpdating = True End Sub

Siam0710
質問者

お礼

完璧です。 感動です。 Accessの本とネット検索で四苦八苦していましたが、Excelのマクロでできるとは考えもしませんでした。 記述内容は、少しずつ勉強していきます。 本当にありがとうございました。

その他の回答 (7)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.7

#2です #6さんの、お礼をみました。 > あと1点、お願いします。 と言われていますが、当初の質問内容からかけ離れているように思います。 (私の解釈違いかも?) また、何をしたいのかわかりません。 「同じ操作」とは、どの様な操作を指すのでしょうか? 勝手に前提条件を設定して、記述の一例を・・・ 条件は以下 ・Access ファイル名「2014.mdb」、Excel ファイル名「hoge.xls」 ・Access ファイルと、Excel ファイルは同じフォルダにある。 ・Access ファイル内には、テーブル「2014」がある。 ・そのテーブルには、フィールド「騎手名」(テキスト型)がある。 ・Excel ファイルには、シート「SheetDB」のみ。 ・Excelのシート「SheetDB」の C 列のどこかに騎手名が入っており、  その騎手名を用いて、Access ファイル内のテーブル「2014」からデータを抽出する。 ・結果は、騎手名をシート名にしたものを作成し、抽出データを書き出す。  C 列の騎手名の所に、騎手名のシートの A1 をハイパーリンク設定する(過剰仕様?) ・なお、騎手名のシートが既にあったら、抽出データのみ書き換える。 以下を、Excel ファイル「hoge.xls」の標準モジュールに記述し実行してみる。 ※ 操作は Excel ファイルで行う( Access ファイルはデータを見るだけ) Public Sub Samp1()   Dim cn As Object, rs As Object   Dim rng As Range, r As Range   Dim sSql As String, sS As String   Dim v As Variant   Dim i As Integer   Const adStateOpen = 1   Const PN2007 As String = "Microsoft.ACE.OLEDB.12.0"   Const PN2003 As String = "Microsoft.Jet.OLEDB.4.0"   Const CMDB As String = "\2014.mdb"   Const CSQL = "SELECT * FROM 2014 WHERE 騎手名='{%1}';"   On Error Resume Next   Set cn = CreateObject("ADODB.Connection")   For Each v In Array(PN2007, PN2003)     cn.Open "Provider=" & v _       & ";Data Source=" & ThisWorkbook.Path & CMDB     If (cn.State = adStateOpen) Then Exit For   Next   If (IsEmpty(v)) Then     MsgBox "環境不足で処理中断", vbCritical     Set cn = Nothing     Exit Sub   End If   On Error GoTo 0   Application.ScreenUpdating = False   With Worksheets("SheetDB")     Set rng = .Range("C:C").SpecialCells(xlCellTypeConstants)     For Each r In rng       sSql = Replace(CSQL, "{%1}", r.Value)       Set rs = cn.Execute(sSql)       If (Not rs.EOF) Then         For Each v In Worksheets           If (v.Name = r.Value) Then Exit For         Next         If (IsEmpty(v)) Then           With Worksheets.Add(After:=Worksheets(Worksheets.Count))             .Name = r.Value             r.Parent.Hyperlinks.Add r, "", .Name & "!A1"           End With         Else           v.Activate           Cells.ClearContents         End If         With Range("A1")           For i = 0 To rs.Fields.Count - 1             .Offset(, i) = rs(i).Name           Next           .Offset(1).CopyFromRecordset rs         End With       End If       rs.Close       Set rs = Nothing     Next     Set rng = Nothing     .Activate   End With   cn.Close   Set cn = Nothing   Application.ScreenUpdating = True End Sub 私からは以上です

Siam0710
質問者

補足

今回いただいた、マクロ。正直感動しました。ExcelでAccessを操作できるんですね。さらに リンクされていてデータが表示されるなんて、驚きました。 >「同じ操作」とは、 Excelにある    1-4(柴山~黛まで)をAccessから抽出し、ExcelのSheet1に貼り付け、 次に 6-7(吉田~浜名まで)をAccessから抽出し、ExcelのSheet2に貼り付け、 次に10-12(大野~岩田まで)をAccessから抽出し、ExcelのSheet3に貼り付け、 ......... といった作業を24回行いたいのです。 1行目から空白行の手前まで、次の空白行の手前まで(レース別)、を繰り返したいのです。 1-5行目は、処理が終われば削除しても構いません。各レース最大18名、最少4名います。 何人かが不規則なので空白行で区切った?つもりです。 よろしくお願い致します。 1柴山雄一  2伊藤工真 第1レース 3松岡正海 4黛弘人 5 6吉田豊 7北村宏司     第2レース 8浜中俊 9 10大野拓弥 11赤岡修次 第3レース 12岩田康誠 13 14石川裕紀人 第4レース ・・・・・・・・・

回答No.6

問題なさげですけどねぇ。 もしかしたらパスにスペースが入っているから・・・ JRA Data Access DB を JRAData AccessDB とか JRA_Data Access_DB にしてみたら。。。 これで解決できなければ降参です。

Siam0710
質問者

お礼

あと1点、お願いします。 C:\JRA\Accessに 「2014.mdb」と「出馬表当日.xls」が保存されています。 「出馬表当日.xls」のデータを抽出項目として使用します。 「出馬表当日.xls」のSheetDBのC列に、以下のようにAccessの抽出項目としたい騎手名が並んでいます。 まず1~4人、次に6~8、その次が10~12と空白行ごとに抽出して、その結果を「出馬表当日.xls」にシートを変えて貼り付けたいのです。 同じ操作を24回行います。(Sheet1~24までに保存) 教えていただいたSQLで24回繰り返すのを簡素化したいのですが、御教示いただけないでしょうか。 何度もすみませんが、よろしくお願い致します。 1柴山雄一 2伊藤工真 3松岡正海 4黛弘人 5 6吉田豊 7北村宏司 8浜中俊 9 10大野拓弥 11赤岡修次 12岩田康誠 13 14石川裕紀人 ・・・・・・・・・

Siam0710
質問者

補足

何度もありがとうございます。 パスのスペースも変更したり、フォルダを簡潔にしたりとしても駄目でしたが、...が、....... 申し訳ありません。 エクセルのセルの書式を数値に変更したら、問題なく作動しました。 私の無知でみなさまにご迷惑をお掛けし、申し訳ありませんでした。 いろいろ本を読んだり、検索したりして、ほんの少しACCESSをかじることができました。 もう少し勉強したいと思います。 ひとまずお礼まで。

回答No.5

えーとですね。 私の回答のVBAでの処理でエラーになったのではなく、 #2 さんの回答の SELECT * FROM ★★ WHERE 氏名 IN (SELECT * FROM [Sheet1$C1:C18] IN 'D:\Hoge\hoge.xls'[Excel 8.0;HDR=NO]); を書き換えて試そうとしたが、 >SQLステートメントが正しくありません。 >'DELETE''INSERT''PROCEDURE''SELECT'または'UPDATE'を使用してください とエラー表示されたということでしょうか? であれば、その実際のSQL文をそのまま提示してください。

Siam0710
質問者

補足

Access、理解が乏しく申し訳ありません。 SELECT * FROM 2014 WHERE 騎手名 IN (SELECT * FROM [Sheet1$C1:C18] IN 'C:\JRA Data\Access DB\Book1.xls'[Excel 8.0;HDR=NO]);

回答No.4

>クエリの保存ができません クエリは表示されたのでしょうか? エラーメッセージからするとそうでも無さそうですね。 前回のコードのお終いの方に ~前略 qTmp.SQL = sSql debug.print qtmp.sql '追加します DoCmd.OpenQuery "Q_XL" '※ End Sub で、Ctrl + G でイミディエイトウィンドウが出ますので そこに SELECT [2014].ID, [・・・・・とか何かあるかと思いますので それを提示してみてください。

Siam0710
質問者

補足

ありがとうございます。 >クエリは表示されたのでしょうか? #2さんのクエリを書き換えて保存しようとしたらエラーになりました。 下に表示されたイミディエイトウィンドウには何も書かれていません。 左上に プロジェクト-New Data その2行下に New Data(2014)] とあります。 よろしくお願いします。

回答No.3

では、 C:\TEMPフォルダに123.xls Sheet2のC1~Cxxに連続して○×がある Q_XL という名のクエリ(中身はテキトーで可)がある という仮定の下です。 下記モジュールを実行してみてください(ダメ元で)。 ※は変更が必要な部分です。 Sub XLQ() Dim oXl As Object Dim r As Variant, rEnd As String Dim i As Integer Dim sWhere As String, sSql As String Dim qTmp As DAO.QueryDef Set oXl = CreateObject("excel.application") oXl.workbooks.Open "c:\temp\123.xls", ReadOnly:=True '※ファイルパス rEnd = CStr(oXl.workbooks("123.xls").worksheets("sheet2").Range("C:C").End(-4121).Row) '※ファイル名、シート名、セル列名 r = oXl.workbooks("123.xls").worksheets("sheet2").Range("c1:C" & rEnd) '※ファイル名、シート名、セル列名 sWhere = "'" For i = 1 To UBound(r) sWhere = sWhere & r(i, 1) & "','" Next sWhere = Left(sWhere, Len(sWhere) - 2) oXl.Quit Set oXl = Nothing sSql = "SELECT [2014].ID, [2014].レースID, [2014].芝0・ダ1, [2014].平地0・障害1, [2014].距離, [2014].騎手名, [2014].調教師名, [2014].人気, [2014].単勝オッズ, [2014].着順, [2014].開催 FROM 2014" sSql = sSql & " WHERE 開催地 in (" & sWhere & ")" '※フィールド名は開催地? Set qTmp = CurrentDb.QueryDefs("Q_XL") '※Q_XL という名前のクエリは適当に qTmp.SQL = sSql DoCmd.OpenQuery "Q_XL" '※ End Sub 末尾ながら、 #2さんのご回答で問題ないことが当方では確認できました。Office2010 & Office2002

Siam0710
質問者

補足

ご回答ありがとうございます。 次のメッセージが出て、クエリの保存ができません。 SQLステートメントが正しくありません。 'DELETE''INSERT''PROCEDURE''SELECT'または'UPDATE'を使用してください。 よろしくお願いします。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> Access2000のクエリの抽出項目をExcel2013の内容を抽出項目 これは、Excel の拡張子 xls 以外では無理だと思います。 (2000 で、xlsx, xlsm 等を解釈できるとは思えない) Excel ファイルが、D:\Hoge\hoge.xls で、 その中の Sheet1 の C1:C18 に氏名が入っていたとして、 テーブル「★★」内の、「氏名」フィールドに対して絞り込みするのであれば、 雰囲気、以下の様になるかも クエリのSQLビューで記述します SELECT * FROM ★★ WHERE 氏名 IN (SELECT * FROM [Sheet1$C1:C18] IN 'D:\Hoge\hoge.xls'[Excel 8.0;HDR=NO]); ※ 動かなかったら、スルーしてください

Siam0710
質問者

補足

ありがとうございます。 私の記述がまずいのか以下のメッセージが出ます。 「このテーブルには、このスプレッドシートで定義されている範囲外のセルが含まれています。」 よろしくお願いします。

回答No.1

さすがにマクロでクエリのデザイングリッドに貼り付ける方法は有りません。(多分) VBAでクエリのSQL文を書き換えることなら出来ます。 VBAでも構わなければ 仮定として C:\TEMPフォルダに123.xls Sheet2のC1~Cxxに連続して氏名がある テーブル名をTbl 現在のクエリ名をQ1 抽出条件を設定したいフィールド名をF6 を考えてみましたが、 そのクエリのSQL文が回答上欲しいです。 当方Office2010ですので Access2000 & Excel2013 での検証不可です。 バージョン違いのためにエラーになり、途中でギブアップするかもしれません。 ダメ元で試されるのならクエリのSQL文をどうぞ。 (フィールド名など公開したくない部分があれば適宜ぼかしてください)

Siam0710
質問者

補足

ありがとうございます。以下でよろしいでしょうか?(SQL文が全く分からないもので) SELECT [2014].ID, [2014].レースID, [2014].芝0・ダ1, [2014].平地0・障害1, [2014].距離, [2014].騎手名, [2014].調教師名, [2014].人気, [2014].単勝オッズ, [2014].着順, [2014].開催 FROM 2014 WHERE ((([2014].開催)="京都"));

関連するQ&A

  • Access 番号をつける方法

    お世話になっております。 access2010でクエリに番号を割り振ろうと思っています。 「ID」は昇順に並んでおり、同一の「ID」に対しての連番をつけたいです。 クエリ フィールド名:ID、名前 001 田中 001 佐藤 002 山田 003 鈴木 ☆完成図 フィールド名:番号、ID、名前 1 001 田中 2 001 佐藤 1 002 山田 1 003 鈴木 Accessでもexcelのcount関数を使うことはできるのでしょうか? それとも、DCountを使うのでしょうか? 2つ関数の使い方や、用途の違いがよくわかりません。 ご存知の方教えて下さい。よろしくお願いします。

  • Access 複数の抽出条件

    Access2002 windows2000 (例)次のようなテーブルとします。 フィールド名:名前 年齢 性別 レコード1 :山本 30 男 レコード2 :鈴木 40 女 レコード3 :田中 45 男 レコード4 :森本 26 女 クエリを利用して抽出する時、年齢が40以上で男を条件とすれば (1)年齢フィールドの抽出条件:>=40 (2)性別フィールドの抽出条件:男 として、田中が抽出されます。 では年齢が40以上で男、そして女は全て抽出したい時は(1)(2)の条件はどの様にすればいいでしょう? 抽出結果が 田中、鈴木、森本となりたいのです。 複数のクエリを作れば出来ますが、1つのクエリでは無理なのでしょうか。

  • Accessの選択クエリの抽出条件について

    いちもお世話になります。Access2002を勉強中の初心者です。 顧客テーブルから選択クエリを作っています。クエリのフィールドには「都道府県」(東京、埼玉、千葉...)と「顧客名」(山田、佐藤、田中...)があります。 「顧客名」の山田以外を抽出したいのですが、但し「都道府県」が東京の場合は山田以外の条件を外したいのです。つまり、埼玉、千葉の山田は抽出しませんが東京の山田は抽出したいのです。 このような抽出条件の設定ができますか? アドバイス、よろしくお願いします。

  • クエリを結合したいのですが…。

    クエリを結合したいのですが…。 クエリ1、クエリ2、があったとして、 クエリ1には 代表者名、家族名a、 佐藤太郎、佐藤花子 鈴木四郎、鈴木桜 クエリ2には 代表者名、家族名b、 田中一郎、田中菊 とあったとします。 新しくクエリを作成し、 代表者名、家族名 佐藤太郎、佐藤花子 鈴木四郎、鈴木桜 田中一郎、田中菊 と、クエリ1とクエリ2を合わせたものを作りたいのですが、実際可能でしょうか?アクセス2003を使用しています。ご教授宜しくお願い致します。

  • AccessのクエリとExcelの外部データの取り込み機能について

    AccessのクエリとExcelの外部データの取り込み機能について 質問させてください。 Access初心者です。 クエリの抽出条件でnot likeを使うと Accessで実行したときには正常に動作するんですが、 Excelの外部データの取り込みのAccessデータベースを選択してExcelへ出力すると 正常に出力されません。 具体例ですが、 ---------------------------------- 住所フィールドには東京都の自治体の名前 個人フィールドには担当者の名前 ---------------------------------- が入ってるとします。 クエリの抽出条件は以下のような感じです。 ---------------------------------- 個人フィールド,住所フィールド 鈴木,not like "*八王子市*" 斉藤, 田中, ---------------------------------- そうするとAccessのクエリの実行結果では 鈴木さんの八王子市を抜いたデータ 斉藤さんの全データ 田中さんの全データ が出力されると思います。 しかし、Excelの外部データ取り込みを使うと 鈴木さんの全データ 斉藤さんの全データ 田中さんの全データ が出力されてしまいます。 どうすれば正常出力できるのでしょうか? Accessからコピー&ペーストしてExcelに貼り付けるしかないのでしょうか? (参考) ・使っているOfficeは2007SP2です。

  • Accessのクエリで、CStr関数を使った項目のグループ化と抽出のエラー

    アクセスで「TEST1」という名のクエリでCStr関数を使って数値を文字型にしている「項目1」という名のフィールドがあります。(他にもフィールドはあります) 別のクエリ(「TEST2」)で、「TEST1」クエリを使って、「項目1」フィールドをグループ化し、さらに抽出条件に『 "1" 』と入れて実行したところ、 『集計関数の一部として指定された式 '[TEST1].項目1="1"' を含んでいないクエリを実行しようとしました。』 とメッセージが出て実行できませんでした。 ◎ 数値を文字型にしたものをグループ化しさらに抽出条件で絞り込みたいのですが、どうしたらいいのでしょうか? 「TEST1」クエリをテーブルにしないで実行したいのですが。。。 わかる方がいらっしゃったら、教えてください。よろしくお願いします。

  • アクセスのクエリに「PHONETIC」関数はないのですか?

    アクセス2003です。 テーブル1 名前 佐藤 鈴木 木村 を クエリ1にて 名前  ふりがな 佐藤   サトウ 鈴木   スズキ 木村   キムラ というようなフィールドを作成したいのですが クエリのデザインビューのビルドで見る限りだと 「PHONETIC」関数がありませんでした。 クエリではなくテーブルに手打ちするしかないのでしょうか? よろしくお願い致します。

  • access2007 クエリで抽出

    初心者です。クエリで抽出したのですが、一部のデータが抜け落ちます。抽出条件のフィールドはテキスト型で、元のテーブルでコピペで統一しましたが、同じデータが抜け落ちます。削除してやり直しても同様でした。重複クエリを作成するとこのフィールドが重複して出てきます。どこを直したらいいのか見当がつきません。よろしくお願いします。

  • ACCESSで重複するデータをまとめたいのですが

    ACCESS超初心者です。 ヘルプを見たのですが解決できなかったので、ご質問させてください。    フィールド        フィールド1 フィールド2 田中  A        田中 A       B 田中  B    →   鈴木 A 鈴木  A        佐藤 C 佐藤   C ACCESSで上記のようにデータをまとめたいのですが どのようなテーブル、クエリを組めばよいでしょうか? ご教示願います

  • クエリで抽出した行をコンマで区切って1つの表に出力したい

    クエリで抽出した同じフィールドの名前をコンマで区切って TEXTかWordに出力する方法が知りたいです。 たとえば、社員名のフィールドを選択クエリで抽出し、 「伊藤, 佐藤, 田中, 橋本・・・」のように全てのデータを コンマで区切って結合して1つのデータにし、TEXTかWordに コピーしたいんです。 レポートに出力するのでもかまいません。 普通にエクスポートすると、行になって出てきてし まいます。 素人の質問で済みません。 どなたかお知恵をお貸しください。