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

このQ&Aのポイント
  • 日報をEXCELで作成しACCESSへ登録してますが、年初めにテーブルの差替え行っています。ACCESSとEXCELで何れも差替えを可能にしてますが、ACCESSで差替え後だとエラーになってしまいます。それを回避する為、テーブルの有無を検索判定の方法が分りません。
  • 自分なりに作成したのですが、予約済みエラーが発生してしまいます。
  • 宜しくお願いします。
回答を見る
  • ベストアンサー

EXCELからAccessテーブルの有無判定

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 宜しくお願いします。

  • 25630
  • お礼率67% (21/31)

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。 検索してみると、下記URLのページの下の方に、 「テーブルの存在をチェック」のコードが載っております。 http://tuka.s12.xrea.com/index.xcg?p=ADO#p15 やっている事は、ADOでテーブルのリストを取得して、引数の文字列と比較して、存在有無を戻していますので、#1の回答の応用編となります。 ご自分でアレンジするのが面倒なら、こちらで如何でしょうか。

25630
質問者

お礼

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

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

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

25630
質問者

お礼

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

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

こちらでADOでテーブルのリストを取得する方法を回答しておりますが、これを応用して所定のテーブルの有無を判定してはいかがでしょうか。ご参考まで。 http://okwave.jp/qa/q7072249.html

25630
質問者

補足

参考資料有難う御座います。 しかし、そこまでの応用するのは困難に思えます。 テーブルのリストの取得以外の方法で、検索する事は可能ですか?

関連するQ&A

  • エクセルVBAでアクセスのテーブルを操作

    アクセスのテーブルを名前を変えて保存したいのですが、エラー「2486:アクションを実行出来ない。」のメッセージが発生してしまいます。 構文は、以下の通りです。 Sub test() Dim ACC As Object Dim ACCC As ADODB.Connection Dim ACCR As ADODB.Recordset Dim SQL As String Set ACC = Access.Application Set ACCC = New ADODB.Connection Set ACCR = New ADODB.Recordset Const ACCpath = "D:\DB.mdb" SQL = "SELECT * FROM [dammy]" '接続し開く 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 ACC.DoCmd.CopyObject , "dammy(" & Year(Now) - 1 & "年)", acTable, "dammy" ACC.DoCmd.RunSQL "DELETE [dammy].* FROM [dammy];" End If End Sub エラー発生箇所は、IF文の中です。 対処方法を教えて下さい。 宜しくお願いします。

  • エクセルテーブルをアクセステーブル取込む

    エクセルで作成したテーブルデータを取り込むときに余分に空白のレコードが取り込まれてしまうんですが原因が分かりません。 下記コードで処理してます。 Dim strac As String Dim strxls As String Dim strrange As String Dim strMsg As String strac = "T_障害票マスタ" 'Accessテーブルを指定します。 strxls = テキスト0 'エクセルファイルを指定します。 strrange = "T_障害票!" 'データ入力のシート名とセル範囲を指定します。 strMsg = "エクセルファイル" & strxls & " を、Accessファイル " & strac & _ "として、データ入力を行います。" & _ "よろしければ、OKをクリックして下さい。" 'MsgBoxのメッセージ If strxls = "" Then MsgBox "ファイルを選択して下さい。" 'テキストボックスの確認 Exit Sub End If 'DoCmd.DeleteObject acTable, strac 'テーブルを削除します。 If MsgBox(strMsg, vbOKCancel, "import") = vbOK Then '最初のデータをフィールド名として使います。 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, _ strac, strxls, True, strrange MsgBox "インポートは、正常に完了しました。" End If Exit Sub なお取り込むテーブルデータはフィールド行を抜かして常に1レコードだけです。 アクセスでは既存のテーブルに保存してます。 詳しい方お願いします。

  • ExcelからAccessのテーブルの値の取得ができない

    Excel2003からAccess2003のDBの値を取得するVBAを作成中なのですが、 ExcelのフォームにてTextBox1に入力した社員番号からネットワーク接続されたサーバーにあるmdbファイルから値を取得する内容で 以下のエラーが表示されます。  「実行時エラー '-2147217904 (80040e10)':   1つ以上の必要なパラメータの値が設定されていません。」 デバッグをすると、「rs1.Open sql1, con」の箇所と指摘されます。 以下にコードを貼り付けますので、間違っている点のご指摘をお願いいたします。 Private Sub CommandButton2_click() Dim shainID As Long Dim constr As String '接続文字列の定義 Dim con As ADODB.Connection Dim rs1 As ADODB.Recordset If TextBox1.Value = "" Then MsgBox "社員番号を入力してください", vbOKOnly + vbCritical, "社員番号入力エラー" TextBox1.SetFocus Else shainID = TextBox1.Value Range("B13").Value = shainID 'Connectionの設定 Set con = CreateObject("ADODB.Connection") constr = "provider = Microsoft.Jet.OLEDB.4.0;Data Source = \\192.168.1.100\ShainDB\shaindb.mdb" 'DB接続 con.Open constr 'RecordSetの作成 Set rs1 = CreateObject("ADODB.Recordset") 'SQL sql1 = "select 社員漢字氏名,性別,生年月日,電話番号,住所 from 社員テーブル where 社員番号 = shainID" If sql1 = "" Then MsgBox "入力した社員番号の社員はいません。", vbOKOnly + vbCritical, "社員番号入力エラー" TextBox1.SetFocus Else 'SQLを実行して対象をRecordSetに入れる rs1.Open sql1, con Set rs1 = con.sql1 Range("B14").Value = 社員漢字氏名 Range("B15").Value = 性別 Range("B16").Value = 生年月日 Range("B17").Value = 電話番号 Range("B18").Value = 住所 Unload Me 'フォームを閉じる End If End If End Sub

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • 他のMDBのテーブルに追加したい

    Access2010のADOについてご質問します。 以下のようにして、データを追加しています。 Dim SQL As String Dim cn As ADODB.Connection Set cn = CurrentProject.Connection ' SQL = "INSERT INTO テーブルA ( 勤務時間 ) " SQL = SQL & "SELECT [テーブルA ].[勤務時間] " SQL = SQL & "FROM テーブルA ; " cn.Execute SQL ご質問したいのは、 当MDB(PC)から社内サーバーにあるMDBのテーブルに追加したいのです。 違うテーブル名でしたら、リンクをすれば済む話とは思いますが 同じテーブル名の「テーブルA」なので どのようにすればいいのか困っています。 ご指導の程をよろしくお願いします。

  • オラクルからAccessにデータ追加

    オラクルから、必要なデータを抜出し加工の為のDBをAccessで作成していますが、オラクルから抜き出したデータ(レコードセット)を、どうやってAccessのテーブルに書き込めばよいかがわかりません。 ◎環境 Oracle:10g Access:2010 ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) For i = 1 To 10 Debug.Print rs(カラム1) & rs(カラム2) next i ここまでは、オラクルのテーブルから、レコードセットにデータが取り込まれてます。 rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 案1 レコードセットのデータを、Access側のテーブルにループで回して、1行ずつデータ追加 案2 INTO句で直接、テーブル作成 調べていて、2通りのやり方があると思うのですが、どちらにしても、テーブルへの書き込み方がわかりません。 案1の場合、Access側のテーブルを開いてデータ追加する方法 ※同時に2つのテーブルを開くことになるのでは? 案2の場合、SQL文はオラクルで処理する為の物なので、AccessテーブルのINTO句が使えるのか? オラクルのテーブルをリンクする事も考えたのですが、実際動かすPCにはAccessRuntimeしかインストールしてませんので、オラクルのテーブルをリンクしてくれませんでした。 よい方法があれば、アドバイスを頂けたら幸いです。

  • Accessのテーブルの文字列フィールドにVBAでアクセスするには?

    いつもお世話になっております。困っていることがありますので教えていただければ幸いです。 AccessのテーブルAに、メモ型のフィールドBがあり、1000文字くらいの文字が入っています。VBAの関数Cの中でそのテーブルにアクセスし、1000文字をいろいろ処理したいと思っています。見よう見まねで試しに Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim FileNum As Integer Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open テーブルA, cn, adOpenDynamic, adLockOptimistic msgbox !フィールドB としてみたのですが、なぜか255文字までしか表示されません。VBAを用いてテーブル(やクエリ)にアクセスし、256文字以上の文字列を扱う方法はありませんでしょうか? 何かこちらで勘違いしているところがありましたら、ご指摘いただければと思います。よろしくお願いします。

  • アクセスにてテーブル内の重複チェックについて

    下記の様なテーブル構成になっています。 大分類マスタ 大分類 長整数型 分類見出し 文字列 このテーブルにフォームから入力をさせているのですが重複チェックの時にvercheckのデータ形式が違いますと出てエラーが出ます。色々とデータ形式を変えたのですがうまくいきません。 どの様にすれば宜しいのでしょうか?ご教授頂きます様お願い致します。 尚、テーブルの数値を文字形式にすれば動作するのは分かっているのですが数値形式の場合の やり方を教えてください。 Dim str大分類 As String Dim str分類見出し As String Dim vercheck As Variant If IsNull(大分類) = False Then str大分類 = 大分類 vercheck = DLookup("大分類", "T大分類マスタ", "大分類='" & str大分類 & "'") If Not IsNull(vercheck) Then MsgBox ("同じ大分類番号があります") Exit Sub Cancel = True Else End If Else Exit Sub End If If IsNull(分類見出し) = False Then str分類見出し = 分類見出し vercheck = DLookup("分類見出し", "T大分類マスタ", "分類見出し='" & str分類見出し & "'") If Not IsNull(vercheck) Then MsgBox ("同じ分類見出しがあります") Exit Sub Cancel = True Else End If Else Exit Sub End If -------ここからフォームから直にテーブルに書いています。--------- Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T大分類マスタ", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs![大分類] = Forms!F大分類マスタ登録画面!大分類 rs![分類見出し] = Forms!F大分類マスタ登録画面!分類見出し rs.Update End Sub

  • VB.NETでのAccessテーブルリンク

    現在、VB.NET上で操作し、Accessのテーブルのリンクをしているのですが、 リンク処理の直後に、最後にテーブルのリンク処理をしたテーブルを 開こうとすると、 「要求された名前、または序数に対応する項目がコレクションで見つかりません。」という エラーが出ます。 なお、リンクしたテーブルには、きちんと正しいリンクで開こうとしたテーブルが登録されています。 それで、最後にリンクしたのが悪いのかと思い、順番を変えると、 そのエラーは起こらずに通常に起動しました。 ですが、順番を変えただけで普通に動く、というのが なんだか腑に落ちません。(まあ、無事に動いているのでいいのですが(汗 ) 以下にリンク処理を記載します。 何故、このようなことが起こるのかわかる方いらっしゃいましたら、ご教授お願い致します。 予想でもかまいません。 Public Sub DBLink() LFlag = False Dim rs As ADODB.Recordset = New ADODB.Recordset Dim Sql As String = String.Empty Dim dbPName As String = String.Empty Dim tName() As String 'リンク先のパスを指定 Dim f As New frmLinkPath f.ShowDialog() f.Close() f = Nothing 'パスを指定したか否か If LFlag Then 'TMPのパスは固定 dbPName = PathLast(Application.StartupPath) & "TMP.mdb" 'リンクするテーブル名を取得 'mdbLには、テーブル名がカンマ区切りで入っています tName = mdbL.Split(",") 'リンク先のテーブルを削除 For i = 0 To tName.Length - 1 Sql = "DROP TABLE " & tName(i) rs.Open(Sql, cn) Call SLink(tName(i), dbPName) Next dbPName = PathLast(DBPath) & "MST.mdb" 'リンクするテーブル名を取得 tName = mdbS.Split(",") 'リンク先のテーブルを削除 For i = 0 To tName.Length - 1 Sql = "DROP TABLE " & tName(i) rs.Open(Sql, cn) Call SLink(tName(i), dbPName) Next Else MsgBox("リンク先が指定されなかったので、" & vbCrLf & "テーブルの再リンクをキャンセルします", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "") End If End Sub ''' <summary> ''' データベース再リンク ''' </summary> ''' <param name="psNm">リンクするテーブル名</param> ''' <param name="psMdb">リンク元データベース名</param> ''' <remarks></remarks> Public Sub SLink(ByVal psNm As String, ByVal psMdb As String) Try Dim lodDb As dao.Database Dim ltDef As dao.TableDef Dim lsSource As String Dim lsTarget As String Dim daoE As New dao.DBEngine 'リンク先データベースとリンクデータベース名を指定 lsSource = psMdb lsTarget = PathLast(Application.StartupPath) & "DATA.mdb" '既存のデータベースの場合は OpenDatabase を使用する) lodDb = daoE.OpenDatabase(lsTarget) '任意の名前でテーブル定義を作成する ltDef = lodDb.CreateTableDef(psNm) 'リンク先のテーブル名を指定する ltDef.SourceTableName = psNm 'リンク先のデータベースを指定する(対象がMDBの場合セミコロンの前は省略) ltDef.Connect = ";Database=" & lsSource '定義したテーブルをアペンド(追加)する lodDb.TableDefs.Append(ltDef) lodDb.Close() lodDb = Nothing Catch ex As Exception Debug.Print(ex.Message) 'Throw End Try End Sub

専門家に質問してみよう