• ベストアンサー

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

  • アクセスからエクセルへインポートの際に

    アクセスからエクセルへクエリの結果をインポートしています。 そこでワークシートができるのですが、その後、そのワークシート が残るので同じ処理をした際に、同じ名前のワークシートに上書き すると思っていたのですが、新たにワークシートを作成して しまい困っています。 VarAccess = "入力禁止LEJOUR" の部分がワークシート名になりますが 同じ処理をすると入力禁止LEJOUR1というワークシートが横に できてしまいます。 これを入力禁止LEJOURのシートに上書きさせるには どんなコードを使用したらいいでしょうか? 教えてください。 よろしくお願い致します。 Private Sub コマンド15_Click() On Error GoTo エラー Dim VarAccess As Variant Dim VarExcelpass As Variant Dim strmsg As String VarAccess = "入力禁止LEJOUR" VarExcelpass = "\\Shiob030\共有\生産戦略事業部\03.生産L.C.海\B.指図進捗表(月単位)\07\SS\07SS-LE JOUR.xls" strmsg = VarAccess & "を、Excelファイルへ出力します。" & _ Chr(13) & "出力先は" & VarExcelpass & "、 シート名は" _ & VarAccess & "です。" & Chr(13) & "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, VarAccess, VarExcelpass, True MsgBox "データ出力は、正常に完了しました。" End If Exit Sub エラー: If Err.Number = 3044 Then MsgBox "Excelファイルのパス指定が間違っています。", vbCritical Else MsgBox "予期せぬエラーが発生しました。", vbCritical End If End Sub

  • Accessへのエクセルデータインポート

    Accessへのエクセルデータインポート 環境:Access2000/WinXP アクセス2000の特定テーブルへ、エクセルデータをインポートするよう組んだのですが、新しくデータを追加すると、これより前に入っていたデータがレコードを残して消えてしまいました。 新規データを追加した際にただの追加としたいのですがどこがおかしいのでしょうか。 Private Sub データ登録_Click() Dim objExcel As Object Dim varFilePath As Variant Dim bln As Boolean Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String varac = "受講者情報一覧" Set objExcel = CreateObject("Excel.Application") varFilePath = objExcel.GetOpenFilename("Microsfot Exel (*.xls), *.xls", , "xls選択") If varFilePath <> False Then varxls = varFilePath Else Exit Sub End If Set objExcel = Nothing varxls = varFilePath strrange = "" strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & "へ、インポートします。" DoCmd.DeleteObject acTable, varac If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, varac, varxls, True MsgBox "正常にインポート完了しました。" End If Exit Sub エラー: MsgBox "予期せぬエラーが発生しました。" & Chr(13) & "エラー番号:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbCritical Exit Sub End Sub

  • エクセル シートのみ 保存

    過去の質問も参照しましたが 当てはまる物が無くて質問しました! シート上にボタンを作成して クリックするとそのシートのみ 指定するファイルにコピーさせたいです! 下記の部分で何処を変化させればよいのでしょうか? (1)~(2)の部分で困っています。 Private Sub CommandButton1_Click() Dim FileName As String Dim FileExt As String ’(1)の質問!○=の部分をSheets(セルのA1の値をファイル名に入れたいです) FileName = "○"& Format(Now, "yyyy-mm") & ".XLS" '==== FileName = InputBox(FileName & "と言う名前で保存します" & vbCr & "よろしければこのままOKをクリックしてください", "保存ファイル名の確認", FileName) If FileName = "" Then Exit Sub Else If Right(FileName, 4) <> ".XLS" Then MsgBox "ファイル名が異常です。" Exit Sub End If End If '==== FileName = "D:\保存\ケア\計画\" & FileName If Dir(FileName) <> "" Then '##ファイルが既に存在する If MsgBox("既に指定のファイルが存在します。 上書きしますか?", vbOKCancel, "上書きの確認") = vbCancel Then '##保存せずに終了 Exit Sub ElseIf ThisSheets.FullName = FileName Then '##現在開いているファイルと同じなら上書き保存 ThisSheets.Save Else '##指定ファイルを削除した後保存 Kill FileName ThisSheets.SaveCopyAs FileName:=FileName End If Else '##ファイルを新規保存 ThisSheets.SaveCopyAs FileName:=FileName End If ThisSheets.Saved = True End Sub (2)ThisSheets&指定してもう一つだけ  保存先にコピーしたいです!つまり  2つのSheetのみ保存させたいのですが・・  ここからどのようにしたら良いのか  お願いします!教えて下さい。  

  • Excel VBA 違うxlsファイルの指定したシートを開く処理

    Excel VBAで違うExcelファイルの指定したシートを開きたいのですが、 うまくいきません。現在のコードは、 *フォーム* Private Sub CB1_Click() Dim A As Integer A = MsgBox("データ展開する?", 4, "データ展開?") If A = 6 Then INPORT.FILE_OPEN1 End If End Sub *INPORTモジュール* Sub FILE_OPEN1()  FILE_OPEN8 End Sub Sub FILE_OPEN8() Dim fnames As String fnames = fnames1 Workbooks.Open Filename:=fnames ***ここでしょうか?.Sheet("")と指定しても出来ません*** End Sub Function fnames1() As Variant fnames1 = Application.GetOpenFilename( _ Title:="ファイルを開く", _ FILEFILTER:="エクセルファイル (*.xls), *.xls") If fnames1 = False Then MsgBox ("ファイルを開けませんでした。" & Chr$(13) & _ "もう一度やり直して下さい。") End End If End Function また、指定する事が出来たら、選択したシートを現在のブックにコピーもしたいのですが、どの様にすればよいでしょうか? よろしくお願いします。

  • Excelワークシートがインポートできない

    Excelのワークシート 拡張子xls ファイルを、Access2010の外部データ - excelワークシートのインポート機能を使ってインポートしようとすると、 "ファイル*****.xlsの情報にアクセスできません。ファイルが存在し、形式が正しいことを確認してください。" というメッセージが現れ、インポートすることができません。 先週までは、同じことを問題なく、実行できていました。異なるのは、インポートするファイル名とファイル内のデータの中身だけで、ファイル構造、形式は同じです。 ちなみに、 ファイル名を変えてみましたが同様のエラーがでます。 また、インポートするxlsファイルをExcelで開いて、古いバージョンで保存、その後、再度そのファイルを開き、元のバージョンで保存すると、正常にインポートできるようになります。 先週、うまくインポートできていたので、その時使ったxlsで試したところ問題なくインポートできました。 ネット検索してみると、同様の質問がいくつかあるようですが、解決策が明記されていません。 どなたか解る方がいらっしゃいましたら、教えてください。

  • Access テキスト インポート

    現在指定したファイルしかインポートしが出来ないのでこれを 指定したファイルをインポートしたいのですがどのようすれは、いいでしょうか?よろしくお願いします。 Private Sub コマンド5_Click() On Error Resume Next Dim MsgNo As Integer Dim Msg1, Msg2, Msg3 As String Dim su As String Dim cut As Integer Dim fd As String Dim suu As String Dim db As Database Dim d1 As Recordset Msg1 = " インポートを開始します。" Msg2 = "「DAT」ファイルがありません。" Msg3 = "「DAT」ファイルを c:\DATデータにコピーし、再度実行して下さい。" MsgNo = MsgBox(Chr(9) & Msg1 & Chr(9), 1) If MsgNo = 2 Then 'キャンセルボタンで終了 GoTo Exit_インポート_Click End If EmptyAllTable 'テーブルクリア Set db = CurrentDb Set d1 = db.OpenRecordset("t_製品データ") fd = Dir("C:\DATデータ\*.dat") If fd = "" Then 'ファイルがなければ、メッセージを表示、処理を戻します。 Beep MsgNo = MsgBox(Msg2 & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Msg3, 16) GoTo Exit_インポート_Click End If

  • エクセルVBAでシート名検索

    エクセル2000です。 あるブックにAAAという名前のワークシートが存在するかどうかの判定方法の質問です。 現在はそのブックを開き、 Sub test() For Each sh In ActiveWorkbook.Worksheets If sh.Name = "AAA" Then flag = "ありまする。" Else flag = "ないでござる。" End If Next MsgBox flag End Sub のように判定しています。 質問は、 1.開かずに判定することは可能かどうか?可能ならその方法 2.上記コードのように各シート総当り以外にシート名を検索する方法があるか?あるならその方法 です。よろしくお願いします。

  • Accessへワークシートからのインポート

    [ファイル]-[外部データの取込]-[インポート]からインポートウィザードでインポートを実行すると"インデックスが有効範囲にありません"とメッセージが表示されます。 [OK]ボタンで先へは進みますが最後の画面で[完了]ボタンを押しても"インポートするときにエラーが発生しました。ファイルはインポートされませんでした"のメッセージが現れ、インポートすることができません。 インポート元のExcelファイルは複数のシートから構成され、別シートからのインポートはエラーすることなく実行できます。何度かシートの違いを確認しましたが違いが発見されずヘルプを見てもわかりません。 お気づきの点があれば教えてください。

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

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

  • Excel → Access データをインポート

    OS WinXP Pro SP2 Office 2000 SP3 はじめまして。 マクロ(Excel VBA)を記述しているExcelファイル(Xls_Macro.xls)とインポート用データのExcelファイル(Xls_Data.xls)は別々のファイルになっていて、マクロを実行するとExcelファイルとインポート用データのExcelファイルのデータをAccessファイル(Access.mdb)にインポートする仕組みを開発しています。 インポート用データのExcelファイル(Xls_Data.xls)をADOで接続しレコードセットでデータを取得し、Accessファイル(Access.mdb)もADOで接続しレコードセットの「.AddNew」でAccessファイル(Access.mdb)に更新しようと考えています。 この考え方で問題ないのでしょうか!? もっと簡単な方法があるという方や、何か良い方法をお持ちの方 いらっしゃいましたら、よろしくお願いいたします。