• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBA 実行時エラー'9'の回避方法について)

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

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

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

  • ベストアンサー
  • 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