• ベストアンサー

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です。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 問題は、 "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 という変数ですが、一般的には、既存のプロパティ名(予約語とはいいませんが)ですから、その名称はやめたほうが無難だとは思います。

-yellowtail-
質問者

お礼

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

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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の現バージョンに直してしまったほうが早いと思います。ファイルのタイムスタンプが変わってしまうという問題はありますが、バックアップを残しておけばよいだけでしょうね。

-yellowtail-
質問者

お礼

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

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.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 ではどうでしょうか。これでいけると思いますが

-yellowtail-
質問者

お礼

ご回答ありがとうございます。 頂いた方法で試してみたところ、一部のファイルはインポートできました。 よく調べてみると、インポートできないのは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はインポートできないんでしょうか??不思議です・・・。

関連するQ&A