• ベストアンサー

VBAでファイルを開いてないときに開くコード

いつもお世話になります。 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"のセルを参照したくて ある処理の前に実行するつもりなのですが、 別のブックのセルを参照するときはやはり そのブックを開かなくてはならないのでしょうか? 何卒よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 プロシージャを使ってだった方法の例:

kkke
質問者

お礼

御礼が遅くなり申し訳ありませんでした。 難しくて中々内容が理解できませんで・・・。 1つの事を実現するにも色んな方法があるんですね。 とても勉強になりました。 この度はありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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=インデックスが有効範囲にありません) と、インデックス処理に対してのみに照準を合わせて、再び、別のエラーが発生した場合は、マクロ全体をエラーを排出せずに終わらせます。

  • hornest
  • ベストアンサー率16% (2/12)
回答No.3

例外を起こさずに処理できるものに対して On Error GoToにて例外をトラップするのは止めましょう。 例: On Error GoTo ERROR_HANDLER ’ファイルオープン処理 ERROR_HANDLER: ’違うファイルオープン On Error GoTo 0

  • hornest
  • ベストアンサー率16% (2/12)
回答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

kkke
質問者

お礼

お礼が遅くなり申し訳ありません。 うまくいきました! For each構文ではダメなのでしょうか。。。 この度はありがとうございました。