質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

3回答

2828閲覧

端末でWorkbooks.Open実行時にErr.numberの結果が異なる原因を知りたい

dispatch_worker

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/01/23 14:58

編集2020/01/24 10:32

前提・実現したいこと

異なる端末でVBAのWorkbooks.Open(フルパスファイル名, 0)の実行結果が異なり、
一方は、Err.Numberが0になるが、もう一方の端末は、Err.Numberが9になります。
Err.Numberが9になる端末についてもErr.Numberが0で返ってくるようにしたい。

発生している問題・エラーメッセージ

Workbooks.Open(フルパスファイル名, 0)を実行するとErr.Numberが9になる端末がある。
同じファイルにも関わらず、もう一方の端末は、Err.Numberに0が返ってくる。

投稿後、追記
Set wb = Workbooks.Open(Me.Range("B6"), 0)のコードが実行されると
Err.Numberが9(インデックスが有効範囲にありません。)になるが、
ErrLabl:に飛ばず、Set ws = wb.Worksheets("sheet1")以降のコードが実行され、
If Err.Number <> 0 Thenの判定で、Err.Numberが9のため、
"データ取込対象のシートが存在しません。"のメッセージが表示される。

該当のソースコード

VBA

1 2On Error GoTo ErrLabl 3 4Dim wb As Workbook 5Dim ws As Worksheet 6 7errMsg = "" 8 9'B6セルにファイルのフルパスが入力されている。 10Set wb = Workbooks.Open(Me.Range("B6"), 0) 11Set ws = wb.Worksheets("sheet1") 12 13Call ws.Range("H8:J16").Copy 14 15Call ThisWorkbook.Worksheets("test").Cells(2, 3).PasteSpecial(xlPasteValues) 16 17Application.CutCopyMode = False 18 19ErrLabl: 20 21If Err.Number <> 0 Then 22 errMsg = "データ取込対象のシートが存在しません。" 23End If 24 25If Not wb Is Nothing Then 26 Call wb.Close(False) 27 Set wb = Nothnig 28 Set ws = Nothing 29End If 30 31 32

試したこと

どちらの端末も参照設定が同じことを確認。
どちらの端末も登録されている拡張子は表示しないにチェックが入っていることを確認。
Workbooks.Open(フルパスファイル名, UpdateLinks:=False )にしたが結果が変わらないことを確認
Workbooks.Openのコードのステップ実行直前は、Err.Numberが0で、
コードをステップ実行するとErr.Numberが9にはなるがファイルは開かれて、ErrLabl:に飛ばないことを確認。
投稿後、追記
エクセルのオプションが同じことを確認。

補足情報(FW/ツールのバージョンなど)

どちらの端末も以下のとおり。
OS:Windows7
Excel2007
投稿後、追記
開くファイルの拡張子は、xlsxで、VBAコードがないものです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/01/24 01:14

9ということで、開くファイルに含まれるVBAがらみかも知れませんが、そのあたりはどうでしょうか?
ttyp03

2020/01/24 02:08

コードはこれがすべてではないですよね? Open()ではエラーになりますので。 掲載を省いたところに原因があるかもしれないので、関連しているコードは全て正しく載せるようにしてください。 もちろん見せられないコードは隠して結構です。
dispatch_worker

2020/01/24 10:37

開くファイルは、xlsxファイルで、VBAコードは、ございません。 関連しているコードを全て載せました。
radames1000

2020/01/27 00:07

特定のxlsxファイルだけエラーが出るのでしょうか。 他のxlsxファイルでは問題ありませんか?
dispatch_worker

2020/01/27 13:02

申し訳ございません、問題の端末を頻繁に確認できる状態でなく、 他のxlsxではどうか確認できていません。 私の端末ではおきない(Err.numberが9にならない)ので、 開くファイルに問題はなく、 端末に依存する設定かなにかだと考えていますが、 調べても分からず困っております。
guest

回答3

0

なんか、流れがおかしい気がします。

んと、エラーになったら変数に代入できないので、
その時点で存在確認は出来ているので、
エラーナンバーを確認しなくてもいいのでは?

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim wb As Workbook 5 Dim ws As Worksheet 6 Dim sProm As String 7 8 sProm = "正常に処理しました。" 9 10 On Error Resume Next 11 Set wb = Workbooks.Open(Me.Range("B6").Value, 0) 12 Set ws = wb.Worksheets("Sheet1") 13 On Error GoTo 0 14 15 If ws Is Nothing Then 16 sProm = "指定のワークシートが存在しません。" 17 Else 18 ws.Range("H8:J16").Copy 19 ThisWorkbook.Worksheets("test").Cells(2, 3).PasteSpecial (xlPasteValues) 20 Application.CutCopyMode = False 21 End If 22 23 If wb Is Nothing Then 24 sProm = "指定のワークブックが存在しません。" 25 Else 26 wb.Close False 27 End If 28 29 MsgBox sProm 30End Sub

ファイルやシートの存在確認は「とりあえず変数に代入してみる」で、
一応出来ますが、少し乱暴なので
もっとちゃんと自作関数を作って丁寧にするという考えもあります。
この辺のサンプルはネット上に落ちていると思います。

そもそも、文頭で

On Error GoTo ErrLabl

などとやって、エラーを処理しようとするから、
デバッグが難しくなるのであって、
開く前にファイルが存在するかくらいは確認すれば、
エラーは回避できますよね?

on errar ステートメントは出来るだけ使わないように
まずは考えましょう。
使うにしても限定的な使い方に絞った方がよいかと思います。

投稿2020/01/24 23:11

編集2020/01/24 23:30
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dispatch_worker

2020/01/26 10:07

ご回答ありがとうございます。 ご提示頂いたエラーナンバーを確認しないコードに 書きなおせば、エラー回避できます。 最終的には、エラーナンバーを見ないコードに書き換えようと思っていましたが、 同じプログラムなのに、なぜ、Err.Numberが異なる端末において、 結果が違ってしまうのかわからず、質問した次第です。
mattuwan

2020/01/26 22:51

なぜかは、こちらで動作確認が出来ない状態では、 代わりに調べることができないので、こちらではわかりません。 言えることは、端末により環境が違うからでしょう。 提示のコードではどの行でエラーが発生したかわからないので、 ファイルがないのかシートが無いのかその他の何のインデックスがないのか の区別の判断材料がないのでわかりません。 ウォッチ式でエラーナンバーを監視してみれば、 どこでエラーが出ているかわかるかも知れませんね。 挙動が違うということは、何かの環境が違うという事でしょう。
guest

0

Err.Numberが9になる端末

Err.Number 9は「インデックスが有効範囲にありません」ですね

よくあるのが以下ですね。
[ファイル]-[オプション]-[基本設定]-[新しいブックの作成時]-[ブックのシート数]
(※ Application.SheetsInNewWorkbook)
1になっている端末で、3を前提にした作りのマクロ(workbook.addしてworksheet(2)とかしている)をWorkbook_Open()で実行しているとかですかね。

イメージ説明

投稿2020/01/24 02:34

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dispatch_worker

2020/01/24 10:04

ご回答ありがとうございます。 確認しましたが、同じ設定になっていました。
Y.H.

2020/01/24 10:08

あらら:-( openしようとしているファイルは、直接excelで開いて問題ないんですよね?
dispatch_worker

2020/01/24 10:34

openしようとしているファイルを、 直接excelで開いて問題ございません。
guest

0

エラーが発生後の行き先を下記にしたらどうでしょうか?

VBA

1ErrLabl: 2 If Err.Number <> 0 Then 3 MsgBox Err.Number & vbCr & Err.Description 4 End If

投稿2020/01/24 01:37

yuuskeccho

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問