いつもお世話になります。
VBA(Excel2007)の初心者です。
目的のファイルが開いていない時は開き、
既に開いている時は何もしない。
という処理をしたいと思い以下のコードを
書きました。
Dim wb As Workbook
Dim myfilename As String
For Each wb In Workbooks
If wb.Name = "予定表.xls" Then
Exit For
Else
myfilename = "\\___\__\予定表.xls"
Workbooks.Open Filename:=myfilename
End If
Next wb
実行したら何度もファイルを開こうとしてしまいます。
どこに問題があるのでしょうか?
ちなみにこれは"予定表.xls"のセルを参照したくて
ある処理の前に実行するつもりなのですが、
別のブックのセルを参照するときはやはり
そのブックを開かなくてはならないのでしょうか?
何卒よろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんにちは。
こんなスタイルになります。
'-------------------------------------------
Sub Test1()
Dim Wb As Workbook
Dim mPath As String
Const FNAME = "予定表.xls" 'ファイ名
mPath ="\\___\__ & "\" 'ディレクトリパス--'規定の場所は、Application.DefaultFilePath & "\"
On Error GoTo Errhandler
Workbooks(FNAME).Activate
'------------------------------------------- ここから実際のプログラム
Set Wb = Workbooks(FNAME)
MsgBox Wb.Name & " " & Wb.ActiveSheet.Name
Exit Sub
Errhandler:
If Err.Number = 9 Then
Workbooks.Open mPath & FNAME
Resume Next
End If
End Sub
No.5
- 回答日時:
ループして、ワークブックが開いているのか調べる方法は、定石の基本形です。
私の書いているのは、それでは、つまらないので、ループしてロスをなくすために、こういう書き方をします。よほど、ループする方法とOn Error で開くの時間差は、開いているファイル数が多くなければ、それほど大きく違いありません。また、On Error GoTo 0 は、あくまでも、On Error Resume Next と組み合わせて用いるものです。On Error GoTo ErrHandler とは、常識的にはセットでは用いません。
なお、以下の方法はあまり良い書き方ではありませんが、スクリプト型としては、こういう書き方もあります。ただ、こういう書き方は、読みにくくなるような気がします。メインの流れを見やすくするために、On Error GoTo ErrHandler という書き方をするわけです。
'-------------------------------------------
Sub Test2()
Dim mPath As String
Const FNAME = "予定表.xls" 'ファイル名
mPath = "\\___\__ & " \ " 'ディレクトリパス"
'-------------------------------------------
On Error Resume Next
Workbooks(FNAME).Activate
If Err.Number > 0 Then
Workbooks.Open mPath & FNAME
End If
On Error GoTo 0
'-------------------------------------------
'メインの処理
MsgBox ActiveWorkbook.Name & " " & ActiveSheet.Name
End Sub
----------------------------------------
[エラー] を使用してマクロでハンドル エラーする方法
http://support.microsoft.com/kb/141571
この次のマクロでエラーが発生したときに、ErrorHandling プロシージャを使ってだった方法の例:
御礼が遅くなり申し訳ありませんでした。
難しくて中々内容が理解できませんで・・・。
1つの事を実現するにも色んな方法があるんですね。
とても勉強になりました。
この度はありがとうございました。
No.4
- 回答日時:
エラートラップを書いているのは私のみですから、#3さんは、私宛に書いているようです。
一応、返事はしておきます。これは、基本的なことだと思います。>On Error GoToにて例外をトラップするのは止めましょう。
基本的には、On Error GoTo 0 を使用するのは、On Error Resume Next に対するものです。しかし、エラーがなければ、そのまま順調に進むわけですから、On Error Goto ErrHandler で、一旦トラップを設けた以上は、それを外すということはありえません。
ここでは、もちろん、元のファイルがあるという前提になっています。
目的のファイルを実行しようとして、その目的のファイルがないから、エラーが発生したら、ファイルを開いて、元のコードに戻るというのが定石です。
ErrHandler のラベル移行に。もし、エラー値が残っている場合には、Err.Clear するべきかもしれませんが、On Error Goto 0 で、トラップを外すという意味がありません。もし、そうしたいなら、最初から、On Error Resume Next ~ On Error GoTo 0 とすべきです。
私の書いたコードの構造です。
'-------------------------------------------
On Error GoTo ErrHandler
'目的のワークブックをActivate させて、エラーが発生するか試験させる
'-------------------------------------------
'実行プログラム 'エラーを修正したあとに、ここに飛ぶ
'エラーがなければ、そのまま、以下に進んでいきます。
Exit Sub '←ここで、実行ブログラムは終わりです。
ErrHandler:
If Err.Number = 9 Then (9 ="インデックスが有効範囲にありません")
'エラーが発生したら、目的のファイルを開き
Resume Next 'エラーの発生した次の行に飛ぶ
End If
'-------------------------------------------
もし、ファイルがないことを懸念するなら、このようにしますが、普通は必要ないと思います。もちろん、Dir を使わなければ、実行時エラーが発生して止まってしまいます。
'-------------------------------------------
Errhandler:
If Err.Number = 9 Then
If Dir(mPath & FNAME) <> "" Then
Workbooks.Open mPath & FNAME
Resume Next
End If
End If
'-------------------------------------------
だから、 If Err.Number = 9 Then (9=インデックスが有効範囲にありません) と、インデックス処理に対してのみに照準を合わせて、再び、別のエラーが発生した場合は、マクロ全体をエラーを排出せずに終わらせます。
No.3
- 回答日時:
例外を起こさずに処理できるものに対して
On Error GoToにて例外をトラップするのは止めましょう。
例:
On Error GoTo ERROR_HANDLER
’ファイルオープン処理
ERROR_HANDLER:
’違うファイルオープン
On Error GoTo 0
No.1
- 回答日時:
こんな感じで
Sub test()
Dim i As Integer
For i = 1 To Workbooks.Count
If (Workbooks(i).Name = "開きたいブック.xls") Then
Exit For
End If
Next
If (i > Workbooks.Count) Then Workbooks.Open Filename:="開きたいブック.xls"
End Sub
お礼が遅くなり申し訳ありません。
うまくいきました!
For each構文ではダメなのでしょうか。。。
この度はありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
batファイルでレジストリキーの...
-
アクセスのクエリでコンパイル...
-
「アクティブ ユーザーが多すぎ...
-
PowerShellを使って関連付けら...
-
NAS上のファイルの使用中が解除...
-
EXCELのVBAでWORDが開いてある...
-
「パス名が無効です」の発生原因
-
Vba ファイル書き込み時に書き...
-
自身のファイルのコピーを作成...
-
VB6 Dir関数で52エラー発生
-
アクセスでイベントのロジック...
-
RAR圧縮ファイル(分割)の順番が...
-
EXCEL マクロについて教えてく...
-
access テキストボックスの値取得
-
CSVファイルが開かれているかど...
-
FTPの送信結果を検知したい
-
DisplayAlertsブロパティで ”実...
-
VBから参照できないCのDLLを使...
-
Excel VBA でFunctionが呼び出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
アクセスのクエリでコンパイル...
-
Returnに対するGoSubがありません
-
NAS上のファイルの使用中が解除...
-
VBから参照できないCのDLLを使...
-
PowerShellを使って関連付けら...
-
access テキストボックスの値取得
-
ACCESS VBAでのインポート
-
FTPの送信結果を検知したい
-
VBでファイルが開かれているか...
-
VB6 Dir関数で52エラー発生
-
【COBOL】read文でエラー
-
エクセル VBA dll 読み込...
-
VBA ExecuteExcel4Macro 型が一...
-
fgets関数のEOFの扱い方について
-
「複数の選択範囲に対して実行...
-
アクセスでイベントのロジック...
-
エクセルマクロでエラーの原因...
-
すでにファイルが開かれている...
おすすめ情報