Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1841 / 13645 ツリー ←次へ | 前へ→

【71576】Dir関数について VBA初級者 12/3/20(火) 7:57 質問[未読]
【71577】Re:Dir関数について UO3 12/3/20(火) 8:38 発言[未読]
【71582】Re:Dir関数について 12/3/20(火) 14:56 回答[未読]
【71585】Re:Dir関数について VBA初級者 12/3/21(水) 0:33 質問[未読]
【71586】Re:Dir関数について hint 12/3/21(水) 8:02 発言[未読]
【71594】Re:Dir関数について UO3 12/3/21(水) 19:58 発言[未読]
【71596】Re:Dir関数について VBA初級者 12/3/22(木) 1:34 お礼[未読]

【71576】Dir関数について
質問  VBA初級者  - 12/3/20(火) 7:57 -

引用なし
パスワード
   作業ファイルと同階層に存在するbeforeファイルの中から、
過去ファイルをオープンする前に、存在するかどうかのチェックをしたいです。

が、Openメソッドで開くことのできるパス+ファイル名をDir関数に与えても
""のみが返されてしまいます。
Openメソッドと、Dir関数では与える引数が同じでも違う扱いになる場合が
あるのでしょうか?

理由がわかる方がいたら、どうかご教授ください…

※他の機能の都合上、拡張子は表示を消しています。

Open FileNm = "2012-November"

If Dir(ThisWorkbook.Path & "\before\" & OpenFileNm) <> "" Then
  Workbooks.Open Filename:=ThisWorkbook.Path & "\before\" & OpenFileNm
Else
  
  MsgBox ("There is no file of last month in before folder")
  Exit Sub
End If

【71577】Re:Dir関数について
発言  UO3  - 12/3/20(火) 8:38 -

引用なし
パスワード
   ▼VBA初級者 さん:

おはようございます

>※他の機能の都合上、拡張子は表示を消しています。

他の機能とおっしゃるのは、すでに、拡張子なしで書いたコードがたくさんあるということでしょうけど
私個人としては、(PCのフォルダオプションの設定がどうあれ)コードでは必ず拡張子を明記します。
PCの設定によって、コード実行が成功したり、失敗したりするということになりますので。
officetanaka.net/excel/vba/file/file03.htm

ところで、DIRですが、これは、設定で拡張子を表示しない、する といったものとは関係なく
指定された文字列(ワイルドカードもOK)とフォルダ内のファイルをつきあわせます。

たとえば、そのフォルダに ABC.xls と ABC.doc と ABC.csv があったとして、ABC だけを与えて
DIR関数を実行できるとしますと、どのファイルをピックアップするでしょうか?

ですので、DIR関数に関しては拡張子も含めて指定してやる必要があります。
(もちろん、ワイルドカード記述は可能ですが)

【71582】Re:Dir関数について
回答    - 12/3/20(火) 14:56 -

引用なし
パスワード
   こんにちは。

>Openメソッドと、Dir関数では与える引数が同じでも違う扱いになる場合が
>あるのでしょうか?
はい。あります。
というか、そもそも同じでないといけないなんて決まりはありませんよね^^


拡張子の表示・非表示はあくまでも「表示」だけのコトで
非表示にしたからって、拡張子が切り捨てられてなくなるわけではありません。
見えないけれどあるのです。つまり
〜〜\before\2012-November.xlsというファイルは存在するが
〜〜\before\2012-Novemberというファイルは存在しない。
だからdir関数は""を返します。

Dir(ThisWorkbook.Path & "\before\" & OpenFileNm & "*")
こうすれば、"2012-November.xls" が返りますが
条件に合いさえすれば 想定外のファイルが返ることもあり得ますから
やはり拡張子まで含めて指定するのが安全です。

【71585】Re:Dir関数について
質問  VBA初級者  - 12/3/21(水) 0:33 -

引用なし
パスワード
   お二人とも、素早い返答ありがとうございます。

>Dir(ThisWorkbook.Path & "\before\" & OpenFileNm & "*")
>こうすれば、"2012-November.xls" が返りますが

& "*"をつけることで、Dir関数は動くようになりました。
ありがとうございます。

>条件に合いさえすれば 想定外のファイルが返ることもあり得ますから
>やはり拡張子まで含めて指定するのが安全です。

基本的にはファイル名の命名規約はもう少し複雑で、
拡張子をはずしても問題は無さそうなんですが、システム開発の
基本としては私も問題があるな…と思っていました。

が、フォルダのオプションから拡張子の表示を選択して
OpenFileNmに「& "*"」を追加してしてみても
1004エラーで落ちてしまいます。。
(実は私が現在使っているPCは海外で購入したものなのですが、
日本語版のエクセルを入れてるので、文字化けでエラー内容の
詳細がわかりません…)

ついでに質問をしてしまって恐縮ですが
Openファイルの場合に拡張子を無視する方法はありますでしょうか?
やはりフォルダオプションの設定を変えないで済むなら
そのほうが助かるので。。。

よろしくお願いします!

【71586】Re:Dir関数について
発言  hint  - 12/3/21(水) 8:02 -

引用なし
パスワード
   ▼VBA初級者 さん:
>お二人とも、素早い返答ありがとうございます。
>
>>Dir(ThisWorkbook.Path & "\before\" & OpenFileNm & "*")
>>こうすれば、"2012-November.xls" が返りますが
>
>& "*"をつけることで、Dir関数は動くようになりました。
>ありがとうございます。
>
>>条件に合いさえすれば 想定外のファイルが返ることもあり得ますから
>>やはり拡張子まで含めて指定するのが安全です。
>基本的にはファイル名の命名規約はもう少し複雑で、
>拡張子をはずしても問題は無さそうなんですが、システム開発の
>基本としては私も問題があるな…と思っていました。
では避けたほうがいいでしょう。

>が、フォルダのオプションから拡張子の表示を選択して
>OpenFileNmに「& "*"」を追加してしてみても
>1004エラーで落ちてしまいます。。
Workbooks.Open の引数に * 付きのものをセットしていませんか?
それならエラーになりますよ。
拡張子を除いた(*なんかつけない)ものは開けるはずです。
既に指摘があるように、そういう方法は推奨しませんけれども。

【71594】Re:Dir関数について
発言  UO3  - 12/3/21(水) 19:58 -

引用なし
パスワード
   ▼VBA初級者 さん:

こんばんは
hintさんからも答えが出ていますが「できません」
前にも書きましたが、そのフォルダにABC.xls と ABC.csvがあったら、WOrkbooks.Open でABCしか指定しない場合、VBAはどちらを開くんでしょう?
判断できませんよね。
これが2007以降であればABC.xlsx、ABC.xlsm が存在するかもしれませんし。

で、現在のコードでは IF DIR(・・・・・) = "" で判断しておられますね。
これを
String型変数 = DIR(・・・・・) として、結果の String型変数が""かを判定します。
で、 このString型変数に、見つかったファイルの名前が各調湿機ではいっていますので
Workbooks.Open では、これを使いましょう。

(ただし、DIRで見つかったのが ABC.csv なのか ABC.xls なのかは保証の限りではありませんよ)

【71596】Re:Dir関数について
お礼  VBA初級者  - 12/3/22(木) 1:34 -

引用なし
パスワード
   早速の返信ありがとうございます!

>で、現在のコードでは IF DIR(・・・・・) = "" で判断しておられますね。
>これを
>String型変数 = DIR(・・・・・) として、結果の String型変数が""かを判定します。
>で、 このString型変数に、見つかったファイルの名前が各調湿機ではいっていますので
>Workbooks.Open では、これを使いましょう。

確かに…
これなら悩む必要なないですね。
実際のファイル名は結構複雑で、毎月一つしか作られないものなので
拡張子が違うだけで複数が見つかることは無いと思います。
ということで、この方法にて実装させていただきます!

ありがとうございました!!

1841 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free