• ベストアンサー

エクセルファイルが開けない

こんにちわ。 今回、困難にぶち当たったのでご質問させて頂きます。 VB(正確にはACCESSのVBAですが)から、複数のエクセルファイルを順番に開き、中のセルをクリアする処理をしています。 ソースを下記に記載させて頂きます。 Private Sub Excel_Delete(sXlsFile As String) Dim sXls As Workbook Set sXls = excel.Workbooks.Open(sXlsFile, 0) sXls.Sheets(1).Range("I7:AM3005").ClearContents sXls.Saved = True sXls.Save sXls.Close Set sxlx = Nothing End Sub 今まで問題なく動作していたのですが、ある日、 Set sXls = excel.Workbooks.Open(sXlsFile, 0) の部分でエラーが出ました。 ↓エラー内容は下記の通りです。 実行時エラー-2147417851(80010105) openメソッドは失敗しました ’Workbooks’オブジェクト 開くエクセルファイルは、フォルダから列挙して取得していますので、 ちゃんと存在しています。 しかも、エラーが起きるファイルは同じファイルではなく、エラーが起きない時もあります。 列挙するエクセルファイルは、日に日に増えていっていて、現在では500個 近くになっています。 数が増えてきたのが原因でしょうか? それとも、何か根本的な間違いがあるのでしょうか。 何かわかる方がいらっしゃいましたら、よろしくお願いします。

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

  • ベストアンサー
回答No.1

Excel のブックを開く前に、Excel のアプリケーションを起動させなきゃダメです。 Dim xlApp As Excel.Application ' Excel を起動 xlApp = New Excel.Application ' Excel を表示(表示させない場合はいらない行です) xlApp.Visible = True Dim xlBook As Excel.Workbook Set xlBook = xlApp.Workbooks.Open(パス) 最後に・・・ xlApp.Quit です。 だから質問文にあるようなプロシージャでプロシージャ内で Excel アプリケーションを開いたり閉じたりする処理を書いちゃうと、1つのブックを処理するたびに Excel を起動して終了してってなっちゃいますから、その上位で Excel アプリケーションを管理したほうが忙しくないです。

takeru427
質問者

お礼

ご解答ありがとうございます。 大変申し訳ございません。解決しました。 実はとんでもない初歩的ミスでした。 Set sxlx = Nothing の部分で、「sxls」が、「sxlx」になっていて、これを直したところ、 エラーが出なくなりました。 お騒がせしまして、本当に申し訳ありません。 temtecomai2さんのご意見も大変参考になりました。 有難うございました。

その他の回答 (1)

回答No.2

・そのエラーの出る端末に、複数のOfficeのインストールした経緯がある ・その端末でよくマクロを開発している などの場合、レジストリが汚れて、オートメーションエラーを起こす端末になることがマレにあります。 >Dim sXls As Workbook というのを見ると、Excelを参照設定して利用していますよね? 開発がし辛いですが、参照設定を外し、エクセル関係のオブジェクト変数をすべて[AS OBJECT]として宣言し、レイト(遅延)バインディングを利用すると、解消される場合があります。

takeru427
質問者

お礼

ご解答ありがとうございます。 なるほど。参考になります。 ですが、実はとんでもない初歩的ミスでした。 Set sxlx = Nothing の部分で、「sxls」が、「sxlx」になっていて、これを直したところ、 エラーが出なくなりました。 お騒がせしまして、本当に申し訳ありません。 有難うございました。

関連するQ&A

  • excelファイルが意図せず起動

    下記を参考にして、起動時にタイマーを設定してexcelファイルを5分後に自動的に 保存・終了するようにしています。 http://okwave.jp/qa/q2911086.html しかし実際5分を待たず、手動でそのexcelファイルを終了した場合、 後でそのexcelファイルが自動で起動して、そのまま終了しているようです。 この症状をなくしたい場合どのように、記述を加えればよいか教えていただけないでしょうか? 記述は下記です。 '標準プロシージャ Public Operated As Boolean Sub SetTimer() Application.OnTime Now + TimeValue("00:05:00"), "CloseMe" End Sub Sub CloseMe() If Operated Then Operated = False SetTimer Exit Sub End If 'ブックの上書き保存 ActiveWorkbook.Save ' 保存確認を避けるため、保存済みにする ThisWorkbook.Saved = True ' 他にブックが開いていなければ、Excelを終了する If Workbooks.Count <= 1 Then Application.Quit ' 本ブックをClose ThisWorkbook.Close False End Sub 'ワークブックプロシージャ Private Sub Workbook_Open() Operated = False SetTimer End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean) Operated = True End Sub Private Sub Workbook_Deactivate() Operated = True End Sub Private Sub Workbook_Activate() Operated = True End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) Operated = True End Sub

  • エクセルファイルが既に開いてるのなら開かない

    エクセルファイルが既に開いてるのなら開かない としたいです Sub test() Dim app As Excel.Application Dim book As Excel.Workbook app = CreateObject("Excel.Application") If app.ReadOnly Then MsgBox("既に開いています") End If End Sub このようにやろうと思ったけど、 これじゃファイル名をしてしてないから無意味ですよね しかも上記のコードを実行したら --------------------------------------------------------- 型 'System.MissingMemberException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました 追加情報: 公開メンバー 'ReadOnly' は型 'ApplicationClass' に見つかりませんでした。 --------------------------------------------------------- というエラーが発生しました。 Sub test() Dim app As Excel.Application Dim book As Excel.Workbook app = CreateObject("Excel.Application") app.Visible = True book = app.Workbooks.Open("C:\Users\test.xlsm") End Sub このようにして、エクセルファイルを開くコードは分かるのですが、 このコードに、「既に開いているのなら開かない」という処理を付け加えたいです。 よろしくお願いします。

  • VBAでファイルを閉じる時に、他のエクセルファイルを閉じるには?

    VBAで、 Private Sub Workbook_Open() Workbooks.Open FileName:="バス時刻表.xls",ReadOnly:=True End Sub で、バス時刻表.xlsを自動的にオープンした後、 閉じる時に、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("バス時刻表.xls").Close End Sub で記述したら、エラーとなります。 どのようにすればいいのでしょうか? よろしくお願いします。

  • 環境はVB2008です。開いているエクセルファイルの認識!

    環境はVB2008です。開いているエクセルファイルの認識! すいません。詳しいかた宜しくお願い致します。 【現象】 ファイルが既に開いている場合、読み取り専用で開いてしまうと保存できないため、 開いているファイルの検索をかけようと試みたが、 新しいエクセルを起動した中のWorkBook内を検索してしまうのか 開いているワークブックを検知してくれない。 Dim xlApp As New Excel.Application Dim xlwb As Excel.Workbook Dim xlws As Excel.Worksheet Dim URL3 As String URL3 = "C:\MailDB.xls" Dim allwb As Excel.workbook For Each allwb In xlApp.Workbooks If allwb.Path = URL3 Then MsgBox(URL3 & "のファイルを閉じてください。", MsgBoxStyle.Exclamation, "警告") Exit Sub End If Next xlwb = xlApp.workbooks.open(URL3) xlws = xlwb.worksheets(1) With xlws .Cells(1, 3) = "テスト" End With xlwb.Save() xlwb.close() xlApp.quit()

  • ファイルを毎回指定してCSV取り込む方法

    マクロの質問お願いします。 このような形でデスクロップ上の決まったcsvファイルを自動的に 取り込む形になっています。 これを常に決まったファイルではなく、毎回ファイルを自分で選ぶような 形にしたいと思っています。 どのように変更すればできるでしょうか? sub macro1()  dim w as workbook  with thisworkbook.worksheets("Load")  .cells.clearcontents  set w = workbooks.open(filename:="あなたのデスクトップのパス\000.csv")  

  • ExcelのVBAでWEBページを開くのが遅い

    よろしくお願いいたします。 現在社内システムのデータをExcelに落とすVBAを作っています。 単純に、 sub test () URL = "http://..." Dim xls As Workbook Set xls = Application.Workbooks.Open(URL) end sub のようなものを作成して実行したのですが、 Set xls = Application.Workbooks.Open(URL) の所で50~60秒ほど時間がかかってしまいます。 もう少し早くする方法はないのでしょうか?

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • 「エクセルファイルが開いていたら開かない」としたい

    「エクセルファイルが開いていたら開かない」としたいです。 VB2010です。 -------------------------------------------------------------- Imports Microsoft.Office.Interop '参照設定済み Module Module1 Sub ExcelOpen() Dim ExcApp As Excel.Application Dim book As Excel.Workbook Dim MyPath As String MyPath = "C:" ExcApp = CreateObject("Excel.Application") ExcApp.Visible = True book = ExcApp.Workbooks.Open(MyPath & "\test.xlsm") End Sub End Module -------------------------------------------------------------- で、ファイルを開くのですが、既にファイルが開いている場合は、2個開いてしまい、 最後に開いたファイルが読み取り専用になってしまいます。 IFで、開いているかどうかを取得して、 開いているのなら「既に開いています」として、ExitSubがしたいです。 ご協力よろしくお願いします。

  • エクセル 保存是非のダイアログを出さずに保存VBA

    エクセル 保存是非のダイアログを出さずに保存VBA エクセルファイルの ひとつのブック L.xlsxの特定のセルを 別のブックR.xlsxのセルにコピーするを VBAコードで コピーまでは出来たのですが R.xlsxのブックを保存するかどうかの ダイアログが出てしまいます これが出ないで保存できるように ActiveWorkBook.Save これを入れてもやはり保存是非の確認が 出てしまいます コードは -------------------- Sub ID移動() Dim x As Workbook Dim y As Workbook Workbooks.Open Filename:="C:\Users\USER\Desktop\ACCESS\L.xlsx" Set x = Workbooks("L.xlsx") Workbooks.Open Filename:="C:\Users\USER\Desktop\ACCESS\R.xlsx" Set y = Workbooks("R.xlsx") y.Sheets("sheet1").Range("A2") = x.Sheets("output").Range("B2") x.Close y.Close ActiveWorkBook.Save End Sub ------------------ 保存是非のダイアログがでないで 保存できるための方法を 御教示いただけますか win10 office365 すみませんが 宜しくお願い致します

  • 既に開いているエクセルを閉じるには?

    既に該当のファイルが開いているのなら閉じたいのですが xlBook.Quitだとエラーになります。 Sub test1() Dim xlApp As Excel.Application Dim xlBook As Workbook Dim FileName As String FileName = "C:\test.xlsm" Set xlApp = GetObject("", "Excel.Application") 'GetObjectで合ってるか不安 Set xlBook = xlApp.Workbooks.Open(FileName) If xlBook.ReadOnly = True Then 'ファイルが開いてるのなら MsgBox "既にファイルが開いているので閉じます。" xlBook.Quit 'エラー 438 End If xlApp.Quit 'これって何のために必要? Set xlBook = Nothing 'ココを通り過ぎるのにすごく時間がかかる。 Set xlApp = Nothing End Sub と言うコードを作りました。 xlBook.Quitがダメならどのコードを使えばいいでしょう? また、 GetObject("", "Excel.Application") と言う開き方でいいのでしょうか? あと、 xlApp.Quit は何のために必要なのでしょう? タスクマネージーのプロセスを見ると、 Set xlApp = GetObject("", "Excel.Application") を通る時に新しいEXCEL.EXEが作成され、 Set xlApp = Nothing を通り過ぎる時に、そのEXCEL.EXEが消えます。 だから xlApp.Quit は不要ですか?