プロが教える店舗&オフィスのセキュリティ対策術

NO 社員No 日付     商品コード 販売個数 顧客No  請求月    売上
1 106092 2009/2/2(月) A-1010 89    C202 2009/4/30   3,560
2 106091 2009/2/2(月) B-1050 527    C384 2009/3/31   68,510
3 106045 2009/2/2(月) C-1050 819    C384 2009/3/31   114,660
4 106753 2009/2/2(月) C-1080 662    C202 2009/4/30    66,200
5 104523 2009/2/2(月) A-1010 160   C499    2009/4/30 16,000
6 106785 2009/2/2(月) D-1050 815   C202    2009/4/30 97,800
7 105412 2009/2/2(月) A-1010 373    C165 2009/3/31   41,030
8 155722 2009/2/2(月) B-1020 62    C165 2009/3/31   6,200
9 132547 2009/2/2(月) A-1150 486    C165 2009/3/31    38,880

この売上げ Sheetデータを別シート集計にSQLにて
抽出したい。
条件は A-1010 売り上げの合計 
抽出先は別シート集計
SELECT 社員No 商品コード 売上合計 FROM テーブル名 ここからわからい

Sub Excelに接続()
Dim myCon As New ADODB.Connection, FileName As String
Dim conStr As String

'接続先のExcelファイル
FileName = "C:\Users\.....\Desktop\DataBook.xlsx"

'接続文字列
conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Extended Properties=Excel 8.0;" & _
"Data Source=" & FileName

ここから教えてくれませんでしょうか

よろしくお願いいたします。

質問者からの補足コメント

  • へこむわー

    \test.xlsx 純粋にBOOK名の名前にしました。
    "Excel 12.0;HDR=YES;" ' これは表の一行目をタイトルにするという意味調べました。
    後は
    activesheetを表示させて
    標準モジュールに貼り付け実行

    Dim objCn As New ADODB.Connection
    この部分が青く反転する

    僕の何かが違うわからない

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/12/03 11:38

A 回答 (3件)

>SELECT 社員No 商品コード 売上合計 FROM テーブル名



この場合、『社員No』と『商品コード』を対にして『売上』の合計をだすので、

>条件は A-1010 売り上げの合計 

『商品コード』毎の『売上の合計』は出せないと思います。

-----結果-----
社員No 商品コード 売上合計
104523 A-1010 16000
105412 A-1010 41030
106092 A-1010 3560
------------

取り敢えずそこは置いておくとして、まずtest.xlsを実行するBookと同じフォルダに置き
アクティブシートに結果を出すと言う極基本からやるとします。
質問者さんが見ていた
http://excel-ubara.com/excelvba5/EXCEL114.html
ここを参考に
---
※Excel2007以降では、
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0"
---
これを古い2002に押し込んだコードです。

Sub test()
  Dim objCn As New ADODB.Connection
  Dim objRS As ADODB.Recordset
  Dim i As Integer
  Dim strSQL As String

  With objCn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Properties("Extended Properties") = "Excel 12.0;HDR=YES;" '★HDR(ヘッダー)の扱いに注意
    .Open ThisWorkbook.Path & "\test.xls" '★ブック名.拡張子に注意
  End With
 
  strSQL = ""
  strSQL = strSQL & " SELECT 社員No,商品コード,SUM(売上) AS 売上合計"
  strSQL = strSQL & " FROM [Sheet1$]" '★シート名に注意!
  strSQL = strSQL & " WHERE 商品コード = 'A-1010'"
  strSQL = strSQL & " GROUP BY 社員No,商品コード,売上;"
 
  Set objRS = New ADODB.Recordset
  Set objRS = objCn.Execute(strSQL)
 
  With ActiveSheet '★ActiveSheetを使用
    .Range(.Range("A2"), .Range("A2").SpecialCells(xlLastCell)).ClearContents
    For i = 0 To objRS.Fields.Count - 1
      .Cells(1, i + 1).Value = objRS.Fields(i).Name
    Next
    .Range("A2").CopyFromRecordset objRS
  End With
 
  objCn.Close
  Set objCn = Nothing
End Sub

-----

接続先のBookのPathは ThisWorkbook.Path ですけど、この点は理解OKでしょうかね。
SQL文のSELECTの中から『社員No』 と GROUP BYの中ら『社員No』『売上』を抜けば、純粋に『商品コード(A-1010)』の『売上合計』が1行でだせますよ。
この回答への補足あり
    • good
    • 1

No.1の回答に対する補足について。



>Dim objCn As New ADODB.Connection
>この部分が青く反転する

エラー内容が不明ですが、まずは参照設定がされていないとなりますよ。
少なくとも以前別の件で『接続』には成功しているのですよね?
    • good
    • 1

No.1の参照設定を省くコードです。



新しいBookでテストする時に参照設定のし忘れをしがちならこちらでも。

Sub test_2()
  Dim objCn As Object '★参照設定なし版
  Dim objRS As Object '★参照設定なし版
  Dim i As Integer
  Dim strSQL As String

  Set objCn = CreateObject("ADODB.Connection") '★参照設定なし版
  Set objRS = CreateObject("ADODB.Recordset") '★参照設定なし版
  
  With objCn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Properties("Extended Properties") = "Excel 12.0;HDR=YES;" '★HDR(ヘッダー)の扱いに注意
    .Open ThisWorkbook.Path & "\test.xls" '★ブック名.拡張子に注意
  End With
 
  strSQL = ""
  strSQL = strSQL & " SELECT 社員No,商品コード,SUM(売上) AS 売上合計"
  strSQL = strSQL & " FROM [Sheet1$]" '★シート名に注意!
  strSQL = strSQL & " WHERE 商品コード = 'A-1010'"
  strSQL = strSQL & " GROUP BY 社員No,商品コード,売上;"
 
  Set objRS = objCn.Execute(strSQL)
 
  With ActiveSheet '★ActiveSheetを使用
    .Range(.Range("A2"), .Range("A2").SpecialCells(xlLastCell)).ClearContents
    For i = 0 To objRS.Fields.Count - 1
      .Cells(1, i + 1).Value = objRS.Fields(i).Name
    Next
    .Range("A2").CopyFromRecordset objRS
  End With
 
  objCn.Close
  Set objCn = Nothing
  Set objRS = Nothing
End Sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!