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

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

新規登録して質問してみよう
ただいま回答率
85.31%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

VBA

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

6569閲覧

Dir関数 ワイルドカードで任意の桁数のファイルを開く

Crucian_carp

総合スコア11

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

VBA

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/09/03 01:42

とあるフォルダに類似したファイル名のエクセルファイルが二つ
① Funa_20200903.xls
② Funa_2020090307.xls
あります。

【やりたいこと】
VBAのDir関数を用いて、ファイル名を取得し、
それぞれのファイルを開けるような動作を出来るようにしたいと考えています。

【やってみたこと】
まず①のファイルを開くマクロを書きました。
Dir関数ではワイルドカードが使えるため、”?”をつかって桁数を分別しようと考え

VBA

1 Dim Funa As String 2 Funa = Dir(ThisWorkbook.Path & "Funa_????????.xls ", vbNormal) 'ファイル名を返す" 3 Workbooks.Open (ThisWorkbook.Path & "\" & Funa) 'Funa?20200903のエクセルを開く

というマクロを書き、回してみたところ、意図通り”Funa_20200903”のファイルを開くことができました。

続いて②のファイルを開くマクロを

VBA

1 Dim Funa As String 2 Funa = Dir(ThisWorkbook.Path & "Funa_??????????.xls ", vbNormal) 'ファイル名を返す" 3 Workbooks.Open (ThisWorkbook.Path & "\" & Funa) 'Funa?20200903のエクセルを開く

と書きました(ワールドカードに”?”を二つ追加しました)。
しかしながら、マクロを回してみたところ開かれたファイルは①でした。

【質問】
なぜ②のファイルを開くことができなかったのでしょうか。
また、②のファイルを開くためにはどの部分の記載を変更すべきなのでしょうか。
(そもそもDir関数は不適でしょうか?)

お手数おかけしますが、ご教授頂けますと幸いです。
状況について、勉強不足のため言葉足らずな部分ございましたらご指摘いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

末尾または.の前に?があるとちょっと特殊な動作です。

"Funa_??????????.xls"
"Funa_20200903.xls".で区切った単位でマッチさせるのですが、長さが足りないFuna_20200903の方は後ろに空白があるものとして長さを揃えてFuna_??????????とマッチさせ、このとき?は空白にマッチします。
なので、"Funa_20200903.xls""Funa_??????????.xls"にマッチします。
"Funa_.xls"でも"Funa_??????????.xls"にマッチします。

これはMS-DOSの時代にはファイル名は、拡張子と拡張子を除いた部分を「固定長後ろ空白詰め」で別々に管理しており、ワイルドカードのマッチもそれぞれの部分ごとに行っていたということとの互換性を保つためだと思いますが、そのため非常にわかりにくくなっています。
なお、その経緯から?.にマッチしませんでしたが、これは現在も継続していますね。
MS-DOS時代は*.にマッチしなかったと思います。こっちは今はマッチしますが。

ということで、dirでループを回してマッチするファイルを順次取得した上で、取得したファイル名を見て判断するということになります。

投稿2020/09/03 02:38

otn

総合スコア86285

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

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

Crucian_carp

2020/09/03 09:36

otn様 いくつもご回答、コメントを下さいまして誠にありがとうございました。 "?"を使用することで、思い通りの動作を実現できない理由と背景を理解することができました。 「見て判断」というポイントを何とかして無くすことができないか、引き続き考えていきたいと思います。
guest

0

いっそFileSystemObjectを使用するというのも。
(というか何故敢えてDir()使うの?って感じですけども)
あまり知られていないDir関数の特徴

投稿2020/09/03 06:39

編集2020/09/03 06:42
sazi

総合スコア25430

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

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

otn

2020/09/03 07:30

そのサイトも間違いがありますね。 > Dir関数で3文字の拡張子を指定した場合、その3文字「で始まる」拡張子が該当すると判断されます。 これは、(dir /x コマンドで表示される) 8.3名(ショートネームとも)で、そういう拡張子になっているケースだけです。 8.3名が付かないドライブでは発生しませんし、8.3名が付いている場合でも設定によっては3文字拡張子の生成ルールが変わるので発生しません。
sazi

2020/09/03 09:06 編集

@otn さん フォローありがとうございます。 言いたいのは、「FileSystemObjectの推奨」だったので、細かい点は精査していませんでした。 それぞれの例があったのと、dir()には知られていない仕様があるというニュアンスが伝われば良いな程度で。 Dir()で参照しているディレクトリに新たにファイル追加したら、Dir()でそのファイルが取得されるのが、一番面倒に感じます。 その点、FileSystemObjectの方がINPUTが確定しているので。
Crucian_carp

2020/09/03 09:34

sazi様 ご回答ありがとうございます。 私自身勉強不足でまだ引き出しが少ないため、Dir以外の方法に気づけていないというのが現状です。 FileSystemObjectという新しい方法があるようですので、そちらを勉強するところから始めたいと思います。ヒントを下さいましてありがとうございました。
guest

0

?は0文字も含むので合致してしまいますね。(参考)

"Funa_*.xls" で抽出して、得られたファイル名の文字数で判断することになりそうです。

投稿2020/09/03 01:56

ttyp03

総合スコア17000

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

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

otn

2020/09/03 02:15

> ?は0文字も含むので合致してしまいますね。(参考) これは間違ってますね。それが本当なら、"abc"というファイル名にdir("ab?c")やdir("a??c")でマッチするはずですが、マッチしません。
ttyp03

2020/09/03 02:34

確かに、間に?が入るとマッチしませんね。 後ろに置く分("abc?")には0文字でもマッチします。 仕様が謎ですが、今回に限っては後ろに置くパターンなのでマッチしてしまうことになります。
Crucian_carp

2020/09/03 09:38

ttyp03様 迅速なご回答誠にありがとうございました。 ”?”の位置によって、状況が大きく変わってくるということが理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問