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

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

ただいまの
回答率

90.60%

  • VBA

    1725questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,235

tanaka1202

score 6

質問内容

エクセルのマクロから別のエクセルを開く際にファイル名を部分一致検索で取得したかったのですが、
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で検索することで実装はできた(ほかのパターンも基本的に取得可能)のですが、同じような記述で何故挙動に差異が生まれるのか分からなかったのでご教授お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/30 12:55

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

    キャンセル

  • 2017/10/02 10:34

    ありがとうございます。

    キャンセル

+3

 回答修正

以前の回答において

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 17:34

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

    キャンセル

  • 2017/09/29 17:41

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

    キャンセル

  • 2017/10/02 10:34

    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1725questions

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