Q質問
VBAでファイルを開いてないときに開くコード
- 質問日時:2009/12/02 14:46
-
- 気になる
- 0
- 件
いつもお世話になります。
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"のセルを参照したくて
ある処理の前に実行するつもりなのですが、
別のブックのセルを参照するときはやはり
そのブックを開かなくてはならないのでしょうか?
何卒よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
- ベストアンサーのみ表示
No.5
- 回答日時:2009/12/05 23:22
ループして、ワークブックが開いているのか調べる方法は、定石の基本形です。私の書いているのは、それでは、つまらないので、ループしてロスをなくすために、こういう書き方をします。よほど、ループする方法と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
- 回答日時:2009/12/03 12:37
エラートラップを書いているのは私のみですから、#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
- 回答日時:2009/12/03 09:38
例外を起こさずに処理できるものに対して
On Error GoToにて例外をトラップするのは止めましょう。
例:
On Error GoTo ERROR_HANDLER
’ファイルオープン処理
ERROR_HANDLER:
’違うファイルオープン
On Error GoTo 0
No.2ベストアンサー
- 回答日時:2009/12/02 18:37
こんにちは。
こんなスタイルになります。
'-------------------------------------------
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.1ベストアンサー
- 回答日時:2009/12/02 15:42
こんな感じで
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を見た人はこんなQ&Aも見ています
- EXCEL VBA で現在開いているブックのファイル名を取得する方法
- エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
- EXCELマクロで、開いてはいるがアクティブでないファイルをアクティブにする方法?
- 4エクセルVBAで違うブックの指定セルの値をコピーするコード
- 5EXCELファイルのカレントフォルダを取得するには?
- 6Exel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について
- 7EXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい
- 8VBAで別エクセルファイルから指定エクセルファイルにシートをコピー
- 9EXCELのVBAでRange("A1:C4")を変数にする方法を教え
- 10「エクセルファイルが開いていたら開かない」としたい
- 11ある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?
- 12エクセル:シート名を手入力でなく、セル「A1」の文字を出したい。
- 13エクセルVBAでクリップボード内容をクリア
- 14VBA オブジェクトが空かどうか判定する
- 15Sub ***( ) と Private Sub ***( ) の違い
- 16ExcelのVBAで最終行の下にコピーする方法
- 17[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。
注目の記事
どこにでも持ち運べて、インテリアにも最適なモバイルスピーカー
みなさんは、大切な人に贈るプレゼントやギフトを選ぶ際に、どういった点に気をつけているだろうか。筆者は、自分がコレだ!と思ったものを贈るタイプである。大きくハズレることもあるが、相手がもし気に入れば非常...
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
- 4【エクセルで】ゼロを入力する...
- 5エクセルのリンク解除ができな...
- 6docとdocxファイルの違いを教え...
- 7Excelで[表1]にあって、[表2...
- 8エクセルで数式をそのままコピ...
- 9エクセル2010 書式が多すぎて...
- 10【Excel】数式をそのまま他のシ...
- 11IF関数を使って3つ以上のある...
- 12office2010のライセンス認証の...
- 13A4サイズ1枚にA5サイズを2つ...
- 14積み上げ棒グラフを2本並べたい。
- 15エクセル2010 オートSUMで合計...
- 16Excelで用紙一枚に2ページ印刷
- 17エクセル2010シート欄が表...
- 18Office2013試用版期限切れ後、...
- 19Outlookの検索機能が働きません
- 20SUMIF関数で、条件に日付範囲で...
おすすめ情報
教えて!goo ウォッチ
-
- 年下の上司と円滑な関係を築く方法
- 昨今、年功序列の出世システムの崩壊や能力主義の結果、年下の上...
-
- 年をとると間違いに厳しくなる?
- 春は出会いの季節。新たな人に出会って話す機会が増えるので、名...
- 新しい上司の意識が高すぎてつらい
- 大注目!プラモデルが熱い!GPNを
- 大阪の都心部に現れた行列スポット
- パソコンで使用しているセキュリティソフトを教えて!
- MSが「ウィンドウズ10」を無償提供に。これは喜ばしいニュース?
- 2万円台で購入可能なChrome OS搭載のPCが日本でも発売予定 欲しい?
- オススメのフリーソフトを教えて
- あなたが使いこなしたいと思うソフトウェアは?
- ウィンドウズXPが4/9にサポート終了 ウイルス感染など影響はでると思う?
- エクセルで使える関数ベスト5を教えて
- 無償のセキュリティソフト使ったことある?使った感想も教えて
- 和食ブームでカニカマが海外でも人気と。あなたの家ではカニカマ、食べていますか?
- 石川県で、新婚男性に水をかけて祝う恒例行事が。手荒い祝福、受けたことある?