
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数のエクセルファイルとシー...
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
Excel にて、 リストボックスの...
-
クリップボードに貼付している...
-
EXCEL VBA 単語置き換え につい...
-
Visual Basic VB 教えてくださ...
-
Excelマクロ 該当する値の行番...
-
Excel-VBAでのファイルの開き方
-
Dir関数で複数ブックへ行いたい...
-
VBA 別ブックからコピペしたい...
-
【前回の続き続きです、ご教示...
-
複数のブックからデータを転記...
-
EXCEL VBA シート貼り付け
-
VBSでExcelのオープン確認
-
エクセル vba ある検索値を別ブ...
-
Excel (2013) VBAでもし最大表...
-
シートをコピーする下記記述で...
-
VBA シート名が一致した場合の...
-
(マクロ)データをAブックからB...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAが途中で止まります
-
ワイルドカード「*」を使うとう...
-
VBA コードを実行すると画面が...
-
VBAで別のブックにシートをコピ...
-
VBAで別ブックのシートを指定し...
-
【Excel VBA】書き込み先ブック...
-
Excelマクロ 該当する値の行番...
-
【ExcelVBA】zip圧縮されたCSV...
-
[Excel]ADODBでNull変換されて...
-
【ExcelVBA】インデックスが有...
-
Excel2007VBAファイルの表示に...
-
VBAで複数のブックを開かずに処...
-
vbaで他のブックに転記したい。...
-
エクセルマクロで、他ブックか...
-
vbaでvbaProjectのパスワード解...
-
VBA 実行時エラー 2147024893
-
【マクロ】違うフォルダにある...
おすすめ情報