• ベストアンサー

ADOXによるテーブルのコピー

Access2000を勉強中のものです。 ADOXによってテーブルをコピーしたいのですが、 下記のようなソースを書いてもうまくいきません。 どのようにすればコピーできるのでしょうか? -------------------------------------------- Function テーブルのコピー() Dim cl As New ADOX.Catalog Dim tb As New ADOX.Table Dim sb As New ADOX.Table cl.ActiveConnection = CurrentProject.Connection Set tb = cl.Tables!コピー元のテーブル Set sb = tb 'コピーしたテーブルの名前を設定 sb.Name = "新しいテーブル" 'テーブルを追加する 'cl.Tables.Append sb MsgBox (sb.Name & "を作成しました。") End Function

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

  • ベストアンサー
回答No.2

CopyObject 使う手もあります。 DoCmd.CopyObject , "新しいテーブル名", acTable, "コピー元のテーブル名"

mojiraa
質問者

お礼

ありがとうございました。 非常に簡単にできました。

その他の回答 (1)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 Setでは、参照を代入するだけで、コピーすることは出来ません。 Set sb = tb はテーブル自体をコピーするのではなく、tbの参照先をsbの参照先としてコピーするだけです。 つまり、sbもコピー元のテーブルを参照することになります。 テーブルを別名でコピーするのだったら、以下のようにTransferDatabaseメソッドを使用すれば出来ます。 TransferDatabaseメソッドについては、ヘルプを参照して下さい。 Function テーブルのコピー() As Long   Dim tempFileName As String 'このAccessファイルのフルパスファイル名   'このAccessファイルのフルパスファイル名を取得する   tempFileName = Application.CurrentProject.path   If Right(tempFileName, 1) <> "\" Then     tempFileName = tempFileName & "\"   End If   tempFileName = tempFileName & Application.CurrentProject.Name   '自分自身からコピー元のテーブルを別名でインポートする   DoCmd.TransferDatabase acImport, "Microsoft Access", tempFileName, acTable, "コピー元のテーブル名", "新しいテーブル名" End Function

mojiraa
質問者

お礼

上記以外にもいろいろな方法があるみたいですね。 ありがとうございました。

関連するQ&A

  • データ型をメモ型にして既存テーブルにフィールドを追加したい(ACCESS ADOX)

    Sub test() Dim cat As New ADOX.Catalog Dim tb As New ADOX.Table cat.ActiveConnection = CurrentProject.Connection 'テーブルを開く Set tb = cat.Tables("テーブル1") tb.Columns.Append "フィールド1", ad○○ Set cat = Nothing Set tb = Nothing End Sub これで既存のテーブルにフィールドを追加できることを知ったのですが データ型をメモ型にするにはどの「ad○○」にすればいいのでしょう? (文字数が多いためテキスト型では収まりません) オブジェクトブラウザで見ても、多すぎてどれなのかわかりません。 ご教授よろしくお願い致します。

  • ADOX フィールドのRequiredプロパティを

    ADOX フィールドのRequiredプロパティをFalseにしたい アクセスです。 Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim idx As ADOX.Index Dim varRet As Variant Dim strMsg As String Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "test" tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる tbl.Columns.Append "氏名", adVarWChar, 50 cat.Tables.Append tbl 主キーを作る Set idx = New ADOX.Index idx.Name = "Primary" idx.PrimaryKey = True idx.Columns.Append "氏名ID" tbl.Indexes.Append idx MsgBox tbl.Name & "テーブルを作成しました。" Set cat = Nothing End Sub ********************************************************** 上記のコードでテーブルを作ると、RequiredをTrueにしてないのに、 実際にテーブルにデータを入れてる時に、NULLにしようとすると、 ********************************************************** フィールドに必要なプロパティが True に設定されているため、 このフィールド '<フィールド名>' には Null 値は挿入できません。値を入力してください。 ********************************************************** となります。 Requiredプロパティの規定値は、False になってますが、 なぜか値を要求されてしまいます。 ADOXで上記のコードに追加してRequiredをFalse にする方法を教えてください。、

  • ハイパーリンク型を指定することは可能ですか?

    VBAでテーブル(フィールド)を作る際にハイパーリンク型を指定することは可能ですか? Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "テーブル" tbl.Columns.Append "URL", adVarWChar cat.Tables.Append tbl Set cat = Nothing End Sub アクセスでこんな感じで作ってるのですが adVarWCharの部分をハイパーリンク型にしたいです。 しかし http://www.accessclub.jp/ado/adox/06.html を見てるとデータ型にハイパーリンク型が見当たらないのですが、不可能という事でしょうか?

  • access 最終閲覧レコードを開く

    フォームを閉じるときに表示していたレコードを次回開くときにも表示させたいのです。 データにはIDをふっているのですが、レコードの番号と同じではなく、フォームを閉じるときにIDを記録するテーブルを作成して次回オープン時に呼び出そうとしたのですが、GoToRecord を使うのではうまくいかないでしょうか? フォームを閉じるときは下のように作りました Private Sub Form_Close() Dim cat As ADOX.Catalog Dim tb As ADOX.Table Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tb = New ADOX.Table tb.Name = "T最終閲覧" tb.Columns.Append "ID", adInteger cat.Tables.Append tb Set cat = Nothing ここに     .AddNew ![ID] = [Forms]![フォーム名]![ID] .Update としています。 このデータをオープン時に生かすことができず、詰まっています レコード番号自体を記録することがきるかもわからず、どんどん後回しになってしまって何時まで経っても完成しません。 何かヒントでも構いませんのでご教授いただければと思います。

  • テーブルのすべてのフィールド名を配列として取り出せ

    テーブルのすべてのフィールド名を配列として取り出せるように変数に格納したいのですが 詰みました。 Private Sub test() Dim cat As ADOX.Catalog Dim clm As ADOX.Column Dim tmp As Variant Dim myTable As String myTable = "T_Table" Set cat = CreateObject("ADOX.Catalog") cat.ActiveConnection = CurrentProject.Connection For Each clm In cat.Tables(myTable).columns tmp = Array("フィールド1", "フィールド2") Next clm End Sub のようなことがしたいのですが、clm.nameでせっかく名前が取得できるのに、 どうやったらtmpに格納できるのでしょうか? Arrayを使わない方法はあるのでしょうか?

  • アクセスのインポートエラー 続き

    先ほど、質問しました続きです。以下のVBAを作成しましたが、うまくいきません。助言お願いします。 Option Compare Database Private Sub 実行_Click() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim strName As String Dim i As Long strName = "エラー" i = 0 Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection For Each tbl In cat.Tables If tbl.Name = strName Then i = 1 If MsgBox(tbl.Name & "テーブルを削除しますか?", _ vbYesNo) = vbYes Then cat.Tables.Delete tbl.Name MsgBox tbl.Name & "テーブルの削除を完了しました。" End If Next tbl If i <> 1 Then MsgBox strName & "テーブルが存在しません。" Set cat = Nothing End Sub

  • ADOX 複数回フィールドを定義することは出来ませ

    アクセス2010ですが アクセスの仕様を見ると テーブル内のフィールド数の最大値は255なのですが ADOXでVBAでテーブルを作成してるのですが 実行時エラー -2147217858 複数回フィールドを定義することは出来ません。 と言うエラーになり、テーブルが作れません。 vbaコードの一部は Set cat = New ADOX.Catalog Set tbl = New ADOX.Table cat.ActiveConnection = CurrentProject.Connection tbl.Name = "test" For i = LBound(tmp) To 200 ' UBound(tmp) Col = tmp(i) tbl.Columns.Append Col, adVarWChar, 20 tbl.Columns(Col).Attributes = adColNullable Next i cat.Tables.Append tbl です。 ためしに To 200 を To 100 にしても同じようなエラーになりました。 何でエラーになるのでしょう???

  • アクセスのテーブルに項目を追加するコードの作成方法

    現在作成済みのアクセスのテーブルにいくつかの項目を追加するプログラムを作っています。 「Name = "場所ドライブ"」 「.Name = "区画図ドライブ"」 「.Name = "区画図"」 以上の項目をテキスト型で追加したいのです。 同時に現在ある「Name = "場所"」というはすでに存在する項目を「OLEオブジェクト型」から「テキスト型」に変更したいのです。 単純に「Name = "場所"」をテキスト型で追加したコードを作成したら動きません。 どなたか助けていただけますか。下記にコードを書きます。                                          祥子 Private Sub コマンド1_Click() Beep If (MsgBox("データをアップデートします!!") = 7) Then End If Dim cnn As New ADODB.Connection Dim catDB As New ADOX.Catalog Dim colAdo As ADOX.Column Dim tbl As ADOX.Table Dim strCon As String Dim lIdx As Long strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" strCon = strCon & "Data Source=c:\ynet\Hz2data1.mdb" cnn.Open strCon catDB.ActiveConnection = cnn Set tbl = catDB.Tables![区画1] '変更か削除したいフィールド 'CurrentProject.Connection.Execute "ALTER TABLE [区画1] ALTER COLUMN 場所 TEXT(255)" '以下追加したいフィールド Set colAdo = New ADOX.Column With colAdo .Name = "場所ドライブ" .Type = adVarWChar .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "場所" .Type = adVarWChar .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "区画図ドライブ" .Type = adVarWChar .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "区画図" .Type = adVarWChar .Attributes = adColNullable End With

  • ADOXでAccessのファイルを作る

    ADOXで下記のようにAccessファイルを作ろうと思うのですが Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table Dim col As New ADOX.Column Dim idx As New ADOX.Index cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & ここには作成先のパス & ";" _ & "Jet OLEDB:Engine Type=4;" tbl.Name = "T_連絡先" col.Name = "連絡場所" col.Type = adVarWChar col.DefinedSize = 20 col.ParentCatalog = cat col.Properties("Jet OLEDB:Allow Zero Length") = True tbl.Columns.Append col Set col = Nothing col.Name = "連絡番号" col.Type = adVarWChar col.DefinedSize = 13 col.ParentCatalog = cat col.Properties("Jet OLEDB:Allow Zero Length") = True tbl.Columns.Append col Set col = Nothing cat.Tables.Append tbl Set tbl = Nothing 4台ある中の2台のPCでは問題なくファイルが作成されましたが、残り2台に関してはファイルは作成されるもののテーブルは作成されませんでした。 コードを削除しながらテストしてみると、"連絡場所"フィールドに問題があるらしく、"連絡場所"フィードのコードを削除すると問題なくテーブルも作成されます。 しかも、不思議なことにコードを変えずにフィールド名"連絡場所"を"連絡場所1"とするとテーブルは問題なく作成されます。マシンはすべてWin2000ProにVB6SP5です。とんでもなく初歩的なところでミスをしているような感じもしますが、まったく原因がつかめませんので、どうかよろしくお願いいたします。

  • ADO&mdbで、リンクテーブルの作り方

    お世話になっています。 行き詰って困っています。 あるmdb(Access2000形式)内のテーブルを別のmdb(同)から見られるようリンクテーブルを作りたいのですができません。 VB.NET 2005 でやっています。 いろいろ調べてMSDN等からサンプルを引っ張り、以下のように作っても、 Dim catDB As ADOX.Catalog = New ADOX.Catalog Dim tblLink As ADOX.Table = New ADOX.Table catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Mdb_Link With tblLink .Name = "TEST_TBL" .ParentCatalog = catDB .Properties("Jet OLEDB:Create Link") = True <---ここと .Properties("Jet OLEDB:Link Provider String") = Mdb_Test <---ここと .Properties("Jet OLEDB:Remote Table Name") = "TEST_TBL" <---ここ End With catDB.Tables.Append(tblLink) catDB = Nothing .Propertiesの3行でエラー(プロパティ'Item'は'ReadOnly'です。)になってしまい、サンプル通りに行きません。 これについて何か心当たりありましたら教えてくださると嬉しいです。

専門家に質問してみよう