
Excel-VBAでの基本的な質問です。ファイルをオープンする時の作法についてです。Office-TANAKAさんのページにあるサンプルソース、
http://officetanaka.net/excel/vba/file/file01.htm
では、
1)そのファイルがあるかどうかを確認する
2)そのファイルが既に開かれているかどうかを確認する
3)1)、2)とも問題がなければファイルを開く
という段取りでエラーの出ないプログラムを書きましょうとなっております。で、実際にやってみたんですが、2)の処理を省いてもエラーは出ないことがわかりました。
何故2)を省いてもエラーは出ないんでしょうか。これからも2)の処理を省いてVBAプログラムを書いていって問題はないんでしょうか。
よろしくお願い申し上げます。
(以下ソースコードです。)
----------------
Sub Sample7()
Dim buf As String, wb As Workbook
Const Target As String = "C:\Book1.xlsx"
''ファイルの存在チェック
buf = Dir(Target)
If buf = "" Then
MsgBox Target & vbCrLf & "は存在しません", vbExclamation
Exit Sub
End If
''同名ブックのチェック。省いても問題ない???
' For Each wb In Workbooks
' If wb.Name = buf Then
' MsgBox buf & vbCrLf & "はすでに開いています", vbExclamation
' Exit Sub
' End If
' Next wb
''ここでブックを開く
Workbooks.Open Target
End Sub
----------------
No.2ベストアンサー
- 回答日時:
こんにちは
開こうとしているブックと、既に開いているブックが同一であれば問題はないと思います。
一方で、異なるディレクトリに同名のブック(=別ブック)が存在していて、片方が既に開いている状態で、もう一方を開こうとした場合を想定すると問題が発生します。
通常、手操作で上記のことを行おうとすると「同名のブックが既に開いています」と警告が出て開けません。
VBAから実行した場合は、何も行われずに無視されます。
例えば、
Set book = Workbooks.Open(Target)
とすれば、通常は対象のブックを開き、そのオブジェクトが変数bookに返されますが、上記のような状態だとbookはNothingになります。
このbookに対して、何か処理を行おうとすればエラーになりますが、ご提示のように
Workbooks.Open Target
としたうえで、
Set book = ActiveWorkbook
とか
Set book = Workbooks("buf")
などとしてそのbookを操作すると、操作はできますが意図とは異なるブックに対して処理を行ってしまう可能性があります。
あらかじめ、そのような可能性が無いと保証できているのなら、省いても問題はないと思いますが。
No.4
- 回答日時:
こんばんは
的確な回答が出ておりますので個人的な考え方を書きます
このコードの目的はTargetブックを開くで終わっていますが、実際には
Targetブックを扱うのが目的かと思います
排他処理の問題については C:\ である事や読み取り目的として割愛しても
Targetブックが開いていればそのまま扱える訳ですし開いていなければ
Workbooks.Openで開いて扱うのであって 開いているかどうかは扱い方(Set)が変わるからと解釈すれば、チェックは合理的な処理だと思います
(エラーが出ずWorkbooks.Open Target出来るのだけれど・・・)
Dim buf As String, wb As Workbook
Const Target As String = "C:\Book1.xlsx"
''ファイルの存在チェック
buf = Dir(Target)
If buf = "" Then
MsgBox Target & vbCrLf & "は存在しません", vbExclamation
Exit Sub
End If
Dim TargetBook As Workbook
For Each wb In Workbooks
If wb.Name = buf Then
Set TargetBook = wb
Exit For
End If
Next wb
If TargetBook Is Nothing Then
Set TargetBook = Workbooks.Open(Target)
End If
MsgBox TargetBook.Worksheets(1).Range("A1").Value
No.3
- 回答日時:
まず、同名のファイルを開いていると言うことが絶対に無いのなら、チェックを省いて良いのは自明なのでいいですよね。
同名のファイルを開いている状態で実行した場合、
・MsgBox buf & vbCrLf & "はすでに開いています", vbExclamation という自分で設定したエラーメッセージを表示する
・ExcelVBAの標準のすでに開いているというエラーメッセージを表示する
のどちらにするかという選択の問題です。
前者(もしくは単にメッセージを表示するだけでなく何らかのリカバリー対処をするなど)が良ければ参考サイトのようにすれば良いし、後者が良ければチェックしないことです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別ブックをダイアログボックス...
-
【マクロ】アクティブセルにブ...
-
【ExcelVBA】zip圧縮されたCSV...
-
Excel マクロ ファイルと同じシ...
-
VBAで別のブックにシートをコピ...
-
拡張メタファイルにて貼り付け
-
【Excel VBA】書き込み先ブック...
-
【ExcelVBA】インデックスが有...
-
現在開いているbook全てを対象...
-
VBA コードを実行すると画面が...
-
VBA 別ブックからコピペしたい...
-
Access開いているブックのセル...
-
VBAで複数のブックを開かずに処...
-
【VBA】全シートの計算式を全て...
-
vbaでvbaProjectのパスワード解...
-
VBAで別ブックのシートを指定し...
-
【マクロ】実行時エラー '424':...
-
Worksheets メソッドは失敗しま...
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数のエクセルファイルとシー...
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAが途中で止まります
-
ワイルドカード「*」を使うとう...
-
VBAで別のブックにシートをコピ...
-
VBA コードを実行すると画面が...
-
VBAで別ブックのシートを指定し...
-
【ExcelVBA】zip圧縮されたCSV...
-
【Excel VBA】書き込み先ブック...
-
2つ目のコンボボックスが動作...
-
[Excel]ADODBでNull変換されて...
-
Excelマクロ 該当する値の行番...
-
VBA 実行時エラー 2147024893
-
Excelのマクロコードについて教...
-
Excel にて、 リストボックスの...
-
【ExcelVBA】インデックスが有...
-
VBA アプリケーション定義また...
-
【Excel VBA】表の列の値毎に分...
おすすめ情報