• ベストアンサー

エクセルでクエリー

最近エクセルのVBAでDAOを使うと、アクセスのテーブルを読み込んだり出来ることを知りました。 この機能を使えば、エクセル上でアクセスでのクエリーと同じことが出来るのではないかと思って色々試してみましたが、いまひとつうまくいきません。 例えば、 シート1にあるデータ(1行目から全てデータ)を A列でグルーピングしてB列の合計をだし B列の合計が0を超えるレコードを シート2に貼り付けるといったことは可能でしょうか? サンプルのコードか参考となるホームページ、本などありましたら教えてください

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

要:DAO参照設定 シート1[A1~[A5]に、環境を設定 Sub Main()     Dim strDB       As String     Dim strTbl      As String     Dim strFldGrp   As String     Dim strFldSum   As String     Dim lngMin      As Long          Dim daoDB       As DAO.Database     Dim daoRs       As DAO.Recordset     Dim strSQL      As String     Dim strSQLSum   As String     Dim lngRow      As Long     Dim lngCol      As Long               '環境値リード     With ThisWorkbook.Sheets(1)         strDB = .Cells(1, 1)     'DBパス         strTbl = .Cells(2, 1)    'テーブル名         strFldGrp = .Cells(3, 1) 'グルーピングするフィールド         strFldSum = .Cells(4, 1) '集計するフィールド         lngMin = .Cells(5, 1)    '最小値     End With               Set daoDB = DBEngine.Workspaces(0).OpenDatabase(strDB)          '集計部分     strSQLSum = "SUM(" & strFldSum & ")"          strSQL = ""     strSQL = strSQL & "SELECT" & vbCrLf     strSQL = strSQL & "     " & strFldGrp & vbCrLf     strSQL = strSQL & "    ," & strSQLSum & " AS 集計値" & vbCrLf     strSQL = strSQL & "FROM" & vbCrLf     strSQL = strSQL & "     " & strTbl & vbCrLf     strSQL = strSQL & "GROUP BY" & vbCrLf     strSQL = strSQL & "     " & strFldGrp & vbCrLf     strSQL = strSQL & "HAVING" & vbCrLf     strSQL = strSQL & "     " & strSQLSum & " > " & lngMin & vbCrLf          Debug.Print     Debug.Print strSQL     Set daoRs = daoDB.OpenRecordset(strSQL, dbOpenDynaset)     With ThisWorkbook.Sheets(2)              For lngCol = 1 To daoRs.Fields.Count             .Cells(1, lngCol) = daoRs.Fields(lngCol - 1).Name         Next lngCol              lngRow = 1         Do Until daoRs.EOF             lngRow = lngRow + 1             For lngCol = 1 To daoRs.Fields.Count                 .Cells(lngRow, lngCol) = daoRs.Fields(lngCol - 1).Value             Next lngCol                          daoRs.MoveNext         Loop                  .Activate     End With     daoRs.Close     daoDB.Close     Set daoRs = Nothing     Set daoDB = Nothing End Sub

TOMO_32
質問者

補足

遅れましたが、エクセルのシートをデータベースとして扱うことになんとか成功しました。 初心者の作ったものなので見せるほどではないですが、参考までにこんなコードになりました。 C:\DB.xlsは曜日のフィールドとデータのフィールドがあり、曜日毎のデータの合計値を計算します。 アクセスとの違いは$をつけないとテーブルにならないことや、OpenDatabaseのオプションに"Excel 8.0をいれることぐらいでしょうか。 Sub Main() Dim strDB As String Dim strTbl As String Dim daoDB As DAO.Database Dim daoRs As DAO.Recordset Dim strSQL As String strDB = "c:\DB.xls" 'DBパス strTbl = "DATA$" 'テーブル名 'エクセルファイルをデータベースとして読み込み Set daoDB = DBEngine.Workspaces(0).OpenDatabase(strDB, False, False, "Excel 8.0;HDR=Yes;") strSQL = "SELECT [DATA$].曜日, Sum([DATA$].D1) AS D1の合計 FROM [DATA$] GROUP BY [DATA$].曜日;" Set daoRs = daoDB.OpenRecordset(strSQL) 'フィールド名を取得 I = 0 For Each FLD In daoRs.Fields Sheets(2).Cells(1, 1).Offset(0, I) = daoRs.Fields(I).Name I = I + 1 Next '取得したレコードセットをシートに貼り付け Sheets(2).Range("a2").CopyFromRecordset daoRs daoRs.Close daoDB.Close Set daoRs = Nothing Set daoDB = Nothing End Sub

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

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

SQL.REQUESTワークシート関数が質問文のような目的のために使えます。 ただし、1行目には、フィールド名となる項目名が必要です。 あと、テーブルとなる範囲が範囲名として定義されている必要があります。 結果は配列になるので、レコード数の分だけのセルに配列式として入力する必要があります。

参考URL:
http://okweb.jp/kotaeru.php3?qid=1153725
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • WEBクエリを処理していくVBAについて

    初めまして。 ExcelのVBAについての質問です。 WEBクエリを用いて、データを回収したいのですが まだVBAを勉強したてで、作りたいものがあるのに 作れず困っています。 sheet1 A列    B列 あああ http://aaaaa.co.jp/aaaa.html いいい http://aaaaa.co.jp/bbbb.html うううう http://aaaaa.co.jp/bbbb.html というものがあり このB列のURLを上から順番にWEBクエリによってデータを得て 「新しいシート」に貼り付け この新しいシートのシート名を、A列の対応する行の名前で順番に付けていきたいです。 aaaa.html → 「あああ」シート bbb.html → 「いいい」シート という感じです。 この処理を何回か続けていくVBAを教えていただきたいです。 宜しくお願い致します。

  • Access複数のクエリをExcelの1シートに出力

    お世話になります。 Accessのクエリ結果をVBAでExcelへ出力をしたいと思っています。 内容としては例えば、「Q_aaa」「Q_bbb」「Q_ccc」というクエリの結果をExcel に出力したいのですが、別々のシートではなく、ひとつのシートにまず「Q_aaa」 を出力し、その次の行から「Q_bbb」を、またその次に「Q_ccc」を…という動き をさせたい思っています。 なお、それぞれのクエリ結果のレコード数は決まっていません。 サンプルコード、参考サイト、もしくは考え方でもお教え頂ければ幸いです。 宜しくお願い致します。

  • ExcelからAccessのクエリを呼び出したい

    約20,000レコードほどのデータを一気にExcelのVBA上の選択SQLでEditとUpdateで処理しようと思ったのですが、一気に処理できるレコード数に制約があるようでエラーになりました。 Access内のクエリだとOKみたいですがExcelからAccessのクエリを呼び出す方法がわかりません。 どうしたらいいのでしょうか? よろしくお願いします。 バージョンは2002です。

  • エクセルVBAとWEBクエリに関する質問です

    まったくの初心者ですが、エクセルのVBAとWebクエリを駆使して、 大量(1000強)のWebページから商品情報を エクセルへ入力していくプログラムを作成したいと考えています。 やりたいことは (1)エクセルのA列にurlを1000個並べ (2)プログラムを実行すると、上から順にurlへ自動でアクセス (3)各ページの商品情報を取得(テーブルデータ)し、エクセルに入力していく 例)B列:商品名、C列:商品番号、D列:通常価格、E列:カラー展開、F列:サイズ展開 という具合に、次々と自動で商品情報を入力していくプログラムです。 エクセルのVBAとWebクエリを活用して以上のようなことをするのは可能でしょうか? VBAにてLinkの取得や、Webクエリにてテーブルデータの取得ができるのは わかったのですが、自動でアクセスして、表ではなく区切り線ごとにデータを並べたいのです。 もし可能でしたらどのようにすれば可能になるか教えていただけないでしょうか。 不可能だとした場合は、何か可能になる方法をご教唆いただけないでしょうか。 お手数ですが、ご回答よろしくお願いいたします。

  • エクセル複数シートをアクセスで1つのテーブルに。

    エクセルのシートで1000行程度のものが5シートあります。それぞれは数字列に文字が入っている行もあってエクセルでの必要データ抽出に手間がかかってしまいます。「エクセル5シートをアクセスでリンクさせクエリで特定文字行を削除し、テーブル構造が整ったところでテーブル作成を行う」までをアクセスで自動化したいと思っています。アクセス側でエクセル5シートを一括して合体させる事は出来ないものでしょうか?宜しくお願い致します。

  • アクセスクエリについて質問です。

    アクセスクエリについて質問です。 A列:得意先コード B列:売上額 でA列2行:A社大阪 B列2行:\10,000 A列3行:B社東京 B列3行:\20,000 A列4行:A社京都 B列4行:40,000 のテーブルがある時、クエリで A社 50,000 B社10,000 というデータを抜きたいのですがどうしたらいいのかがわかりません。A社の営業所単位での売上額を合計し、なおかつ 営業所名のないA社とする。簡単なようで難しく、困っています。どなたかわかる方いらっしゃいましたら、御教授お願いします。

  • アクセス 複数クエリ⇒エクセルの各シートに

    MS Access と MS Excelとの連携テクニックについて、 教えてください。 アクセスで、クエリA・クエリB があるとすると、 マクロ・VBAを使用して、 これらを、エクセルファイル(ファイル名は任意)の 各シートとして、Sheet1,Sheet2としてエクスポートしたいのですが、 可能でしょうか?

  • アクセスの外部データ(エクセル)の取り込み。VBA

    アクセスの外部データ(エクセル)の取り込み。VBAの質問です。 アクセス2003 エクセル2003 不要な行・列がある場合の外部データ取り込みVBAを教えて下さい。 今は、エクセルで削除して取り込んでいます。 アクセスに「得意先リスト」というテーブルを作っています。 コード(テキスト型)主キー 名称(テキスト型) フリガナ(テキスト型) 郵便番号(テキスト型) 住所1(テキスト型) 住所2(テキスト型) TEL(テキスト型) FAX(テキスト型) エクセルブック[得意先リスト.xls] シートは「リスト形式」のみです。 1~4行は不要。 5行目が見出しです。 A~AZ列までデータがあります。 必要な列は、B・C・D・F・G・H・M・N列です。 セルの書式設定は「文字列」です。 [アクセス エクセル インポート 行 列 削除]などでサンプルVBAを探しましたが見つからなかったので質問させて頂きました。 申し訳ありませんが、教えて下さい。

  • アクセスのクエリーについて

     アクセス初心者です。  例えばテーブル1に以下のようなデータがあります。  A     鈴木  佐藤  もう1つテーブル2があります  B  1  2 そこでクエリーを作成し テーブル1とテーブル2の列を1つにまとめます。この時テーブル1とテーブル2に関連性はなく、リレーションシップはつけません。そうすると A  B  鈴木 1 鈴木 2 佐藤 1 佐藤 2 となります。 イメージ的に A  B 鈴木 1 佐藤 2 というように単純に列をつけたいのです。エクセルなら簡単に出来ますがアクセスでは出来ないでしょうか。

  • クエリの作り方はこれでよいでしょうか

    Access2010で以下のことをやりたいのですが、助言ください。 ・元データはExcelに入っている。 ・sheet1のA列のみに抽出用の番号(商品番号000000001とか)が入力されています。(数千行) ・sheet2はデータベースで、A列に商品番号(こちらは複数同じものあり)、B列に商品名、C列に国名、D列に価格・・~その後J列まで情報が入っています。(行数は1万行以上・・10万行近かったです) 【やりたいこと、現状】 ・sheet1に入っている商品番号でsheet2のデータベースに抽出をかけて、Excelに抽出結果シートを作りたい。 ・最終的にはExcelファイルにしたい。 ・途中経過では現在Accessを使っている。 ・Sheet1に商品番号があっても、Sheet2にないものがある。データベースにない場合も抽出結果シートには反映させたい。(商品番号だけ抽出結果に表示させて、右の列はすべて空欄にしたい) 【やったこと】 ・sheet1をT抽出条件、sheet2をTデータベースとしてAccessにインポートしてテーブルを作りました。 (T抽出条件はA列しかないので、主キーは商品番号、TデータベースはID列を追加して主キーに) ・リレーションを商品番号でかけて、クエリを作成(Q結果) →クエリで使った項目 T抽出条件から商品番号 TデータベースからはIDと商品番号を除くものすべて。 このQ結果をExcelにエクスポートし、完成! と思ったのですが、これだとsheet1にはあって、sheet2にはない商品番号の情報が載ってきません。 sheet1にはあるけど、sheet2にはない情報も載せたいのです。 どのようにしたらよいでしょうか。 また、上記の方法で問題はないでしょうか。 結果が数千も出るので確かめようがありません。 どこがおかしければご指摘ください。 また、確かめ方などもありましたら、ご教授ください。 よろしくお願いします

このQ&Aのポイント
  • WRC-2533G52のPOWERランプが紫色から緑色にならない理由について教えてください。
  • エレコム株式会社の製品、WRC-2533G52のPOWERランプが紫色から緑色にならない理由を教えてください。
  • 質問です。WRC-2533G52のPOWERランプがなぜ紫色から緑色にならないのか教えてください。
回答を見る

専門家に質問してみよう