EXCELとACCESSを使った運用 Part.2
EXCELとACCESSを使った運用 Part.1からの続きです。
今回はACCESSに入っているデータを、EXCELに抽出します。
ざっくり説明します。
Accessはデータベース管理システムのソフトウェアです。容量等に制限があり、あまり大きなデータは向きません。
一件のデータの大きさにもよりますが、数百万件程度ぐらいなら大丈夫だと思います。
以下の例は、AccessへSQLを使用して、EXCEL側へ対象日付のデータを抽出するEXCELマクロです。
そのまま抽出と、集計して抽出するマクロを掲載しています。
SQLってなんぞな?って方もいらっしゃいますよね。
今回の例題はそれほど難しいものではありません。SQLになじみのない方は、access側で、クエリを作成して、作成したデザインをSQLビューで見ると、SQL文が見えます。
※EXCEL側と少し書き方が違うところがありますので、そこはググってください。
日付指示がない場合は、クエリを作っておいて、マクロを使わないでそのまま抽出することも可能です。
・データー/ACCESSデーターベースをクリック
・対象ACCESSDBを選択…
今回はここまで。
そのまま抽出
    If IsDate(NEW_SDATE) = False Then
       MsgBox ("スタート日付を正しく入力してください"), vbCritical
       Exit Sub
    End If
    If IsDate(NEW_EDATE) = False Then
       MsgBox ("エンド日付を正しく入力してください"), vbCritical
       Exit Sub
    End If
   
    If NEW_SDATE > NEW_EDATE Then
       MsgBox ("日付の範囲がおかしいです"), vbCritical
       Exit Sub
    End If
  
    MSG_FLG = MsgBox("accessDB取込( " & NEW_SDATE & " ~ " & NEW_EDATE & " )実行OK?", vbYesNo)
    If MSG_FLG = vbNo Then
       Exit Sub
    End If
'@@@@@@@@ 対象 ACCESS OPEN @@@@@@@@@
    Const cnsTITLE = "○access抽出(*.mdb)処理"
    Const cnsFILTER = "新コレクトから (*.accdb),*.accdb"
    
    With CreateObject("WScript.Shell")
        .CurrentDirectory = Worksheets("KANRI").Range("B1") '@@ シート設定
    End With
    vFILENAME = Application.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE)
    If VarType(vFILENAME) = vbBoolean Then
       MsgBox ("キャンセル")
       Exit Sub
    End If
  
    dbFile = vFILENAME
    myCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & dbFile & ""
    myCon.Open
  
    mySQL = "SELECT DATA.顧客コード, DATA.顧客名, DATA.出荷日, DATA.商品コード, DATA.商品名, DATA.金額, DATA.冊数 AS [冊数 の 合計] FROM data "
    mySQL = mySQL & "WHERE (DATA.出荷日 >= " & " #" & NEW_SDATE.Text & "# And DATA.出荷日" & " <= #" & NEW_EDATE.Text & "#) "
  
'###### SQL 保存 ######
    Worksheets("KANRI").Range("B21") = mySQL
  
'###### SQL 発行 ######
    myRecordSet.Open mySQL, myCon, adOpenDynamic
  
'###### excelへ展開 ######
    mySheetName = "PICUP1"
'※※※※※※オートフィルター解除   ※※※※※※
    If Sheets(mySheetName).AutoFilterMode Then
       Sheets(mySheetName).Range("A1").AutoFilter
    End If
'###クリア処理 ###
    Sheets(mySheetName).Select
    Cells.Select
    Selection.ClearContents
'### ヘダー作成 ###
    With Worksheets(mySheetName)
      .Cells(1, 1).Value = "顧客コード"
      .Cells(1, 2).Value = "顧客名"
      .Cells(1, 3).Value = "出荷日"
      .Cells(1, 4).Value = "商品コード"
      .Cells(1, 5).Value = "商品名"
      .Cells(1, 6).Value = "金額"
      .Cells(1, 7).Value = "冊数"
    End With
  
  
'### 明細作成 ###
    ILONG = 2
    Do Until myRecordSet.EOF
       With Worksheets(mySheetName)
         .Cells(ILONG, 1).Value = myRecordSet(0)
         .Cells(ILONG, 2).Value = myRecordSet(1)
         .Cells(ILONG, 3).Value = myRecordSet(2)
         .Cells(ILONG, 4).Value = myRecordSet(3)
         .Cells(ILONG, 5).Value = myRecordSet(4)
         .Cells(ILONG, 6).Value = myRecordSet(5)
         .Cells(ILONG, 7).Value = myRecordSet(6)
       End With
       ILONG = ILONG + 1
       myRecordSet.MoveNext
    Loop
  
'### CLOSE ###
  myRecordSet.Close
  Set myRecordSet = Nothing
  
  myCon.Close
  Set myCon = Nothing
  Range("A1").Select
  MsgBox (" 抽出終了 ")
  Application.StatusBar = " AccessDB抽出END "
End Sub
集計して抽出
    If IsDate(NEW_SDATE) = False Then
       MsgBox ("スタート日付を正しく入力してください"), vbCritical
       Exit Sub
    End If
    If IsDate(NEW_EDATE) = False Then
       MsgBox ("エンド日付を正しく入力してください"), vbCritical
       Exit Sub
    End If
   
    If NEW_SDATE > NEW_EDATE Then
       MsgBox ("日付の範囲がおかしいです"), vbCritical
       Exit Sub
    End If
  
    MSG_FLG = MsgBox("accessDB取込( " & NEW_SDATE & " ~ " & NEW_EDATE & " )実行OK?", vbYesNo)
    If MSG_FLG = vbNo Then
       Exit Sub
    End If
'@@@@@@@@ 対象 ACCESS OPEN @@@@@@@@@
    Const cnsTITLE = "○access抽出(*.mdb)処理"
    Const cnsFILTER = "新コレクトから (*.accdb),*.accdb"
    
    With CreateObject("WScript.Shell")
        .CurrentDirectory = Worksheets("KANRI").Range("B1") '@@ シート設定
    End With
    vFILENAME = Application.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE)
    If VarType(vFILENAME) = vbBoolean Then
       MsgBox ("キャンセル")
       Exit Sub
    End If
  
    dbFile = vFILENAME
    myCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & dbFile & ""
    myCon.Open
  
    mySQL = "SELECT DATA.顧客コード, DATA.顧客名, DATA.出荷日, Sum(DATA.金額) AS 金額の合計, Sum(DATA.冊数) AS 冊数の合計 FROM data "
    mySQL = mySQL & "WHERE (DATA.出荷日 >= " & " #" & NEW_SDATE.Text & "# And DATA.出荷日" & " <= #" & NEW_EDATE.Text & "#) "
    mySQL = mySQL & "GROUP BY DATA.顧客コード, DATA.顧客名, DATA.出荷日;"
'###### SQL 保存 ######
    Worksheets("KANRI").Range("B22") = mySQL
  
'###### SQL 発行 ######
    myRecordSet.Open mySQL, myCon, adOpenDynamic
  
'###### excelへ展開 ######
    mySheetName = "PICUP2"
'※※※※※※オートフィルター解除   ※※※※※※
    If Sheets(mySheetName).AutoFilterMode Then
       Sheets(mySheetName).Range("A1").AutoFilter
    End If
'###クリア処理 ###
    Sheets(mySheetName).Select
    Cells.Select
    Selection.ClearContents
'### ヘダー作成 ###
    With Worksheets(mySheetName)
       .Cells(1, 1).Value = "顧客コード"
       .Cells(1, 2).Value = "顧客名"
       .Cells(1, 3).Value = "出荷日"
       .Cells(1, 4).Value = "金額の合計"
       .Cells(1, 5).Value = "冊数の合計"
    End With
  
'### 明細作成 ###
    ILONG = 2
    Do Until myRecordSet.EOF
       With Worksheets(mySheetName)
         .Cells(ILONG, 1).Value = myRecordSet(0)
         .Cells(ILONG, 2).Value = myRecordSet(1)
         .Cells(ILONG, 3).Value = myRecordSet(2)
         .Cells(ILONG, 4).Value = myRecordSet(3)
         .Cells(ILONG, 5).Value = myRecordSet(4)
       End With
       ILONG = ILONG + 1
       myRecordSet.MoveNext
    Loop
  
'### CLOSE ###
  myRecordSet.Close
  Set myRecordSet = Nothing
  
  myCon.Close
  Set myCon = Nothing
  Range("A1").Select
  MsgBox (" 抽出終了 ")
  Application.StatusBar = " AccessDB抽出END "
End Sub








![[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。] [商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]](https://hbb.afl.rakuten.co.jp/hgb/17d6d998.a7c60c45.17d6d999.0f382150/?me_id=1313634&item_id=10000106&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbell-hammer-shop%2Fcabinet%2F04483050%2Flsbhg%2Fimgrc0073910752.jpg%3F_ex%3D240x240&s=240x240&t=picttext)




ディスカッション
コメント一覧
まだ、コメントがありません