Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


58793 / 76732 ←次へ | 前へ→

【22662】Re:mdbファイルについて
発言  ichinose  - 05/2/26(土) 0:18 -

引用なし
パスワード
   ▼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ファイルのテーブルに
反映されています。
0 hits

【22619】mdbファイルについて mickeypapa 05/2/24(木) 21:14 質問
【22623】Re:mdbファイルについて ichinose 05/2/24(木) 22:07 発言
【22636】Re:mdbファイルについて mickeypapa 05/2/25(金) 8:13 質問
【22639】Re:mdbファイルについて ichinose 05/2/25(金) 9:22 発言
【22648】Re:mdbファイルについて mickeypapa 05/2/25(金) 14:08 質問
【22657】Re:mdbファイルについて ichinose 05/2/25(金) 18:34 発言
【22658】Re:mdbファイルについて mickeypapa 05/2/25(金) 21:07 お礼
【22662】Re:mdbファイルについて ichinose 05/2/26(土) 0:18 発言
【22674】Re:mdbファイルについて mickeypapa 05/2/27(日) 17:33 質問
【22676】Re:mdbファイルについて ichinose 05/2/27(日) 22:44 発言
【22851】Re:mdbファイルについて mickeypapa 05/3/4(金) 22:52 お礼
【22899】Re:mdbファイルについて mickeypapa 05/3/6(日) 19:31 質問
【22904】Re:mdbファイルについて ichinose 05/3/6(日) 22:18 発言
【22912】Re:mdbファイルについて mickeypapa 05/3/7(月) 13:40 お礼
【22913】Re:mdbファイルについて mickeypapa 05/3/7(月) 13:43 発言
【22659】Re:mdbファイルについて mickeypapa 05/2/25(金) 21:13 お礼

58793 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free