dポイントプレゼントキャンペーン実施中!

EXCELからAccessテーブルの有無判定及び新規作成


 日報をEXCELで作成しACCESSへ登録してますが、年初めにテーブルの差替え行っています。
ACCESSとEXCELで何れも差替えを可能にしてますが、ACCESSで差替え後だとエラーになってしまいます。
それを回避する為、テーブルの有無を検索判定の方法が分りません。

 自分なりに作成したのですが、予約済みエラーが発生してしまいます。



Sub 保存_Click()

Dim ACC As Object
Dim ACCC As ADODB.Connection
Dim ACCR As ADODB.Recordset
Dim SQL As String
Dim DelSQL As String
Dim CpySQL As String

Set ACC = Access.Application
Set ACCC = New ADODB.Connection
Set ACCR = New ADODB.Recordset
Const ACCpath = "D:\日報DB.mdb"
SQL = "SELECT * FROM [日報]"
DelSQL = "DELETE * FROM [日報];"
CpySQL = "SELECT * INTO [;Database=D:\日誌DB.mdb].[日報(" & Year(Now) - 1 & "年)] FROM [日報]"

'Accessレコードへ接続し開く
ACCC.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ACCpath
ACCR.Open SQL, ACCC, adOpenStatic, adLockOptimistic

'新年新規テーブル作成
ACCR.MoveFirst
If ACCR.Fields("日付").Value <= DateSerial(Year(Now), 1, 1) Then
If DCount("*", "MsysObject", "[Name]='日報(' & Year(Now) - 1 & '年)' And [Type]=1") = 0 Then  ←エラー
ACCC.Execute CpySQL
ACCC.Execute DelSQL
End If
End If

' オブジェクト開放
ACCC.Close
Set ACCR = Nothing
Set ACC = Nothing

End Sub



宜しくお願いします。

A 回答 (3件)

#1です。


検索してみると、下記URLのページの下の方に、
「テーブルの存在をチェック」のコードが載っております。
http://tuka.s12.xrea.com/index.xcg?p=ADO#p15

やっている事は、ADOでテーブルのリストを取得して、引数の文字列と比較して、存在有無を戻していますので、#1の回答の応用編となります。
ご自分でアレンジするのが面倒なら、こちらで如何でしょうか。
    • good
    • 0
この回答へのお礼

 回答有難う御座います。
参照した所、ファンクション内に記載されていない引数が有り、不明点がいくつか有りますが、勉強になりました。

 色々と検証して見ます。
有難う御座いました。

お礼日時:2012/01/14 04:54

ExcelからオートメーションでAccessを操作する場合です。


DcountはMDBファイルそのものをAccessで開いていないと使えません。
MsysObjects(複数形に)
『日報』というひな形テーブルはあるのですよね。
mitarashi さんが二番目に紹介されたリンク先、ナイスだと思います。
下の方だけではなく全部目を通すのをお勧め。
以下はご参考までに。

Sub test()
'Microsoft Access xx.xx Object Library に参照設定
Dim ACC As New Access.Application
ACC.OpenCurrentDatabase "D:\日誌DB", False '←Trueの場合は開けなかった場合にエラー処理要、
'True にしてエラー処理も入れた方が確実
If ACC.DCount("*", "MsysObjects", "[Name] = '日報(" & Year(Now) - 1 & "年)'" & " And [Type]=1") = 0 Then
  ACC.DoCmd.CopyObject "日報(" & Year(Now) - 1 & "年", acTable, "日報"
  ACC.CurrentDb.TableDefs.Refresh
  ACC.CurrentDb Execute("delete * from 日報(" & Year(Now) - 1 & "年") '念のためのレコード削除?なの
End If
ACC.CloseCurrentDatabase '開いたAccessが無くなっているのをタスクマネージャで確認を

End Sub

※なお全角半角に限らず『()』カッコはトラブルの元になりかねないので
日報_yyyy年 などにしておいた方が良いと思います。
http://support.microsoft.com/kb/826763/ja
    • good
    • 0
この回答へのお礼

 回答有難う御座います。
DBを開いて検証した所、別な所でエラーになってしまいました。
色々と検証して見ます。

有難う御座いました。

お礼日時:2012/01/14 04:44

こちらでADOでテーブルのリストを取得する方法を回答しておりますが、これを応用して所定のテーブルの有無を判定してはいかがでしょうか。

ご参考まで。
http://okwave.jp/qa/q7072249.html

この回答への補足

参考資料有難う御座います。

しかし、そこまでの応用するのは困難に思えます。

テーブルのリストの取得以外の方法で、検索する事は可能ですか?

補足日時:2012/01/08 00:35
    • good
    • 0

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