NonSoft

ACCESS(アクセス)のフォームとADOを使用し
期間抽出するサンプル


 ち〜な〜み〜に〜

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

ACCESS(アクセス)データベースを使用し、フォームとADOにより期間でデータを抽出(日付のFROM〜TOで絞込)するサンプルです。
ADOというライブラリを使ったVBAプログラムに挑戦してみましょう。
クエリ版はこちらです。
DAO版はこちらです。SQLサーバーとも接続出来ます。

実行結果はこんな感じです。2007/06/01〜2007/08/31までの受注担当者と受注金額の一覧です。
日付絞込み実行結果

(1)まずサンプルのテーブルを作成します。テーブルのデザインビューはこんな感じです。
   テーブル名は「受注テーブル」にしてください。
   受注番号(テキスト型)、受注日(日付/時刻型)、受注担当(テキスト型)、受注金額(数値型)
   主キー(鍵のマーク)も付けましょう。主キーは重複出来ません。
テーブルのデザインビュー

(2)サンプルのテーブルにデータを入力します。データシートビューはこんな感じです。
   抽出(絞込)が上手くいったかどうか判断出来るように日付を散りばめて。
データシートビュー

(3)クエリは使用しません。データ抽出はVBAで行います。

(4)フォームを作成します。
   テキストボックス(date1、date2と命名)とリストボックス(list1と命名)を追加します。
   date1、date2、list1はラベル名では無く変数名なので注意してください。プロパティで開いた時の名前です。
   フォームのデザインビューはこんな感じです。
フォームのデザインビュー

(5)フォームのフォーム(詳細では無い)のプロパティはこんな感じです。
   「コードセレクタ=いいえ」と「移動ボタン=いいえ」を設定した方が良いでしょう
リストボックスのプロパティ
   (イメージ画像はありませんが、date1とdate2のIME入力モードをオフにした方が使いやすいです)

(6)フォームをデザインビューで開いて、受注日Fromを右クリックし「イベントのビルド」を選択します。
   「コードビルダ」を選択し、以下のVBAコードを入力します。
   また、「ツール」メニューの「参照設定」に「Microsoft ActiveX Data Objects X.X Liblary」を追加
   されている事を確認します。X.XXの部分はADOのバージョン番号ですが、このサンプルでは2.1でした。

   ' VBA---↓↓↓↓--------------------------------------------------
   Private Sub date1_BeforeUpdate(Cancel As Integer)
       DbSel
   End Sub
   Private Sub date2_BeforeUpdate(Cancel As Integer)
       DbSel
   End Sub
   Private Sub Form_Load()
       DbSel
   End Sub
   Private Sub DbSel()
       Dim Cn As ADODB.Connection
       Dim Rs As ADODB.Recordset
       Dim i As Long
       Dim widths As String
       Dim titles As String
       Dim datas As String
       Dim sql As String
   '    Set Cn = New ADODB.Connection
   '    Cn.Provider = "SQLOLEDB"
   '    Cn.ConnectionString = "Data Source=SQLサーバ名;" & _
   '                          "Database=DB名;" & _
   '                          "User ID=ユーザID;" & _
   '                          "Password=パスワード;"
   '    Cn.Open
       Set Cn = CurrentProject.Connection
       sql = ""
       sql = sql & "SELECT * FROM 受注テーブル "
       If Me.date1 <> "" Or Me.date2 <> "" Then
           sql = sql & "WHERE "
       End If
       If Me.date1 <> "" Then
   '        sql = sql & "受注日 >= '" & Format(Me.date1, "yyyy/mm/dd") & "' "
           sql = sql & "受注日 >= #" & Format(Me.date1, "yyyy/mm/dd") & "# "
       End If
       If Me.date1 <> "" And Me.date2 <> "" Then
           sql = sql & "AND "
       End If
       If Me.date2 <> "" Then
   '        sql = sql & "受注日 <= '" & Format(Me.date2, "yyyy/mm/dd") & "' "
           sql = sql & "受注日 <= #" & Format(Me.date2, "yyyy/mm/dd") & "# "
       End If
       sql = sql & "ORDER BY 受注日 "
       Set Rs = New ADODB.Recordset
       Rs.Open sql, Cn
       widths = ""
       titles = ""
       list1.RowSourceType = "Value List"
       For i = list1.ListCount - 1 To 0 Step -1
           list1.RemoveItem i
       Next i
       Do While Rs.EOF = False
           If titles = "" Then
               list1.ColumnHeads = True
               list1.ColumnCount = Rs.Fields.Count
               For i = 0 To Rs.Fields.Count - 1
                   If widths <> "" Then widths = widths & ";"
                   widths = widths & "2.54cm"
                   If titles <> "" Then titles = titles & ";"
                   titles = titles & Rs.Fields(i).Name
               Next i
               list1.ColumnWidths = widths
               list1.AddItem titles
           End If
           datas = ""
           For i = 0 To Rs.Fields.Count - 1
               If datas <> "" Then datas = datas & ";"
               datas = datas & Rs.Fields(i).Value
           Next i
           list1.AddItem datas
           Rs.MoveNext
       Loop
       Rs.Close
       Cn.Close
       Set Rs = Nothing
       Set Cn = Nothing
   End Sub
   ' VBA---↑↑↑↑--------------------------------------------------

   「Set Cn = CurrentProject.Connection」の部分を以下のように変更するとSQLサーバーに接続出来ます。    「Set Cn = New ADODB.Connection     Cn.Provider = "SQLOLEDB"     Cn.ConnectionString = "Data Source=SQLサーバ名;Database=DB名;User ID=ユーザID;Password=パスワード;"     Cn.Open」    その場合「sql = sql & "受注日 <= #" & Format(Me.date1, "yyyy/mm/dd") & "# "」の部分を        「sql = sql & "受注日 >= '" & Format(Me.date1, "yyyy/mm/dd") & "' "」に変更してください。
VBAコード

(7)完成です。

ACCESS(アクセス)のフォームとクエリを使用し期間抽出するサンプル
プログラム初心者には難しいVBAは1行だけ「リストボックス名.RowSource = "クエリ1"」・・・

ACCESS(アクセス)のフォームとDAOを使用し期間抽出するサンプル
DAOというライブラリを使ったVBAプログラムに挑戦してみましょう・・・SQLサーバーも・・・

ACCESS(アクセス)のフォームとADOを使用し期間抽出するサンプル
ADOというライブラリを使ったVBAプログラムに挑戦してみましょう・・・SQLサーバーも・・・

ACCESS(アクセス)のテーブルとEXCEL(エクセル)を使用し期間抽出するサンプル1
ACCESS(アクセス)の抽出データをEXCEL(エクセル)のシートに取り込むサンプル・・・

ACCESS(アクセス)のテーブルとEXCEL(エクセル)を使用し期間抽出するサンプル2
ACCESS(アクセス)の抽出データをEXCEL(エクセル)のシートに取り込むサンプル・・・

今まで色々なソフトウェアの勉強をして来ましたがACCESSの勉強をした事は有りませんでした。VBもVBAも似たようなものだと思っていました。 ある時、ACCESSのデータを期間抽出する事になったのですが、意外と難しい事に気付きました。なぜ今、ACCESSなのか?と思いつつ経験不足 を否定出来ませんでした。そこで、「ACCESS(アクセス)のフォームとクエリを使用し期間抽出するサンプル」を作ろうと思いました。初心者は プログラムに恐怖心を持っているかもしれないので、「プログラム初心者には難しいVBAは1行だけ」というフレーズを付けてみました・・・ しかしACCESSデータベースを使っていてVBAを避けて通れるとは思えないのでDAO、ADOのサンプルも用意しました。ADOが必要だと思った理由は、 今はACCESSで充分でも将来的にはSQL SERVERやORACLEの存在が無視出来ないと思うからです。業務分野としては、想像しやすいストーリーとして 受注業務(営業業務)を採用しました。受注テーブルの日付カラムをFROM〜TOの期間でデータ抽出(検索と言うべきか絞込と言うべきか)し、 抽出した受注番号、受注日、担当、金額を表示するという仕様にしました。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜