エクセルVBA 実行時エラー'9'の回避方法について

このQ&Aのポイント
  • エクセルVBAを使用して特定のファイルからデータを検索し、負の値に変換して別のファイルにコピーする処理を行う際に実行時エラー'9'が発生する問題についての質問です。
  • エラーが発生する条件として、VBAを含むエクセルファイルとデータファイルがドライブ(S)に保存されており、ドライブSに他のPCからアクセスするネットワークがある場合です。
  • エラーの原因は特定されていませんが、インデックス処理に関係しない箇所でエラーが発生し、同じPC内で実行すると正常に動作することが分かっています。質問者はエラーを回避する方法を知りたいとしています。
回答を見る
  • ベストアンサー

エクセルVBA 実行時エラー'9'の回避方法について

エクセルVBA 実行時エラー'9'の回避方法について たいへん困っています。 あるファイルからキーワードを指定してデータを検索し数値項目に-1を掛けてすべて負数にしてから別のファイルにコピー、そのファイルを保存するという処理です。 VBAを作成し実行したところ正常に動作します。しかし、下記の条件下では実行時エラー'9'(インデックスが有効範囲にありません)が発生してしまいます。 (1)VBAを含むエクセルファイル及びデータファイルの保存先をドライブ(S)に置く。 (2)ドライブSは他のPCからアクセスできる同一ネットワークとして定義されている。 (3)ネットワーク下にある他のPCからSドライブにアクセスしVBAを含むエクセルファイルを開いてこの処理を実行する。 分からないのは、インデックス処理に関係しない箇所でエラーが発生していること、同じPC内で実行すると正常動作するのに、上記の条件下ではエラーが発生することです。 作成したVBAは下記のとおりで、Set コピー元 = Workbooks("前回_情報").Worksheets("Sheet1")の箇所でエラーが発生します。エラーを回避する方法を教えてください。 Sub Macro7() Dim i, j Dim コピー元 As Worksheet Dim コピー先 As Worksheet Dim 検索値 As String Application.ScreenUpdating = False Workbooks.Open "S:¥情報出力データ¥前回_情報.xls" Workbooks.Open "S:¥情報出力データ¥前回_情報コピー.xls" Worksheets("計算結果").Cells.Clear '結果が格納されるシートを事前にクリア 検索値 = "unit" Set コピー元 = Workbooks("前回_情報").Worksheets("Sheet1") ← ここでエラー'9'が出る Set コピー先 = Workbooks("前回_情報コピー").Worksheets("計算結果") For i = 1 To コピー元.Cells(Rows.Count, 1).End(xlUp).Row If コピー元.Cells(i, 1).Value = 検索値 Then For j = 22 To 59 コピー元.Cells(i, j).Value = コピー元.Cells(i, j).Value * -1 Next j コピー元.Rows(i).Copy コピー先.Cells(Rows.Count, 1).End(xlUp).Offset(1) End If Next i Set コピー元 = Nothing Set コピー先 = Nothing Workbooks("前回_情報.xls").Close SaveChanges:=False Workbooks("前回_情報コピー.xls").Close SaveChanges:=True End Sub

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

>同じPC内で実行すると正常動作するのに、上 これはフォルダーオプションの 「登録されている拡張子は表示しない」のチェックが外れてるとエラーが出ると思いますが、、、 何れにしろ、提示のコードでは >Set コピー元 = Workbooks("前回_情報").Worksheets("Sheet1") >Set コピー先 = Workbooks("前回_情報コピー").Worksheets("計算結果") この2行には拡張子が省略されていますので、拡張子を入れてみたらどうでしょうか。 Set コピー元 = Workbooks("前回_情報.xls").Worksheets("Sheet1") Set コピー先 = Workbooks("前回_情報コピー.xls").Worksheets("計算結果") 以上です。

saitama_HI
質問者

お礼

myRange様、ありがとうございます。いま、ネットワーク環境下にいないためテストできませんが、あとで確認したいと思います。迂闊でしたがご指摘の通りと思います。このような条件の場合にはエクセルファイルであることを明示しないとだめなのでしょうか。このことと実行時エラー'9'が関係する理屈が分かりませんが。

その他の回答 (2)

回答No.3

おそらく #1 さんの回答で合っていると思います。 んで書き方を下のようにするとか。 Dim コピー元Book As Workbook, コピー元Sheet As Worksheet Dim コピー先Book As Workbook, コピー先Sheet As Worksheet Set コピー元Book = Workbooks.Open("S:¥情報出力データ¥前回_情報.xls") Set コピー元Sheet = コピー元Book.Worksheets("Sheet1") Set コピー先Book = Workbooks.Open("S:¥情報出力データ¥前回_情報コピー.xls") Set コピー先Sheet = コピー先Book.Worksheets("計算結果") Worksheet を変数で扱う知識を持っているのなら Workbook も変数で扱うべきでしょう。 Workbooks.Open() メソッドは開いたブックを Workbook オブジェクトとして返してくれるので Workbook 型の変数で参照してしまいましょう。

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

私なりの書き方に修正してみました。ダイレクトにシートに入れるよりも、それぞれブックを変数に置き換えてみれば、初歩的なミスは少なくなると思います。Bk1, Bk2 とか使いますが、そうでなければ、以下のようにします。しかし、最後に、 Workbooks("前回_情報.xls").Close SaveChanges:=False Workbooks("前回_情報コピー.xls").Close SaveChanges:=True としているなら、変数に置き換えたほうが楽ではないでしょうか。 こういう凝った書き方は良いとは思いませんが、あえて近づけてみました。 Dim i As Long, j As Long Dim コピー元 As Worksheet Dim コピー先 As Worksheet Dim 検索値 As String With Workbooks.Open("S:\情報出力データ\前回_情報.xls")  Set コピー元 = .Worksheets("Sheet1") End With With Workbooks.Open("S:\情報出力データ\前回_情報コピー.xls")   Set コピー先 = .Worksheets("計算結果") End With Application.ScreenUpdating = False '←下に持ってきた Worksheets("計算結果").UsedRange.Clear なお、正しく動くかどうかのチェックはされていません。

saitama_HI
質問者

お礼

Wendy02様、ていねいな回答ありがとうございます。単純な間違いをなくすには変数に置き換えたほうがクレバーなやり方ですね。了解しました。今後とも機会があればよろしくご指導お願いします。

関連するQ&A

  • エクセルVBA 実行時エラー‘13’型が一致しまん

    VBAは初級レベルです。説明が分かりづらかったらすみません。 Windows7/Excel2002を使っています。 エクセルVBAで、変数MMMと変数DDに処理する日付を入れたいのですが、 実行時エラーになってしまい、うまく変数が設定できません。 例えば、31MAR.xls というエクセルファイルがあります。 (ファイルは、デイリーベースで存在します。) このファイル名の月と日にちを変数に入れます。 DD = 日にち (例えば、31日なら“31”) MMM = アルファベット3文字 (3月なら“MAR”) そして、入力する為のワークシートを Set NYURYOKU = Workbooks(DD & MMM & ".xls").Worksheets("入力") としたのですが、 『実行時エラー‘9’インデックスが有効範囲にありません。』 となってしまいます。 このとき、 DDの値は、0: MMMの値は、00: になっています。 --------------------------- Dim HIDUKE As Date  HIDUKE = Left(ThisWorkbook.Name, 5) MMM = Mid(HIDUKE, 3, 3) DD = Left(HIDUKE, 2) Set NYURYOKU = Workbooks(DD & MMM & ".xls").Worksheets("入力") --------------------------- 変数宣言で、Dim HIDUKE As Date にすると、 HIDUKE = Left(ThisWorkbook.Name, 5) の所で『実行時エラー‘13’型が一致しません。』 となってしまい、 試しに Dim HIDUKE As String にすると、 MMM = Mid(HIDUKE, 3, 3) の所で『実行時エラー‘13’型が一致しません。』 となってしまいます。 変数宣言をしないと、 Set NYURYOKU = Workbooks(DD & MMM & ".xls").Worksheets("入力")の所で 『実行時エラー‘9’インデックスが有効範囲にありません。』 となってしまいます。 どなたか回避策を教えてください。 どうぞよろしくお願いします。

  • エクセルVBA 実行時エラー‘13’型が一致しまん

    VBAは初級レベルです。説明が分かりづらかったらすみません。 Windows7/Excel2002を使っています。 エクセルVBAで、変数MMMと変数DDに処理する日付を入れたいのですが、 実行時エラーになってしまい、うまく変数が設定できません。 例えば、31MAR.xls というエクセルファイルがあります。 (ファイルは、デイリーベースで存在します。) このファイル名の月と日にちを変数に入れます。 DD = 日にち (例えば、31日なら“31”) MMM = アルファベット3文字 (3月なら“MAR”) そして、入力する為のワークシートを Set NYURYOKU = Workbooks(DD & MMM & ".xls").Worksheets("入力") としたのですが、 『実行時エラー‘9’インデックスが有効範囲にありません。』 となってしまいます。 このとき、 DDの値は、0: MMMの値は、00: になっています。 --------------------------- Dim HIDUKE As Date  HIDUKE = Left(ThisWorkbook.Name, 5) MMM = Mid(HIDUKE, 3, 3) DD = Left(HIDUKE, 2) Set NYURYOKU = Workbooks(DD & MMM & ".xls").Worksheets("入力") --------------------------- 変数宣言で、Dim HIDUKE As Date にすると、 HIDUKE = Left(ThisWorkbook.Name, 5) の所で『実行時エラー‘13’型が一致しません。』 となってしまい、 試しに Dim HIDUKE As String にすると、 MMM = Mid(HIDUKE, 3, 3) の所で『実行時エラー‘13’型が一致しません。』 となってしまいます。 変数宣言をしないと、 Set NYURYOKU = Workbooks(DD & MMM & ".xls").Worksheets("入力")の所で 『実行時エラー‘9’インデックスが有効範囲にありません。』 となってしまいます。 どなたか回避策を教えてください。 どうぞよろしくお願いします。

  • エクセルVBAで実行時エラー 91 が出ます

    エクセル2000です 各部署の棚卸を纏める為のVBAを作成しているのですが、実行時にエラーになってしまいます エラーメッセージは 「実行時エラー 91   オブジェクト変数またはWithブロック変数が設定されていません」 です ご教授お願いいたします Sub 棚卸() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("在庫集計票") Set sh2 = Worksheets("棚卸表") x = sh2.Range("A65536").End(xlUp).Row Z = sh1.Range("d2").Value ’部署番号 sh1.Range(Cells(5, Z), Cells(3000, Z)).ClearContents For i = 2 To x y = sh1.Range("A2:A" & Range("A2").End(xlDown).Row). _ Find(sh2.Cells(i, "a")).Row ’ここでエラーが発生します sh1.Cells(y, Z) = sh2.Cells(i, "c") Next i End Sub

  • VBA マクロ実行時エラー 1004

    すみません (1)Workbooks(p_addr_Name).Worksheets(sheet_check).Range(Cells(7, 2), Cells(19, 2)).Copy (2)Workbooks(p_SH_weekly).Worksheets("Sheet1").Range(Cells(7, i), Cells(19, i)).PasteSpecial Paste:=xlPasteAll その際(2)で「実行時エラー'1004'」が出ました、教えてください。 *上記引数は全部入りました 宜しくお願いします

  • Excel ファイルに保存すると実行時エラーになる

    こんにちは。宮本と申します。VB6(SP5)で、 プログラミングをしております。 下記の様にプログラミングをしましたが、どうしても [実行時エラー’1004’ test_1.xlsにアクセスできません]と、なります。 c:\test.xls は、元々ある事を前提とし、c:\test_1.xlsに上書きをしたいのです。 宜しくお願い致します。 Dim wApp As Excel.Application Dim wExl As Object Set wApp = CreateObject("Excel.Application") Set wApp = CreateObject("Excel.Application") Set wExl = wApp.Workbooks.Open("c:\test.xls") wExl.Worksheets(1).Cells(1, 1).Value = 3000 wExl.Application.Visible = False wExl.Application.DisplayAlerts = False wExl.SaveAs "c:\test_1.xls" <---ここで、エラー

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!

  • Excel VBAを使って、Excelデータを別のExcelファイルに取り込みします

    報告書にexcel VBAを使って、(報告書を開いたまま)報告書のデータを別のexcelファイル(一覧)に取り込みします。 Sub k() Dim ブック As Workbook Set ブック = Workbooks.Open("c:\テスト\" & "一覧.xls") ブック.Worksheets("Sheet1").Cells(3, 2) = Worksheets("企業情報シート").Cells(3, 3) End Sub 報告書の"Worksheets("企業情報シート").Cells(3, 3)"は書き方がおかしいみたいで、正しい書き方を教えてください。

  • 実行時エラー91について

    vbでエクセルにデータを入力したあと、2つのシートを選択し、 その後に両面印刷を行うプログラムを作成中ですが、 印刷の段階で 「実行時エラー91。オブジェクト変数または with ブロック変数が設定されていません。」 とのエラーがでます。 どの部分がおかしいのかわからないので教えて下さい。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim xlSheet2 As Excel.Worksheet Dim xlFile As String xlFile = App.Path & "表.xls" Dim MyFile As String MyFile = Dir$("表.xls") If Len(MyFile) > 1 Then Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(xlFile) Set xlSheet = xlBook.Worksheets("裏") Set xlSheet2 = xlBook.Worksheets("表") xlApp.Visible = True a1 = Label47.Caption a1 = Format(a1, "#,#") a2 = Label48.Caption m = a1 & "及び" & a2 & "とする。" For k = 1 To 18 s = Mid(m, k, 1) i = 8 + (k - 1) * 2 xlSheet.Cells(40, i).Value = s Next k Set xlSheet2 = xlBook.Worksheets("表") xlSheet2.Cells(4, 2).Value = Text11.Text xlSheet2.Cells(4, 10).Value = Text12.Text xlSheet2.Cells(4, 19).Value = Text13.Text xlBook.Sheets(Array("表", "裏")).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ←ここでエラー Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing Set xlSheet2 = Nothing

  • Excel実行時エラー[80004005]について

    ExcelのVBAにてSQLのSELECT文を実行し、取得したデータを一覧表示する仕組みを作っています。 同じプログラムを使用者する者7名の内、1名のみ以下のエラーが発生しています。 どのように対応すればよいか、ご教示ください。 環境 Excel2010 状況 SELECTの実行時 「実行時エラー[80004005] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。」 実行ソース Private Sub exeSelect(sheetNm as string ,sqlSt as String) Dim i As Integer Dim j As Integer Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bookNm As String bookNm = ThisWorkbook.FullName Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & bookNm & "; ReadOnly=False;" cn.Open←ここでエラー Set rs = New ADODB.Recordset rs.Open sqlSt, cn, adOpenStatic j = START_ROW Do Until rs.EOF For i = 0 To rs.Fields.Count - 1 Worksheets(sheetNm).Cells(j, i + 1).Value = rs(i).Value Next j = j + 1 rs.MoveNext Loop rs.Close cn.Close End Sub

  • エクセルVBA!(COPY) Win2000,offce2000

    単純な質問かもしれませんが、 WorkBooks("test")から 別のWorkBooks("Data").WorkSheets("Sheet1")のデータの数を判定して全てをコピーして、 WorkBooks("test")のWorkSheets("Sheet2")へペーストしたいのですが、うまくいきません ↓のような感じです。 Dim wstest As Worksheet Dim wsData As Worksheet Dim wsNM As String Dim Drow As Long Sub copy() 'DataSheetのSheet名がその都度違うので、取得しました。 wsNM = wsData.Sheets(1).Name Set wsData = Workbooks("Data.xls").Worksheets(wsNM) Set wsTest = Workbooks("Test.xls").WorkSheets("Sheet2") 'データの範囲判定 Drow = wsData.Range("H65536").End(xlUp).Row '/////// ここからが???です /////// wsDataのA1からBAのDrowを範囲を指定して、Copy → wsTestのA1に貼り付けたいのですが、どうしたらよいのでしょうか? コピーしたり、直接書くようにしたりといろいろなコードを書いてみましたがダメでした。 Cellsで範囲をとる方法がわかりません。Rangeなら(A1:BA300)のように取れる範囲もCellsの時はどうしたらよいのでしょうか?(そのまま書けば、Cells(1,1):Cells(Drow,53)みたいな・・・・・) と、悩んでいるより一気にコピーするのもどうかと思いFor~Nextで1行ずつ書いていったらどうかとも考えましたが、うまくいきませんでした。 End Sub ※ Drowは、6000~20000 よろしくお願いします。