いつもお世話になります。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「パス名が無効です」の発生原因
-
gccを行ってもexeファイルが生...
-
VBから参照できないCのDLLを使...
-
access テキストボックスの値取得
-
VBA ExecuteExcel4Macro 型が一...
-
Returnに対するGoSubがありません
-
VBでファイルが開かれているか...
-
NAS上のファイルの使用中が解除...
-
ASPからACCESSのOPENどうしても...
-
OUTLOOK VBA 指定フォルダ内の...
-
VBAのChangeFileOpenDirectory...
-
PowerShellを使って関連付けら...
-
cube PDFについて
-
アクセスのクエリでコンパイル...
-
Excelvbaのマクロのファイル名...
-
すでにファイルが開かれている...
-
EXCELのVBAでWORDが開いてある...
-
ExcelVBAで既に開いてるwordを...
-
エクセル「これ以上新しいフォ...
-
VB スクリプトで
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
VBでファイルが開かれているか...
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
VBから参照できないCのDLLを使...
-
FTPの送信結果を検知したい
-
access テキストボックスの値取得
-
PowerShellを使って関連付けら...
-
Returnに対するGoSubがありません
-
アクセスのクエリでコンパイル...
-
OUTLOOK VBA 指定フォルダ内の...
-
Adobeのプレミアプロの書き出し...
-
EXCELのVBAでWORDが開いてある...
-
NAS上のファイルの使用中が解除...
-
すでにファイルが開かれている...
-
VB6 Dir関数で52エラー発生
-
FORTRANの実行エラーについて
-
Excelvbaのマクロのファイル名...
-
Excelファイルのマクロによる排...
-
エクセルマクロでエラーの原因...
おすすめ情報