• ベストアンサー

ACCESSでのエクセルインポート時のシート有無の判定について

ACCESS上でエクセルファイルをインポートするにおいてそのファイルが存在するかの判定用IF文は If Dir("C:\インポートファイル.xls") = "" Then MsgBox "インポートファイル.xlsファイルがありません。" End If でうまくいくのですが インポートファイル.xls ______________________________ /シート2/シート3/シート4/ インポート用EXCELファイルのシート1が無いことを判定するときの設定方法がネットを調べても発見することが出来ませんでした、やり方があるようなら教えてください If Dir("C:\インポートファイル.xls" ※恐らくここに何か追加が必要だとは思うのですが※ ) = "" Then MsgBox "インポートファイル.xlsファイルのシート1がありません。" End If 一度質問を登録したのですが、登録失敗していたので再度質問しました。よろしくお願いします。

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

  • ベストアンサー
  • ruru0707
  • ベストアンサー率68% (20/29)
回答No.4

下記の文で一応テストしましたが、内容通り動いてくれました。(わざとシートを抜けた状態でインポートしてみました。)但し、#3の方のエラーコードと違うのでちょっとその辺がどうなのか実際のシートで試してみればいかがですか? 又、TransferSpreadsheetの各スイッチ等については、実際の環境の数値に合わせて下さい。くわしくはヘルプに出ていますので確認して下さい。 Private Function インポート() On Error GoTo Errインポート Dim strテーブル名 As String Dim strシート名 As String Dim intカウント As Integer Dim strエラーメッセージ As String intカウント = 1 strエラーメッセージ = "" DoCmd.RunSQL "delete * from 売上1テーブル" DoCmd.RunSQL "delete * from 売上2テーブル" DoCmd.RunSQL "delete * from 売上3テーブル" DoCmd.RunSQL "delete * from 売上4テーブル" Do While intカウント <= 4 strテーブル名 = "売上" & intカウント & "テーブル" strシート名 = "シート" & intカウント & "!" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, strテーブル名, "C:\インポートファイル.xls", True, strシート名 & "A1:C5" intカウント = intカウント + 1 Loop MsgBox ("処理終了しました。" & Chr(13) & strエラーメッセージ) Exit Function Errインポート: Select Case Err.Number Case 3011 strエラーメッセージ = strエラーメッセージ & "," & strシート名 & "が存在しませんでした。" Resume Next Case Else MsgBox (Err.Number & ":" & Err.Description) Exit Function End Select End Function

k-naruse
質問者

お礼

なんとかうまくいきそうです。 今回は本当にありがとうございました。

その他の回答 (4)

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.5

#4さんの例のようにセルも指定('Sheet1!A1:C5')すると、 エラーコードは3011(オブジェクト'Sheet1!A1:C5'は見つかりませんでした。オブジェクトが存在しているか、または名前やパス名が正しいかを確認してください。)になります。 シート全体を指定('Sheet1!')すると、エラーコードは3125になります。

k-naruse
質問者

お礼

なんとかうまくいきそうです。 今回は本当にありがとうございました。

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.3

シート1~4までインポートする構文をそれぞれ作成し、実際にシートが存在したか否かをそのエラーコードで判定してはどうでしょうか? 該当のシートが存在しない場合には、 エラーコード=3125 「'Sheet1$'が見つかりません。有効なパラメータやエイリアス名になっているか、無効な文字や区切り記号がふくまれていないか、または名前が長すぎないかを確認してください。」 が出ます。 このエラーコードをハンドリングして、次処理の分岐を考えては!?

  • ruru0707
  • ベストアンサー率68% (20/29)
回答No.2

シートが存在しない場合のみテーブルクリアとありますが、シートが存在する場合は、テーブルデータをクリアせずに追加でインポートするという事でしょうか?

k-naruse
質問者

補足

VBAで組んでいる流れ的には 【開始】 売上1テーブル(シート1用)をクリア 売上2テーブル(シート2用)をクリア 売上3テーブル(シート3用)をクリア 売上4テーブル(シート4用)をクリア EXCELファイルにシート1が存在すれば 売上1テーブル(シート1用)にインポートする 存在しないときは シート1がありませんと表示する EXCELファイルにシート2が存在すれば 売上2テーブル(シート2用)にインポートする 存在しないときは シート2がありませんと表示する EXCELファイルにシート3が存在すれば 売上3テーブル(シート3用)にインポートする 存在しないときは シート3がありませんと表示する EXCELファイルにシート4が存在すれば 売上4テーブル(シート4用)にインポートする 存在しないときは シート4がありませんと表示する 各シートごとに集計処理をする 【終了】 という感じになります。 IF文にてシートの有無の判定ができればそれで問題なくいけると思っているのですが IF文のみでのシートの有無の判定はできないのでしょうか?

  • ruru0707
  • ベストアンサー率68% (20/29)
回答No.1

最初に存在判定を行い、全てのシートが無くては実行をキャンセルしなくてはいけないのでしょうか? Dir関数ではなくて、TransferSpreadsheetを使い、インポートを実行する際に、シート名指定でLoopさせて、シートが存在しなくてErrの時にそのシート名を変数かテーブルに格納しておき、最後にErrのシート名をログにはきだすか、メッセージを出すというのではどうでしょうか?

k-naruse
質問者

補足

早速のご回答ありがとうございます。私の説明不足でデータ読み出しの流れを記入していませんでした。 流れ的には シート1がある場合はシート1テーブルへインポート シート1が無い場合はシート1テーブルをクリア シート2がある場合はシート2テーブルへインポート シート2が無い場合はシート2テーブルをクリア という感じになります。 ですのでそのシートが存在しないときはそのシートを無視してつぎの処理に行くという感じになるのです。 なのでシートが有るか無いかの判定文さえ出来ればいいかなと思ってます。 へたくそな説明で申し訳ありません。

関連するQ&A