[[20190909170507]] 『Excel2016forMacでDir関数を使ってフォルダ内検索』(かえる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Excel2016forMacでDir関数を使ってフォルダ内検索をしたいです』(かえる)

Sub ddd()

    Dim Pt As String
    Dim Buf As String

    Pt = ThisWorkbook.Path
    Buf = Dir(Pt & "/" & "*.xlsx")
    MsgBox Buf
End Sub

上記のコードで実行してもMsgBoxには何も表示されません。
同じフォルダ内に100以上の。.xlsxファイルが存在します。

Excel2016ではMacでもDir関数を使えると思うのですが、何が間違っているのでしょうか?

MsgBox Pt にするとパス自体は表示されます。

Mac使いの方が居られましたらご教示願います。

< 使用 Excel:Excel2016mac、使用 OS:unknown >


 Mac使いではありませんが、ググったらこんな情報がありました。
http://neos21.hatenablog.com/entry/2019/01/20/080000

 2016でも、いろいろ制約がありそうです。

 リンク先を参考にして、
 Buf = Dir(ThisWorkbook.Path, MacID("XLSX"))
 とかしたら、どうなりますかね?
(´・ω・`) 2019/09/09(月) 17:23

 回答ではありませんが 試していただきたいこととして

     MsgBox ThisWorkbook.FullName

 をコードのどこかに入れて実行し、結果を教えてください

(渡辺ひかる) 2019/09/09(月) 17:31


(´・ω・`)さん 返信ありがとうございます。リンク先は後で読んでみます。
差し当たって教えていただいた

 Buf = Dir(ThisWorkbook.Path, MacID("XLSX"))

を試してみましたが。「プロシージャの呼び出し、または引数が無効です。」
というエラーが出てしまいました。

(かえる) 2019/09/09(月) 18:12


(渡辺ひかる)さん

MsgBox ThisWorkbook.FullName

を実行してみましたが、上記のPtに**.xlsxが追加されただけでした。
区切りは「/」でした
(かえる) 2019/09/09(月) 18:15


(´・ω・`)さんに貼って頂いたURLに書いてある「vbDirectory」も試してみましたが、こっちはエラーではなく空白が返ってるようです。

やっぱりMacだと「*」や「?」のようなワイルドカードは使えないんでしょうか?職場ではWindowsで、最近、VBAの勉強の為に自宅のMacにExcelを導入したので、出来る限り同じコードを書きたいのですが、やはり大分違うんですね
(かえる) 2019/09/09(月) 18:20


あ、嘘です。空白は帰ってないです。vbDirectoryであれば先頭のファイル名が返ってきました。ありがとうございます!

Mac版のインターフェイスに慣れてなくて色々すみません。

(かえる) 2019/09/09(月) 18:23


Macって、昔から拡張子という観念がなくて、ファイルの種類はファイル先頭部分(256byteだったかな?)にファイル種類を示す番号が書かれているのですよ。 MacID("XLSX") ってすることで、ファイル種類を指定しているのですね。

CTRLキーがCommandキーだったりとか、基本がWindowsと全然違うので、最初は違和感バリバリですが、試行錯誤して慣れてください。(そして、ここもそうですが、日本はWindows版Excelが普及しているので、Mac版は情報が少なかったりするので、英語ページも探さないといけなくなる…)
(???) 2019/09/09(月) 18:47


おお、やっぱりダメです。

Sub text()

    Dim i As Long
    Dim Buf As String
    Const Pt As String = "/Users/kaeru/Documents/Excel練習/examfile1 "

    Range("A1").Value = "パス"
    Range("B1").Value = "ブック"
    Buf = Dir(Pt, vbDirectory)
    'MsgBox Buf
    Do While Buf <> ""
        i = i + 1
        Cells(i + 1, 1).Value = Pt
        Cells(i + 1, 2).Value = Buf
        Buf = Dir(Pt, vbDirectory)
    Loop
End Sub

の様にThisWorkBookではなく他のブックからパスをしていしようとするとまた空白が返ってきます。
パスは開きたいフォルダ内のブックからBVEで「Debug.Print ThisWorkBook.Path」で意味ディエイトウィンドウからコピペしてるのであってるはずなのですが、コメントアウトしてる部分でMsgBoxで見ても空白が返っています。でもエラーにはならないです。
(かえる) 2019/09/09(月) 18:51


(???)さん なるほど。もう10年以上Macを使ってますが、ほとんどファイルの拡張子とかも気にした事がなかったので勉強になります。MacID(“XLSX”)ではなぜか取得出来なかったのに、vbDirectoryでは取得出来るっていうのもちょっと理解出来ない部分なのですが。

やはりMac版は情報が少ないですよね。そりゃ、エクセル使うならWindowsを使えよって話ですもんね笑。
Googleで「Mac VBA 2016 ファイル取得」とかでググってたのですが、中々めぼしい記事に出会えませんでした。
色々、試行錯誤してみます!ありがとうございます!
(かえる) 2019/09/09(月) 18:56


おお、もろにディレクトリ名を晒してしまってる。ちゃんと消したと思ってたのに、ページ更新でエラーが起こったから新たにコピペしたせいですね。ディレクトリは見なかった事にして下さい。
(かえる) 2019/09/09(月) 18:58

 >区切りは「/」でした
 Macは : だと思ったのですがね...

 試しに / の代わりに Application.PathSeparator を使用するとどうなりますか?
(seiya) 2019/09/09(月) 19:25

(seiya)さん イミディエイトウィンドウに

Print(Application.GetOpenFileName)

と入力して上記のファイルを開いても同じです。区切りは「/」ですね
2016から「:」の代わりに「/」になった様です。
(かえる) 2019/09/09(月) 20:07


 そうでしたか...関係なかったですね。
 失礼しました。
(seiya) 2019/09/09(月) 20:27

上記のコードはパスの後ろに半角スペースが入っていた為にエラーが出た様です。

しかし、問題は二回目のBuf=Dir(Pt,vbDirectory)でも同一のファイルしか読み込まないので
延々と処理を続けてしまう事でした。

どうやらマックで一つのフォルダ内の全てのファイルを取得するのは不可能な様です。
ほぼそれの為に導入したのに、完璧に無駄な出費でした。

MacIDの方はやっぱり実行時エラー5で引数が無効との事なので使えないです。無念
(かえる) 2019/09/10(火) 07:47


 >MacIDの方はやっぱり実行時エラー5で引数が無効との事なので使えないです。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/macid-function

 とか見ると、Excelファイルを探すときは、"XLS5" と書いてあるので、
 Windowsでの拡張子とはちょっと違うのかもしれないですね。

(´・ω・`) 2019/09/10(火) 09:02


(´・ω・`) さん

"XLS5"で書いてみましたが同じエラーが出ました!アプリケーションシグネチャというヤツを
ググってみたのですが、ネット上に一覧の様な物はないと思われます。
Mac使いの方はどうやって調べてるんでしょうね?書籍であるのかな?
(かえる) 2019/09/10(火) 16:50


 さらにググってみました

https://stackoverflow.com/questions/13292376/what-are-macid-filetypes-in-excel-vba

 これを読むと

   Macで mdlsコマンド使うと、ファイルのメタデータがみれるよ
   メタデータの kMDItemFSTypeCode がファイルの種類だよ

 と書いてありますが、その後の回答では

 Macで作ったファイルには正しくセットされるけど、PCで作ったファイルだと空だよ
 
 ということで、使えないというのがファイナルアンサーですね
(´・ω・`) 2019/09/10(火) 17:10

(´・ω・`) さん

申し訳ないです。英語はからっきしなのでリンク先の情報は全く解りません。申し訳ない

mdlsコマンドというのはターミナル(Windowsでいうコマンドプロンプト)から入力する感じなんですかね?ターミナルもほとんど触った事が無いので、本当に素人ですみません。

多分、Windowsとのデータのやり取りはしないので大丈夫だと思います!

ファイルの検索とか取得って色んな場面で使うであろう事が出来ないって困りものですね
(かえる) 2019/09/10(火) 17:28


というか、本当にやりたい事はファイル名を取得した後に、文字列と数字の組み合わせのファイルを番号の若い順にソートする事なんですよね。
「File1」から「File100」までを普通にソートすると「1,10,11,12,,,,2,20,21,,,」ってなるから、文字列から数字を抜き出して、Dictionaryで元の文字列に抜き出した数字をKeyにしてソートしてから出力するってのを具体的にどうコードに書けば良いかが解らない。
Dictionaryも使った事無いし、数字の抜き出しも文字列一つずつにLike演算子使うってのも無駄に長くて処理が重くなりそうだしで、調べれば調べるほど訳が解らない。
(かえる) 2019/09/10(火) 17:35

Macの特徴として、セキュリティが厳しいので、他のアプリの領域には一切手が出せない、というのがあるのですが、フォルダはExcel自身が保存できる場所を指定していますかね?

Windowsみたいに、禁止されているところ以外はどこでも見られる、というのとは真逆なんです。 自分の割り当てられたところしか見られない。

ちなみに、本当にやりたいファイル名の並べ替えに関しては、DictionaryはWindows固有の.NETのオブジェクトなので、Macじゃ使えませんよ。 数字部分だけ抜き出して、前ゼロつけて並び替えるとか、ソートロジックを自分で書くとかしないとです。 または、Macはスクリプト(AppleScript)が強力なので、フォルダの一覧から並び替えまでスクリプトで実施させてファイルに出力させておき、結果テキストを読むようにするとか。
(???) 2019/09/10(火) 17:49


(???)さん

フォルダはExcel用に作った普通のフォルダです。Excelの保存も出来ますし、一応
Dir("パス名",vbDirectory")で最初のファイルは読み込めます。

やっぱりMacでExcelのVBAをいじるのが間違いなんですかね?

Dictionaryも無理なんですね。職場のWindowsで使える様にVBAを勉強しているので、Macでしか使えないコードを勉強するのも何だかなって感じです。
AppleScriptはちょっと調べてみたらフォルダ内検索も出来そうですね。便利ではあるんですが、あまりにWindowsのVBAとはかけ離れてますね。それぞれ別で勉強しないとダメぽいですね

Mac上でVBAを使える事にメリットがあるのは解るんですが、自宅に導入してラーニングコストが倍になった感じが否めないのが残念です。
(かえる) 2019/09/10(火) 18:00


 MacではDir関数がまともに機能しないようですね。

http://neos21.hatenablog.com/entry/2019/01/21/080000
(seiya) 2019/09/10(火) 18:55


(seiya)さん

そうみたいですね。やっぱりAppleSprictを使って処理するしか無いみたいです。
Windowsと共通でないやり方はちょっと今は避けたいので保留中です
(かえる) 2019/09/10(火) 19:41


>Windowsと共通でないやり方はちょっと今は避けたいので保留中です

目的は、職場のWindowsで使うことで
そのための勉強で、自宅のMacを利用しているだけですよね。

今回の件に関してなら、Winsowsでは、DirかFSOを使って
他の方法なんて考ないと思うのですが…

WindowsとMac共通で使える他の方法があっても
職場でその方法を使う意味ありますか?

(マナ) 2019/09/10(火) 20:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.