■99641 / inTopicNo.5) |
Re[4]: AccessVBAで主キーのないテーブルをインポート |
□投稿者/ たかし (3回)-(2022/05/08(Sun) 13:34:01)
|
> 実際自分は、主キーが無くても DoCmd.TransferSpreadsheet acImport,…… で > 新規テーブルに取り込むことができています。 > > あるいはすでに主キーもしくは UNIQUE INDEX があるテーブルに対して > データを追加する場合であったとしても、やはり acImport は行えるはずです。 > > もしも既存テーブルへのインポートの場合、キー違反や桁数超過などで取り込めないデータが > 含まれていた場合には、競合するデータをスキップして、それ以外のデータのインポートを継続するか、 > それともインポートそのものを取りやめるかという確認メッセージが現れます。 > メッセージボックスで継続続行を指示すれば競合していないデータのみを取り込めますし、 > DoCmd.SetWarnings にて、警告画面の On/Off も行えます。
少し説明が不足でした。やってみたことは次のとおりです。 AccessテーブルにIDフィールドを作り、ExcelファイルにもIDフィールドを作りました。 そのIDフィールドを空欄にしてVBAでインポートを行うと、キー違反のメッセージが出てインポートされませんでした。 これは当然ですよね?
そこでおっしゃるようにどちらのファイルからもIDフィールドそのものを削除して見たらインポートできました。 「主キーがないとインポートできない」は、私の判断ミスでした、すいません。
> あるいは acImport を行う代わりに、異種 DB 間クエリを用いて > INSERT INTO あるいは SELECT INTO するという選択肢もあるでしょう。 > この異種 DB 間クエリは、エクスポート目的や複数の Access ファイルのマージにも使える手法です。 > > CurrentDb.Execute "INSERT INTO [Sheet1] SELECT * FROM [Excel 12.0 XML;HDR=YES;IMEX=1;Database=C:\test\Book1.xlsx].[Sheet1$]" > > CurrentDb.Execute "SELECT * INTO [Sheet2] FROM [Excel 12.0 XML;HDR=YES;IMEX=1;Database=C:\test\Book1.xlsx].[Sheet1$]" > > https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/select-into-statement-microsoft-access-sql > > あるいは 「IN 句」でも同様のことができます。(IN 演算子とは異なります) > https://docs.microsoft.com/ja-jp/office/vba/access/concepts/miscellaneous/in-clause-microsoft-access-sql
これについては少し勉強してみたいと思います。
> この他、手動インポートで、保存済みインポート/エクスポートが行われたことがあり、 > それを再実行したいという状況であれば、 RunSavedImportExport メソッドを使うこともできます。 > 今回は関係ないでしょうけれども。
手動ではなくVBAを考えています。
> >> 第一引数は定数(列挙型)を指定しているのに、 > >> 第二引数には何故マジックナンバーを指定しているのでしょうか。 >>すみません、どの箇所のことを仰っているのでしょうか?つまり >>DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet1", パス & "\" & "1_sampledata" & ".xlsx", True, "" >>で良いですか? > これがたとえば、参照設定できない環境(VBScript など)あるいは参照設定していない環境だと、 > 「acImport, acSpreadsheetTypeExcel12Xml」の代わりに「0, 10」と書くケースもあるでしょう。 > > しかし今回は Access VBA のようですし、しかも「acImport, 10」という混在した不自然な指定方法のため、 > 何故、一部だけをあえてマジックナンバー表記にしたのだろう…と疑問に思い、理由をお尋ねした次第です。
分かりました。
>>本題に戻ってインポートの際に自動で採番することは不可能でしょうか? > これは、自動採番される主キー列を作りたいということでしょうか?
そうです。それが目的です。 > それとも、Excel 側に存在していなかったフィールドを > >> 式1: [処理連番] & [行] & [明細区分] > のような式で追加したいということですか?
それでも良いのです。
> 後者の「Excel 側に無いフィールドを式列として追加したい」という話であれば、 > 今回述べた異種DB間クエリの手法を使えるでしょう。 > > 前者の自動採番列を求める場合は、CREATE TABLE ステートメントでオートナンバー列を > あらかじめ用意しておき、そこに向かって acImport してやればよいでしょう。 > > CurrentDb.Execute "CREATE TABLE [Table1] ([ID] AUTOINCREMENT PRIMARY KEY, [処理連番] INTEGER NOT NULL, [行] INTEGER NOT NULL, [明細区分] TEXT(10) NOT NULL )" > > あるいはオートナンバー列が無い状態で取り込んでから、あとから ALTER TABLE で列を追加することもできますよね。
分かりました、検討してみます。また分からないことが出てきたらお願いしたいと思います。
|
|