みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ACCESS VBAでのインポート

アクセスでエクセルのファイルをインポートするVBAを書いています。
まず、フォルダ内のファイル名を全て取得してコンボボックスで表示します。
そのコンボボックスからインポートするファイルを選択し、インポートします。
ところが、インポートしようとすると「実行時エラー'3011'」となり、オブジェクトが見つかりませんとなってしまいます。

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "氏名順_仮", Me.shimei_folder.Value & "\06.6.1氏名順.xls", True
このように記述するとキチンとインポートするのですが、
path = Me.shimei_folder.Value & "\" & CStr(Me.shimei_combo.Value)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "氏名順_仮", path, True
これだと3011エラーになってしまうのです。
エラー表示が「オブジェクト"06.6.16氏名順$"が見つかりません」となるのですが、.xlsが$になってしまうのが原因??とも思います。
コンボボックス上は「06.6.16氏名順.xls」と表示されているし、デバッグしてみてもMe.shimei_combo.Valueは「06.6.16氏名順.xls」なのですが・・・。
どなたか、解決方法がわかれば教えて下さい。

ちなみにACCESS、EXCELともに2000です。

投稿日時 - 2006-10-18 11:25:48

QNo.2480411

すぐに回答ほしいです

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

こんにちは。

問題は、
"06.6.16氏名順.xls"

って、ファイル名としては、少し奇妙だと思います。例えば、"06_6_1氏名順.xls" なら分かるのですが、「.」が、それほど多いと、ファイル名としての認識が危ういような気がします。

単体では取れているようですから、それ以上のことは分かりませんが、他の方法としては、やはり、CurrentDirctor の変更で、そのまま、単発のファイル名でインポートしてしまう方法が考えられます。

いずれにしても、私なら、

If Dir(myPath & "\" & FileName) = "" Then
  MsgBox "ファイルが見当たりません" : Exit Sub
Else
  'DoCmd.TransferSpreadsheet '.....
End iF

このような、ファイル・チェッカーを入れます。

もちろん、ComboBox の値では、CStr 関数は必要がないように思います。また、path という変数ですが、一般的には、既存のプロパティ名(予約語とはいいませんが)ですから、その名称はやめたほうが無難だとは思います。

投稿日時 - 2006-10-18 14:08:58

お礼

ご回答ありがとうございます。
大変ためになる回答で嬉しいです!
インポートに関しては#1の回答者様へのお礼の欄に書いた事情でなんとかうまく行きました。
確かにファイル名は私も引っかかったので、ファイル名をNameで変えてみたりもしたのですが、それでは解決しなかったのでとりあえずそのままでやっていました。
ファイルを作成しているところが、ずーっと日付をピリオドで記入するのでもうこれは仕方ないと諦めています。
が、エラートラップをいれるのはやろうと思います。
pathという変数も変更することにしようと思います。
お詳しそうなので伺いたいのですが、4.0のエクセルはインポートできないものなんでしょうか?
今回のエラーはどうにもそれが原因のような気がしてならないので・・・。

投稿日時 - 2006-10-18 14:40:42

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

こんにちは。Wendy02です。

>4.0のエクセルはインポートできないものなんでしょうか?
>今回のエラーはどうにもそれが原因のような気がしてならないので・・・。

どうも、それが正解ですね。

だって、

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8 ....
このExcelのファイルフォーマットは、97以降を指すものです。
  ↓
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel4 ....
このフォーマットなら、Excel 4.0 なのですが、

On Error Resume Nextで、ファイルをインポートした時に Err.Number で、切り替えるという方法もあることはありますが、実務上は、一旦、Excel側のVBAで、全部、ファイルフォーマットをExcelの現バージョンに直してしまったほうが早いと思います。ファイルのタイムスタンプが変わってしまうという問題はありますが、バックアップを残しておけばよいだけでしょうね。

投稿日時 - 2006-10-18 15:08:21

お礼

重ね重ねご回答ありがとうございます。
いくつかのファイルを見てみたところ、4.0はまれにしか存在しないみたいです。
>On Error Resume Nextで、ファイルをインポートした時に Err.Number で、切り替えるという方法もあることはありますが
これをもとに、基本的にはファイルを変更せずに取りこみ、エラーになったらエクセルのバージョンを変えてみようかと思います。
>ファイルのタイムスタンプが変わってしまうという問題はありますが
これは今回は全く問題ないのですが、こういったことまでキチンと頭がまわるというのが凄いですね!!
プログラムを作る際にはこういうことも考えるようにします。
質問以外のことでも大変勉強になりました。ありがとうございます!!

投稿日時 - 2006-10-18 15:46:30

ANo.1

path = Me.shimei_folder.Value & "\" & CStr(Me.shimei_combo.Value)
ではなく例えば
Dim strFilename As String
strFilename = Me.shimei_combo.Value
として
path = Me.shimei_folder.Value & "\" & strFilename
ではどうでしょうか。これでいけると思いますが

投稿日時 - 2006-10-18 12:52:51

お礼

ご回答ありがとうございます。
頂いた方法で試してみたところ、一部のファイルはインポートできました。
よく調べてみると、インポートできないのはExcel 4.0ファイルのようです。
上記で言うと、「06.6.16氏名順.xls」は4.0で、「06.6.1氏名順.xls」は2000でした。
Dim AppExcel As Object
Dim Wb As Object
Set AppExcel = CreateObject("Excel.Application")
Set Wb = AppExcel.Workbooks.Open(path)
Wb.SaveAs Filename:= _
Me.shimei_folder.Value & "\" & Me.shimei_combo.Value, FileFormat:=-4143
Wb.Close
Set oExcel = Nothing
というようにファイルのバージョンを変えてみたらインポートできました。
質問に誤りがあって大変申し訳ありませんでした。
でも、時間がかかってしまうのでなんだか不便です。
4.0はインポートできないんでしょうか??不思議です・・・。

投稿日時 - 2006-10-18 14:33:15

あなたにオススメの質問