|
▼mickeypapa さん:
こんばんは。
>ichinoseさんの仰るとおりAccessを使うのがいいかと思い昨年末から
>Accessの本を購入して少しずつ勉強を始めております。
>しかしながら、今までExcelのVBAを覚えはじめ、入力フォーム作成から始まり
>品名一覧、運賃表、日報、請求書などExcelVBAでなんとか作り込んできました。
なるほど、ではExcelでのVBAということで・・・。
実は、私は普段、mdbファイルの接続にDAOは使っていません(ADOを使っています)。ADOの方を先だったという理由なんですが。
で、あまりDAOオブジェクトそのものを操作しない方法で考えました。
mdbからExcelへの出力も整理して記述します(ちょっと変更もあるので)。
尚、DAOの参照設定は前回と同様です。
'============================================================
Sub DAO_read()
'Microsoft DAO 3.6 Object Library 参照設定
Dim myDb As DAO.Database
Dim myRst As DAO.Recordset
Dim myFileName As String
Dim myTblsql As String
myFileName = "運送.mdb" '読み込むファイル
myTblsql = "SELECT * FROM 運送DATA WHERE [月 日] Between #2004/10/1# And date();"
' mytblnameではおかしいので変数名変えました
' それから、Sqlもちょっと簡単にしました
' 実際には Sql中の2004/10/1は、変数を使わなくてはなりませんね!!
Set myDb = OpenDatabase(ThisWorkbook.Path & "\" & myFileName)
Set myRst = myDb.OpenRecordset(myTblsql)
With myRst
For idx = 0 To .Fields.Count - 1
Cells(1, idx + 1).Value = .Fields(idx).Name
Next
'↑フィールド名をセルA1、B1、・・・と書き込んでいます
'不要なら取ってください
Range("A2").CopyFromRecordset myRst
.Close
End With
myDb.Close
Set myRst = Nothing 'オブジェクトの解放
Set myDb = Nothing
Range("A65536").End(xlUp).Offset(1, 1).Select
End Sub
このコードの実行でデータがシートに表示されます。
このシートのデータを追加や値の変更、又は、削除を行った後に
以下のコードで書き込みます。
'================================================================
Sub DAO_write()
'最初に読み込んだレコードをMDBファイルから削除して後、
'シートの内容をMDBファイルに挿入するというロジックです。
'Microsoft DAO 3.6 Object Library 参照設定
Dim myDb As DAO.Database
Dim myRst As DAO.Recordset
Dim myFileName As String
Dim myTblsql As String
myFileName = "運送.mdb" '読み込むファイル
myTblsql = "delete * FROM 運送DATA WHERE [月 日] Between #2004/10/1# And date();"
' ↑シートに表示したレコードは一度削除する
Set myDb = OpenDatabase(ThisWorkbook.Path & "\" & myFileName)
myDb.Execute myTblsql
myTblsql = "insert INTO 運送DATA select * FROM [Excel 8.0;Database=" & ThisWorkbook.Path & "\sqltest.xls]" & _
".[" & ActiveSheet.Name & "$" & Range("a1", Cells(Rows.Count, 1).End(xlUp)).Resize(, 3).Address(False, flase) & "];"
'Sqltest.Xlsは、このマクロを記述しているExcelブック名です
'.Resize(,3)となっていますが、私のテストでは3つフィールドで行ったためです。
'実際のフィールド数に合わせてください。
'尚、mdbファイルとこのブックは同じフォルダ内にあります。
'また、mdbファイルへの書き込みはアクティブシートを対象としています。
myDb.Execute myTblsql
myDb.Close
Set myRst = Nothing 'オブジェクトの解放
Set myDb = Nothing
End Sub
以上です。
繰り返しになりますが、SQL中の「2004/10/1」は、実際には、変数化にしなければ
なりません。また、DAO_readで使用した変数(例えば、2004/10/1が入っているとすると)は、DAO_writeでも使用します。実際には、日付変数をどこかに保存しておく必要があります(セルに保存しておくのがよいかなあ)。
以上です。提示したコードを実際のMDBファイルの規格に変更して
確認して下さい。
私がテストした限りでは、追加・変更・削除がMDBファイルのテーブルに
反映されています。
|
|