• ベストアンサー

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

  • AccessからVBAでExcellシートのインポート

    すみません。教えてください。 AccessVBAでエクセルのシートをインポートしたいのです。 いつも同じ行数ではありませんのでrange指定を埋め込むわけに行きません。 DoCmd.TransferSpreadsheet acImport, , "給与データ報告書", "c:\test\test.xls", True, "a1:p6000" でインポートできるのですが DoCmd.TransferSpreadsheet acImport, , "給与データ報告書", "c:\test\test.xls", True, "" range指定をしないとエラーになります。(出来ると書いてあるが) sheet1、ワークシート名とかの指定が出来ればと思い、いろいろ試してみたのですが出来ません。 宜しくお願いいたします。

  • インポートの自動化

    複数のエクセルファイルを自動でインポートしたいのですが DoCmd.TransferSpreadsheet _ TransferType:=acImport, SpreadsheetType:=acSpreadsheetTypeExcel97 _ , TableName:="T1", FileName:="C:\Book1.xls", HasFieldNames:=True のコードだと特定したファイルしかできないみたいです・・。 指定したフォルダの中にある複数のエクセルファイルを 自動でインポートするコードなんてあるんでしょうか? 幾分、初心者のためわからないことが多いです。 教えていただけると助かります。 よろしくお願いします。

  • access97で作成したエクセルインポート機能がaccess2003で機能しません

    お世話になります。 下記ご経験ある方いらっしゃいましたら、教えていただけないでしょうか? Access97で開発されたあるシステムがあります。 これをAccess2003で使用したいと考えています。 データベースの変換は問題なく終了し、プログラムエラーも発生していないのですが、実行するとエクセルのインポートができていないことがわかりました。 ソースの該当箇所は以下のようになっています。 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, "Trtry", "\\jpn\test\マスタ.xls", True (ある共有フォルダ上で管理しているエクセルを読み込みます) 試してに"acSpreadsheetTypeExcel97"の部分を変更してみたところ、以下のような状況でした。 (1)"97"の部分を"5"~"9"に変更したところ、現象は回避せず。 (2)"97"の部分を"3"~"4"に変更したところ、インポートはできたが、文字化けが発生してしまう。 ここで行き詰ってしまい、困っております。 宜しくお願い致します。

  • Access から Excelのシートをインポート時エラー

    Access の既存のテーブルにExcelのスプレッドシートからデータをインポートするため次のコマンドを実行すると、 F1フィールドがない旨のエラーメッセージが表示されます。 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "アクセスのテーブル名", "インポート元のエクセルファイル名.xls", False ここで、F1フィールドとは何でしょうか。 Excelのシートの1行目にAccessのテーブルの項目名と同名の項目名を挿入しておけば、上のコマンドの最後の引数をTrueにすればインポートは成功します。項目名のないスプレッドシートはインポートできないのでしょうか。 ご存知の方、教えてください。

  • EXCELファイルからACCESSへインポート

    質問させていただきます。 ACCESSのフォームから、EXCELファイルを選択してEXCELの内容を、 テーブルにインポートさせたいのですが。以下の方法で行って いるのですが、テーブルに反映されません。 Private Sub cmd_Import_Click() Dim InitialFileName As String Dim varTitle As Variant Dim FileName As String InitialFileName = "hoge.xls" varTitle = "ファイルを開く" FileName = GETHOGEOPEN(varTitle, InitialFileName) DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_HOGE", FileName, True DoCmd.SetWarnings True MsgBox "完了しました" End Sub ACCESS → ACCESS2003 SP3 EXCEL →EXCEL2003 SP3 よく見ると、すでにEXCELのバージョン指定が違う(汗) これが原因かも・・・・(汗) わかる方がいらっしゃったら教えてください。

  • Accessを使ったデータの一括インポートについて

    VBA初心者です。 現在ExcelのデータをAccessにインポートする方法を探しています。 フォルダの構成としては 親フォルダに子フォルダがあり、そのなかにファイルがあります。 例としましては 親フォルダ 子フォルダ ファイル名 A aaaa 1111 B bbbb 2222 C cccc 3333 D dddd 4444 E eeee 5555 F ffff 6666 と言った感じです。 自分なりに調べて1つのフォルダの中にあるデータは全てインポートできそうです。(aaaaフォルダ内等) 現在、親ごとにテーブル分けして一括インポートできる方法を探しています。 現在のコードは Private Sub AAA_Click() Dim dname As String Dim fname As String Dim tblname As String dname = "c:\フォルダ名\" tblname = "テーブル名" fname = Dir(dname & "*.xls") Do While fname <> "" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, dname & fname, True fname = Dir() Loop End Sub これを用いようと考えてます。 ここから子フォルダ内を全て1つのテーブルにまとめるというところでつまづいております。 初心者のためコードも頂けると助かります。 よろしくお願いします。

  • access vba インポートについて

    別のところで質問したのですが、回答が得られなかったので こちらで質問しまする。 昨日、accessをさわリはじめた、おっさん初心者です。 お願い:エクセルのデータをアクセスにインポートしたいです。      1つのエクセルファイルに複数(30枚)シートがあり、      それぞれのシート名で、アクセスのテーブルが複数作成できれば良いです。      アクセスのVBAにどんなコードを書けば良いのでしょうか。 1つのシートの取り込みは、 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, ”インポート先テーブル名", "ファイル名", True, "シート名" & "!" (全くわかってませんが、)これでできましたが、この辺がおっさんの限界でした。 色々web見たのですが、難しい・・・とりあえず、やさしく教えてください。 (1)フィールド名ごとインポートする方法 (2)すでに存在するテーブルにデータを継ぎ足す方法 テーブル”A”には  日付     獲物    調理    感想   1月1日    きつね   なべ    にがい  1月2日    もぐら   からあげ  まずい 1月3日    ぱんだ   さしみ   あまい           ↑   ↑   ↑   ↑  ↑ シート ”A”から 1月4日    たぬき   なべ    ばかうま 1月5日    らっこ   ひもの    うまい を追加 この二つができるとうれしいです。 アクセスは2000です。 エクセルは2000です。 ウィンドウズはXPです。 エクセルは初級程度できます・・・。 基本を理解していなくてもわかる感じで助けてパソコン大先生!!

  • エクセルからアクセスにインポートする際のエラーについて

    こんにちは。 エクセルで作成された従業員台帳を、アクセスにインポートしたいのですが、エラーが出て困っています。 インポートの為のフォームを作り、参照ボタンでそのエクセルファイルを選択してフルパスを取得し(こちらの動作はOKです)、実行ボタンでそのファイルをインポートする、という方法をとろうと思います。 transferspreadsheet で、エクセルのファイル(.xls)は問題なくいくのですが、csv形式のファイルを指定して同じようにインポートすると、 実行時エラー 3274 外部テーブルのフォーマットが正しくありません。 となってしまいます。 書いているコードは、 DoCmd.TransferSpreadsheet acImport, 8, "従業員台帳(アクセス側でのテーブルの名前)", "上記画面で取得したフルパス", True(一番上の項目をフィールド名として使用します), "" です。.xlsでも.csvの形式でもインポートできるようにしたいのです。 環境は、winXPpro、Access2000、Excel2000 です。 よろしくお願いします。

  • ACCESS エクセル取込 列指定

    下記のコードでエクセル取込を行おうと思いましたが、列指定をする"A:M, O:V"の箇所でエラーとなってしまいました。A:M列だけならエラーもなく取り込めますが、O:V列も取り込みたいです。 N列を取り込みたくない理由としては、文字と数字が混在していて、省きたいと思っております。 何か良い方法はございませんでしょうか? DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_SAPShohin", Path, True, "A:M, O:V" ←エラー ____________________________________________________________________ Private Sub SAPShohin_Click() Dim Path As String Dim Res As String WizHook.Key = 51488399 Res = WizHook.GetFileName(0, "", "", "", Path, "CurrentProject.Path", "(*.xlsx,*.xls)", 0, 0, 4, -1) If Res = 0 Then '取得したファイルパス(Path)でExcelからインポート DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_SAPShohin", Path, True, "A:M, O:V" Else '[キャンセル]ボタンが押された場合の処理 MsgBox "[キャンセル]ボタンが押されました。" Exit Sub End If MsgBox "インポートできました!"

  • [PG]AccessVBAでファイルのインポートする方法

    [PG]AccessVBAでファイルのインポートする方法 VBAでエクセルファイルのインポートする機能を実装しています。 下記のコードで実行しますと実行時エラー"3011"が表示され DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange で止まります。何か解決方法を教えていただけないでしょうか? Function ExcelDataImport() 'On Error GoTo エラー Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String ' --- Accessテーブルを指定します。存在していなければ自動的に作成します。 varac = "tbl_売上げテーブル" ' ---Excelファイルを指定します。必ず、存在していなくてはいけません。 varxls = "C:\売上げ.xls" ' --- データ入力のシート名とセル範囲を指定します。 ' なお、省略が可能です。省略した場合は、ワークシート全体がインポートされます。 strrange = "売上げシート!A1:D10" strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & _ "へ、データ入力を行います。" & Chr(13) & _ "Excelファイルの入力レンジは、 " & strrange & " です。" ' --- DeleteObjectメソッドを用いて、tbl_売上げテーブルを削除します。 ' --- TransferSpreadsheetメソッドを用いてデータをインポートします。 DoCmd.DeleteObject acTable, varac If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange MsgBox "データ入力は、正常に完了しました。" End If Exit Function

専門家に質問してみよう