質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

31042閲覧

VBAのDir関数でワイルドカードを使用した時の挙動について

tanaka1202

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

0クリップ

投稿2017/09/29 07:05

###質問内容
エクセルのマクロから別のエクセルを開く際にファイル名を部分一致検索で取得したかったのですが、
Dir関数にワイルドカードを使用した時の挙動がなぜそうなるのか分からなかったのでご教授お願いします。

###事象・再現手順
1.任意のフォルダに"あいうえお.xlsx"という名前のファイルを作成する。
2.1のフォルダのパスをA1のセルに記入し、下記マクロを実行する。
3.fileNameが取得できない。

Sub test() Dim path As String Dim fileName As String path = Sheets(1).Range("A1").Value fileName = Dir(path & "*あいうえ*.xls") End Sub

4.fileName = Dir(path & "あいうえ.xls")の部分を下記に変更し、実行する。
5.fileNameが取得できる。

fileName = Dir(path & "*あいう*.xls")

###試したこと
fileName = Dir(path & "あいうえ.xls") → 取得できない
fileName = Dir(path & "あいう.xls")  → 取得できる
fileName = Dir(path & "いうえ.xls")  → 取得できない
fileName = Dir(path & "いう.xls")   → 取得できる
fileName = Dir(path & "あいうえ.xlsx") → 取得できる 

###補足情報(言語/FW/ツール等のバージョンなど)
Excel2010

拡張子をxlsxで検索することで実装はできた(ほかのパターンも基本的に取得可能)のですが、同じような記述で何故挙動に差異が生まれるのか分からなかったのでご教授お願いします。

vitabrevisarsl1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

拡張子が3文字の場合、8.3形式ファイル名のみ

そんなことは無いでしょう。ロングネーム、ショートネームの両方にヒットします。
ヒットしないのは拡張子が"xls"であるロングネームのファイルがないだけでは?

ロングネームとショートネーム両方にヒットするのは、ほとんどのコマンドでそうじゃないでしょうか?

コマンドプロンプトでそのフォルダーを開いて、dir /xというコマンドを入れると、ロングネーム、ショートネームの両方が表示されるので、どう書けば何にヒットするのかが分かると思います。

投稿2017/09/30 01:17

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/09/30 03:55

「あいうえお.xls」での確認を怠っており、誤った解釈で回答していました。 ご指摘ありがとうございました。
tanaka1202

2017/10/02 01:34

ありがとうございます。
guest

0

回答修正

以前の回答において

Directory.GetFiles メソッド

アスタリスクのワイルドカード文字を使用する場合、 searchPattern 「*.txt」など、指定した拡張子の文字数影響を与えます検索次ようにします。

指定された拡張機能が 3 文字の場合は、指定した拡張子が始まる拡張子を持つファイルを返します。 たとえば、「*.xls」には、"book.xls"と"book.xlsx"両方が返されます。

から、Dir関数においても*あいう*.xlsからあいうえお.xlsあいうえお.xlsxが取得できると解釈していましたが誤解でした。Dirはそのような挙動はとりません。

.xls.xlsx.xlsmなどを取得したい場合は、~.xls*とすればよいです。

以下の回答(拡張子が3文字の場合、8.3形式ファイル名のみが検索対象)が誤りであることは、*あいうえ*.xlsあいうえお.xlsが取得できることから確認できました。

以下、以前の回答(誤り)

過去質問System.IO.Directory.GetFiles の挙動についてと同じく8.3形式ファイル名が原因だと思われます。

Dir 関数に明記されていないので推測ですが、検索文字列において

  • 拡張子が3文字の場合、8.3形式ファイル名のみ
  • 拡張子が3文字を超える場合、通常の(長い)ファイル名も

検索対象としていると思われます。

今回の例あいうえお.xlsxあいう~1.XLSとなりますが、上記の規則に当てはめると提示例のようになりえます。

投稿2017/09/29 07:39

編集2017/09/30 03:52
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2017/09/29 08:34

興味があって検証してみたので、コメントします。 Dir *XXX*.xls でヒットしないのを確認した上で、拡張子部分を「.xls?」や「.xls*」として実行したところ、果たしてヒットしました。 よって、Dir関数が拡張子部分で制御しているというのは正しそうです。 だけど、両方見ろよと言いたいところですけどね。
can110

2017/09/29 08:41

コメント&確認ありがとうございます。 Dir関数は大昔からあるようなので、過去のしがらみなどで謎の動きになっているのかもしれませんね...
tanaka1202

2017/10/02 01:34

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問