accessでexcelファイルを取り込むのにインポートが良いのか、或いはリンクが良いのか? 元のファイルを明確にする(しておきたい)必要がある場合は、リンク(acLink)を使うのが良い。 accessを開いた状態では、リンクしているexcelファイルがロックされるので、他のユーザがexcelファイルを更新できない(読み取り専用となる)。 勿論、accessを閉じれば、いいだけだ(他のユーザはexcelファイルを更新できるようになる)。 そんな使い勝手は、窮屈で嫌だというのであれば、元ファイルをその度にコピーし、複製をリンクしておくのがよろしいのではないか。 リンクした場合、データの型変換エラーがあると、そのフィールドが#num errorと表示されるが、実際、その値が使用されるまでわからない(と思う)。 また、リンクしたテーブルが空(タイトル行のみで、データ行がない)の場合、そのテーブルを参照するクエリは、全て型エラーになる(タイトル行のみで、データがないため、データ型を決められない=型が一致しないというチグハグなエラーで怒られる)ので、テーブルが空、つまり、タイトル行しかない場合は、そのクエリをスキップするとかの対応が必要となる。 vbaで書くと、If dcount("フィールド名","テーブル名") > 0 で判定し、成立した場合にクエリを出すというのがよろしい。 excelファイルをリンクするvbaを書いてみた。これでリンク操作を自動化できる。
Sub ImportExcel() Dim file1 as String file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx" if DCount("*", "MSysObjects", "[Name] = 'テーブル1'") > 0 Then DoCmd.DeleteObject acTable,"テーブル1" ' テーブル1があれば削除する DoCmd.TransferSpreadsheet acLink,acSpreadsheetTypeExcel12Xml,"テーブル1",file1,True,シート名 If Dcount("フィールド1","テーブル1") > 0 then 'テーブル1が空でなければ(フィールド1のデータが存在する)、クエリ1を実行する DoCmd.Query "クエリ1" End if End Sub元のファイルを明確にする必要がなければ、インポート(acImport)を使うのが良い。 インポートを使えば、元のexcelファイルがロックされることはない。 インポートを使うと、型変換エラーがあったら、インポート直後にその旨のエラーメッセージが出るので、対応しやすい。ただし、エラーを見逃さない執念深さが必要である。 excelファイルのインポート操作を自動化するvbaは、以下の通りだ。
Sub ImportExcel() Dim file1 as String file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx" if DCount("*", "MSysObjects", "[Name] = 'テーブル1'") > 0 Then DoCmd.DeleteObject acTable,"テーブル1" ' テーブル1があれば削除する DoCmd.TransferSpreadsheet acImport,acSpreadsheetTypeExcel12Xml,"テーブル1",file1,True,シート名 End Sub
0 件のコメント:
コメントを投稿