- ベストアンサー
ACCESS クエリの抽出項目をEXCELから
Access2000のクエリの抽出項目をExcel2013の内容を抽出項目として指定するにはどうすればよいでしょうか。 Excelには、 佐藤 田中 鈴木 ......... のように縦に名前が最大18名分入っています。 この(最大)18名の名前をAccessの抽出項目とします(フィールドは10あってその6番目に抽出項目を18名分入力したいのです)。 18名を一人一人コピペしていたのですが、何とか簡素化できないものかな?と思っています。 できれば、マクロで一発で抽出項目を貼り付けたいのですが。 よろしくお願いします。
- Siam0710
- お礼率53% (15/28)
- その他(データベース)
- 回答数8
- ありがとう数9
- みんなの回答 (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
その他の回答 (7)
- 30246kiku
- ベストアンサー率73% (370/504)
#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 私からは以上です
補足
今回いただいた、マクロ。正直感動しました。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レース ・・・・・・・・・
- NotFound404
- ベストアンサー率70% (288/408)
問題なさげですけどねぇ。 もしかしたらパスにスペースが入っているから・・・ JRA Data Access DB を JRAData AccessDB とか JRA_Data Access_DB にしてみたら。。。 これで解決できなければ降参です。
お礼
あと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石川裕紀人 ・・・・・・・・・
補足
何度もありがとうございます。 パスのスペースも変更したり、フォルダを簡潔にしたりとしても駄目でしたが、...が、....... 申し訳ありません。 エクセルのセルの書式を数値に変更したら、問題なく作動しました。 私の無知でみなさまにご迷惑をお掛けし、申し訳ありませんでした。 いろいろ本を読んだり、検索したりして、ほんの少しACCESSをかじることができました。 もう少し勉強したいと思います。 ひとまずお礼まで。
- NotFound404
- ベストアンサー率70% (288/408)
えーとですね。 私の回答の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文をそのまま提示してください。
補足
Access、理解が乏しく申し訳ありません。 SELECT * FROM 2014 WHERE 騎手名 IN (SELECT * FROM [Sheet1$C1:C18] IN 'C:\JRA Data\Access DB\Book1.xls'[Excel 8.0;HDR=NO]);
- NotFound404
- ベストアンサー率70% (288/408)
>クエリの保存ができません クエリは表示されたのでしょうか? エラーメッセージからするとそうでも無さそうですね。 前回のコードのお終いの方に ~前略 qTmp.SQL = sSql debug.print qtmp.sql '追加します DoCmd.OpenQuery "Q_XL" '※ End Sub で、Ctrl + G でイミディエイトウィンドウが出ますので そこに SELECT [2014].ID, [・・・・・とか何かあるかと思いますので それを提示してみてください。
補足
ありがとうございます。 >クエリは表示されたのでしょうか? #2さんのクエリを書き換えて保存しようとしたらエラーになりました。 下に表示されたイミディエイトウィンドウには何も書かれていません。 左上に プロジェクト-New Data その2行下に New Data(2014)] とあります。 よろしくお願いします。
- NotFound404
- ベストアンサー率70% (288/408)
では、 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
補足
ご回答ありがとうございます。 次のメッセージが出て、クエリの保存ができません。 SQLステートメントが正しくありません。 'DELETE''INSERT''PROCEDURE''SELECT'または'UPDATE'を使用してください。 よろしくお願いします。
- 30246kiku
- ベストアンサー率73% (370/504)
> 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]); ※ 動かなかったら、スルーしてください
補足
ありがとうございます。 私の記述がまずいのか以下のメッセージが出ます。 「このテーブルには、このスプレッドシートで定義されている範囲外のセルが含まれています。」 よろしくお願いします。
- NotFound404
- ベストアンサー率70% (288/408)
さすがにマクロでクエリのデザイングリッドに貼り付ける方法は有りません。(多分) VBAでクエリのSQL文を書き換えることなら出来ます。 VBAでも構わなければ 仮定として C:\TEMPフォルダに123.xls Sheet2のC1~Cxxに連続して氏名がある テーブル名をTbl 現在のクエリ名をQ1 抽出条件を設定したいフィールド名をF6 を考えてみましたが、 そのクエリのSQL文が回答上欲しいです。 当方Office2010ですので Access2000 & Excel2013 での検証不可です。 バージョン違いのためにエラーになり、途中でギブアップするかもしれません。 ダメ元で試されるのならクエリのSQL文をどうぞ。 (フィールド名など公開したくない部分があれば適宜ぼかしてください)
補足
ありがとうございます。以下でよろしいでしょうか?(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 クエリで抽出
初心者です。クエリで抽出したのですが、一部のデータが抜け落ちます。抽出条件のフィールドはテキスト型で、元のテーブルでコピペで統一しましたが、同じデータが抜け落ちます。削除してやり直しても同様でした。重複クエリを作成するとこのフィールドが重複して出てきます。どこを直したらいいのか見当がつきません。よろしくお願いします。
- 締切済み
- その他MS Office製品
- ACCESSで重複するデータをまとめたいのですが
ACCESS超初心者です。 ヘルプを見たのですが解決できなかったので、ご質問させてください。 フィールド フィールド1 フィールド2 田中 A 田中 A B 田中 B → 鈴木 A 鈴木 A 佐藤 C 佐藤 C ACCESSで上記のようにデータをまとめたいのですが どのようなテーブル、クエリを組めばよいでしょうか? ご教示願います
- ベストアンサー
- その他(データベース)
- クエリで抽出した行をコンマで区切って1つの表に出力したい
クエリで抽出した同じフィールドの名前をコンマで区切って TEXTかWordに出力する方法が知りたいです。 たとえば、社員名のフィールドを選択クエリで抽出し、 「伊藤, 佐藤, 田中, 橋本・・・」のように全てのデータを コンマで区切って結合して1つのデータにし、TEXTかWordに コピーしたいんです。 レポートに出力するのでもかまいません。 普通にエクスポートすると、行になって出てきてし まいます。 素人の質問で済みません。 どなたかお知恵をお貸しください。
- ベストアンサー
- その他(データベース)
お礼
完璧です。 感動です。 Accessの本とネット検索で四苦八苦していましたが、Excelのマクロでできるとは考えもしませんでした。 記述内容は、少しずつ勉強していきます。 本当にありがとうございました。