アクセス2007 テーブルの全削除とデータ移動

このQ&Aのポイント
  • アクセス2007のテーブルを全て削除してデータを移動したい場合、リレーションの張ってあるテーブルの削除でエラーが発生することがあります。DoCmd.SetWarnings Falseを使ってもエラーが解消されない場合、別の対処法を考える必要があります。
  • テーブルの中に自動的に作成される「~TMP******」というテーブルは削除しても問題ありません。
  • 削除した後にデータをインポートするには、VBコードを使用してAccessのメニューで実行する手順を自動化する必要があります。具体的なコードは質問文に記載されていませんので、実際のコードを提供することはできません。
回答を見る
  • ベストアンサー

アクセス2007 テーブルの全削除とデータ移動

アクセス2007 テーブルの全削除とデータ移動 全テーブルを削除して、データをインポートしようとしています。 質問1. 下記のコードで、リレーションの張ってあるテーブルの削除でエラーになります。 でも、DoCmd.SetWarnings Falseの状態で、手動で削除するとエラーになりません。 だったらと思い、コードにDoCmd.SetWarnings Falseを追加したのですが、やはりエラーになります。 対処法はないでしょうか? 質問2. テーブルの中に「~TMP******」という勝手に作られたテーブルは、削除してもいいものなのでしょうか? 質問3. 削除後にインポートをしたいのですが。 手動でアクセスメニュー>外部データ>アクセス(のインポート)>現在の~~>すべて選択(テーブル)>OK これを実現するVBの記述は、どんなコードになるのでしょうか? --------------------------------------------------------------------- Private Sub 旧バージョンからデータ移動_Click() Dim i As Integer Dim tbls As DAO.TableDefs Dim tbl As DAO.TableDef '開いているフォーム全てを閉じる For i = Forms.Count - 1 To 0 Step -1 DoCmd.Close acForm, Forms(i).Name Next i Set tbls = CurrentDb.TableDefs DoCmd.SetWarnings False  '追加-------------------    ’全テーブル削除 For Each tbl In tbls If InStr(1, tbl.Name, "MSys", vbBinaryCompare) = 0 And InStr(1, tbl.Name, "~TMP", vbBinaryCompare) = 0 Then tbls.Delete (tbl.Name) End If Next DoCmd.SetWarnings True   '追加----------------   ’旧バージョンからのデータインポート   ’VBコードがわかりません End Sub ------------------------------------------------------------------------- ※旧バージョンとはアクセス本体ではなく、自分でつくったDBの旧バージョンです。 複数質問で申し訳ありませんが、よろしくお願い致します。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

失礼しました。リレーションのことを 見逃していました。 'テーブルの削除 Private Sub コマンド0_Click() Dim db As Database Dim rs As DAO.Recordset Dim strSQL As String Dim rels As Relations strSQL = "SELECT [Name] " & _ "FROM MSysObjects " & _ "WHERE ([Name] Not Like 'MSys*') AND ([Type]=1)" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) Set rels = db.Relations Do While rels.Count > 0 Debug.Print rels(0).Name rels.Delete rels(0).Name Loop rs.MoveFirst Do Until rs.EOF db.Execute "DROP TABLE " & rs!Name rs.MoveNext Loop rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub

situmonnsya
質問者

補足

無事、データ移動することができました。 私程度の技量ではとても無理なコードで大変助かりました。 今後、このご回答を参考される私のような初心者の方の為に。 ・最初に全てのフォームを閉じておく ・テーブル削除(私の場合「~TMP******」を削除しても大丈夫でした) ・テキストボックスtxパスの代わりに、旧バージョンの場所を指定できる「ファイル選択ウインド」の利用。 ・アクセス2007の場合、旧バージョンの場所が「信頼できる場所」にあること。でないと、テーブル数の分だけ「確認」がくる。 ということで、宜しいでしょか?

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

すみません。何だか勘違いな一文が 入り込んでいました。 >InputBoxに関しては、数値の >入力にたいして文字をいれたり、空で >OKを押したりなどのエラー処理を >入れていなかったのが気になるところですが、 >いずれInputBoxを使用するような場合には >また質問してみてください。 他の分野で出す予定だった回答の一部を 間違ってコピーして張り付けてしまいました。 自分ながら・・・・という感じです。 この一文はスルーしてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

プログラムが役に立てて安心しました。 >・最初に全てのフォームを閉じておく >・テーブル削除(私の場合「~TMP******」を削除しても大丈夫でした) >・テキストボックスtxパスの代わりに、旧バージョンの場所を指定できる「ファイル選択ウインド」の利用。 >・アクセス2007の場合、旧バージョンの場所が「信頼できる場所」にあること。でないと、テーブル数の分だけ「確認」がくる。 以上の件確認しました。いいと思います。 InputBoxに関しては、数値の 入力にたいして文字をいれたり、空で OKを押したりなどのエラー処理を 入れていなかったのが気になるところですが、 いずれInputBoxを使用するような場合には また質問してみてください。 ファイル選択ウィンドウでパスが完全に 取得できることを確認してくださいね。 Access2007はセキュリティが厳しいので 「場所」の問題はある程度経験すれば いろいろな対処法を見つけられます。 ごくろうさまでした。

situmonnsya
質問者

お礼

ありがとうございました。 感謝致します。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

訂正です。 Do While rels.Count > 0 Debug.Print rels(0).Name rels.Delete rels(0).Name Loop の Debug.Print rels(0).Name を削除してください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

削除確認後、インポートするのがいいのでは。 ということで、ボタンを二つのコードです。 一応、質問の順序で回答します。 (1)テーブルをすべて削除するサンプル Private Sub コマンド0_Click() Dim db As Database Dim rs As DAO.Recordset Dim strSQL As String strSQL = "SELECT [Name] " & _ "FROM MSysObjects " & _ "WHERE ([Name] Not Like 'MSys*') AND ([Type]=1)" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenForwardOnly) Do Until rs.EOF db.Execute "DROP TABLE " & rs!Name rs.MoveNext Loop rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub (2) http://support.microsoft.com/default.aspx?scid=kb;ja;90129 http://support.microsoft.com/default.aspx?scid=kb;ja;209803 このあたりに何かしらの説明がありますが、本来は削除 される予定のもので、何らかの理由で残ったのでしょう。 Accessを終了したり、最適化すればなくなると思います。 それでも無くならないのならば、ファイルを別にコピーして その「~TMP******」を削除して様子をみてください。 (3) テーブルをインポートするサンプル(msのsupportの改造) フォームにテキストボックスtxパスを設置。 txパスに取り出すテーブルがあるmdbのパス を表示した方法。あとは適当にアレンジ。 コピーするときは長い一文があるので、 張り付けたときにエラーにならないように。 'テーブルのインポート Private Sub コマンド1_Click() Dim db As Database Dim td As TableDef Dim strTDef As String Dim strPATH As String Dim cdb As Database strPATH = Me!txパス Set db = DBEngine.Workspaces(0).OpenDatabase(strPATH, True) For Each td In db.TableDefs strTDef = td.Name If Left(strTDef, 4) <> "MSys" Then DoCmd.TransferDatabase acImport, "Microsoft Access", strPATH, acTable, strTDef, strTDef, False End If Next Set cdb = Nothing Set td = Nothing db.Close Set db = Nothing End Sub

situmonnsya
質問者

補足

詳細なご教示ありがとうございます。 削除する所ですが、やはりリレーションの張ってあるテーブルでエラーが出ます。 今日はもう遅いので、明日また確認したいと思います。

関連するQ&A

  • アクセス2007 テーブルの全削除とデータ移動

    アクセス2007 テーブルの全削除とデータ移動 全テーブルを削除して、データをインポートしようとしています。 http://okwave.jp/qa/q5952603.html 以前の質問<QNo.5952603>の続きになってしまいますが。 >質問3. >削除後にインポートをしたいのですが。 >手動でアクセスメニュー>外部データ>アクセス(のインポート)>現在の~~>すべて選択(テーブル)>OK >これを実現するVBの記述は、どんなコードになるのでしょうか? 答え >DoCmd.TransferDatabase acImport, "Microsoft Access", strPATH, acTable, strTDef, strTDef, False なのですが、手動で行った場合の「オプション」>インポート「リレーションシップ=チェックON」の部分が 上記のお答えのコードで実現できませんでした。 各クエリの部分的なリレーションは残ってますが、全体のリレーション線が消えてしまいます。 どのようにしたら再現できますでしょうか?

  • アクセスで複数データ削除

    myPath = "D:\" myfilename = Dir(TxB04) Do Until myfilename = "" DoCmd.TransferText acImportDelim, , "tbl1", myPath & myfilename, False myfilename = Dir Loop MsgBox "取込が正常に終了しました。" MsgBox "二重打刻をチェックしてます。" '取込ファイル名を変換します。 DoCmd.SetWarnings False DoCmd.OpenQuery "データ変換" DoCmd.OpenQuery "実績追加" DoCmd.OpenQuery "重複データ削除" DoCmd.OpenQuery "削除クエリ" DoCmd.SetWarnings True Cmd21.Enabled = False ★Kill (strInFPath)★ 'メッセージマスタ取得 Sqlstate2 = "SELECT * FROM 氏名登録なし;" Set M_MSG2 = MyDB2.OpenRecordset(Sqlstate2, dbOpenSnapshot) If M_MSG2.RecordCount > 0 Then DoCmd.SetWarnings False DoCmd.OpenQuery "くえり1" DoCmd.SetWarnings True End If Exit Sub Err_Set_Seisan_Click: End Sub 今、vbでこのようなデータ取込を作っており★のところで取込データを削除させてます。 ただこれだと1つのデータしか削除できず、複数あったときには対応が困ってます。 こちら歯どのような対応でできるでしょうか? ご指導お願いします。

  • テーブルの削除

    vb6でaccess2000テーブル(作成したもの)をすべて削除しようと試みますが何点か残ってしまいます。一発で削除する方法ありますか? For Each tbl In dbs.TableDefsの構文を使っています。

  • 重複データのエラー処理

    アクセス2002 XPの使用環境です。 CSVファイルよりアクセスのテーブルにインポートする時に キーを設定して重複データのインポートを避けていますが アクセスのエラーを非表示にしてエラーメッセージを出したいのですが うまく動作しません ご指南ください。 Private Sub データ取込_Click() On Error GoTo myErr DoCmd.SetWarnings False DoCmd.TransferText acImportDelim, , "データ取込", "c:\データ.csv", False MsgBox "データを取り込みました" DoCmd.SetWarnings True Exit Sub myErr: MsgBox "重複していますのでデータを確認してください" End Sub 正常の場合 データを取り込みました 重複の場合 重複していますのでデータを確認してください というメッセージを出したいのです。

  • テーブルの削除について

    DoCmd.OpenQuery "更新"でテーブルAを更新クエリを実行データBの データを更新してから DoCmd.DeleteObject acTable, "データB" でテーブルを削除するとエラーで削除できません どの様にすねれば削除できるでしょうか アクセス2003 XP の環境です よろしくお願いします

  • Accessクエリ実行時のメッセージ表示について

    クエリ実行時にメッセージが表示されるのが面倒なので以下のようにしました DoCmd.SetWarnings False クエリ実行 DoCmd.SetWarnings True こうするとメッセージが表示されなくなりますが、他の箇所 (テーブルを開いてデータを削除とか、フォームの削除とか) でもメッセージが出なくなってしまいます。 他のところではメッセージが出るようにしたいのですが… また、一度mdbを閉じて開きなおすと、ちゃんと出ます

  • Access マクロでのテーブル削除

    インポートの際にエラーテーブルが出来たら削除したいのですが、うまくいきません。 マクロでオブジェクトの削除でテーブルを指定すると、エラーテーブルが作成されなかったときにエラーになってしまいます。 VBAを作成し、プロシージャの実行で下記のファンクションを呼び出すと 【指定した式にMicrosoft Accessが見つけることのできない関数が含まれています】というエラーになります。 Public Function 削除() On Error Resume Next DoCmd.DeleteObject acTable, "TableA_インポート エラー" End Function できればVBAを使わずに「テーブルがあれば削除、なければなにもしない」というのを行いたいのですが、良い方法はないでしょうか? よろしくお願い致します。

  • VBSにて、Accessのテーブルを削除

    VBSの質問がここが妥当でなかったら、すみません。 VBSで、Accessの"A_TBL"というテーブルを削除したいのですが、 Set objAccess = CreateObject("Access.Application") objAccess.OpenCurrentDatabase("C:\test\TEST.mdb) objAccess.DoCmd.DeleteObject acTable, "A_TBL" を実行すると、 「実行時エラー:この変数は宣言されていません。:'acTable'] と出力され、エラーになります。どなたか、教えていただければうれしいです。 どうか、お願いします。

  • EXCELファイルからACCESSへインポート

    質問させていただきます。 ACCESSのフォームから、EXCELファイルを選択してEXCELの内容を、 テーブルにインポートさせたいのですが。以下の方法で行って いるのですが、テーブルに反映されません。 Private Sub cmd_Import_Click() Dim InitialFileName As String Dim varTitle As Variant Dim FileName As String InitialFileName = "hoge.xls" varTitle = "ファイルを開く" FileName = GETHOGEOPEN(varTitle, InitialFileName) DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_HOGE", FileName, True DoCmd.SetWarnings True MsgBox "完了しました" End Sub ACCESS → ACCESS2003 SP3 EXCEL →EXCEL2003 SP3 よく見ると、すでにEXCELのバージョン指定が違う(汗) これが原因かも・・・・(汗) わかる方がいらっしゃったら教えてください。

  • Access2.0、テーブルのエクスポート

    Access2.0のテーブルをWSHを使用してエクスポートしようとすると エラーとなってしまいます。 エラーメッセージは、以下のとおりです。 以前のバージョンのMicrosoft Accessデータベースにオブジェクトをインポートすることはできません。 以下に、コードを抜粋します。 Dim strName Dim objAccess Dim objDB Dim tbf Set objAccess = CreateObject("Access.Application") objAccess.Visible = False objAccess.OpenCurrentDatabase("c:\****.mdb") Set objDB = objAccess.CurrentDb objAccess.Docmd.TransferText 0,,"テーブル名","C:\****.txt" → ここで、エラーとなります。 どなたか、テーブルをエクスポートする方法を知ってる方、いらっしゃいませんか?