今回は先日書いた「VBAでファイルリストを高速に取得する関数を自作する」の続編です。前回の記事ではwww.excel-chunchun.com前回の実験では次のような事がわかりました。dirは雲丹文字が読み込めない為、実用には向いていないdirはfsoより数倍高速フリーソフトはdirより数倍高速つまりdirより高速に取得することは技術的には可能なはず。コマンドプロンプトとか...。思ってたら見事に指摘されちゃいました。(ノω・)テヘhttps://twitter.com/excelspeedup/status/1080768445677883392ちなみにコマンドプロンプトを使う方法については、さり気なくちなみに先の記事で書かれていたようなワンステップでファイルリストを作成するコードの場合もVBAのDirと同様に雲丹文字は「?」に化けてしまいました。書いておいたのですが、化けずに取り出す方法が分からないため、このまま迷宮入りにするつもりでした。ところが、なんと@furyutei様から化けないコードを紹介して頂きましたので、360°方向転換して前回同様に比較したいと思います。(※360°は誤字ではないですからね?)コマンドプロンプトを使ったファイルリストの作成それでは早速コードです。コード尚、コードはGitHubにて公開されておりますので、こちらを使わせていただきました。コマンドプロンプトをユーザーが閉じたら途中で中断が出来るようにしています。恐れながらAPI削減の為、SafeArrayAllocDescriptorをSplit(vbNullString)に置き換えました。'エクセルが応答不能になる。/A-D」を実行して結果を一時ファイルへ書き出し一時ファイルをADODB.StreamでUnicodeで読み取りvbCrLFで改行を分解して文字列配列で返却という感じの流れのようです。私の好みだと思いますが、ファイルリストを作成している間エクセルが操作可能状態になってしまうためメリット/デメリットを考慮した結果、コマンドプロンプトはあえて表示したままを選択できるようにしました。エクセルが操作できないようにするために「Application.Interactive」のスイッチを切っても良いのですが、何らかのトラブルでVBAが中断されると大変なことになるので、使用を控えたいところです。コマンドプロンプトの表示/非表示は、CreateObject("Wscript.Shell").Runの第二パラメータに「WshWindowStyle」配下の定数を使うようです。検索でヒットしないので正式名ではないのかもしれませんが、0とか1のマジックナンバーは苦手なので、本物かどうかは抜きにしてとりあえず使っていきます。前回と同じ条件で計測した結果になります。外部実行ファイル必須コマンドプロンプト法の特徴としてはこんなところでしょうか。文字化けはし無い処理している間エクセルが操作できる(コマンドプロンプトを表示しておけば)ユーザーが途中で安全に中断できるセキュリティ設定次第でコマンドプロンプトが実行できない環境がある(かも)最後の件は、下記のサイトにてソレらしい発言があった為、警告としてメモしておきます。https://stackoverrun.com/ja/q/7205728クリップボードを経由する方法GitHubで公開されているコードでは一時ファイルの他にクリップボードを経由する方法も記載されており、こんな感じにすると結果がクリップボードに格納されるようです。TrueWscript.Shellは詳しくないので大変勉強になりました。クリップボードの内容を取り出すときはDataObjectを使うのが一般的ですが、エラーが出るようなのでテキストボックスに貼り付けて、その結果を読み取ることで取り出していました。安定動作を目指してかなり苦労されたものと思います。私もフリーソフトからファイルリストを取得するときにクリップボードを経由していますが、この方法は他のプロセスの影響を受けやすいため一時ファイルを使えるならそちらを使うに越したことはないと思います。別のサーバーにて検証する機会することが出来たので結果を報告します。結果としてはこんな感じになりました。1.00一応、2種類の環境における比較表も貼っておきます。1.0見ての通りfsoとコマンドプロンプトは倍近く早くなっていますが、dirは逆に遅くなっています。環境次第で結構な差がつきそうだと予想されます。SMB3.1.1の結果ついでにサーバーの設定をSMB3.1.1対応をONにして試してみた。結論から言えば、SMB2.1と同じと言っても差し支えない範囲の誤差でした。1.00補足:クラサバ間のSMBバージョンはPowerShellを管理者として実行して、Get-SmbConnectionで確認できるが、何故かその後Explorerがクラッシュする現象を複数のPCで確認したので、コマンドを叩くときは注意するように。参考fsoについてはthomさんが私の言いたいことを上手くまとめて下さったので、読んでない方は是非読んでみてください!thom.hateblo.jpコマンドプロンプトやパワーシェルの呼び出しを隔離するモジュールを、これまたthomさんが書かれていたので参考になりそうでした!thom.hateblo.jphttps://t.co/EnwsaROLbG検証&記事公開ありがとうございます!コマンドプロンプトを表示する/しないは作成者や利用者の好みもありますので、選択可にしておいた方が確かによいですね(表示が煩わしいのもありましたが、どちらかといえばパフォーマンス変わるかな...と試してそのままでした(汗))。【VBA】サブディレクトリも含めたファイル一覧を素早く取得したい|teratailまとめ今回はコマンドプロンプトを使ったファイルリストの作成方法について説明しました。当初イメージしていたような「VBA(のみ)でファイルリストを(fsoより)高速に取得する関数」は実現できませんでしたが、従来の「フリーソフトを使った方法」よりは汎用性の高い関数が出来ました。心配なのは一時ファイルが使えない状況コマンドプロンプトが使えない状況が実在するのかどうか・・・ですが、そもそもコレほど大量のファイルリストをEXCELで作りたがるのは私だけだと思うので、その辺は上手いこと使っていきたいと思います。Tumblr関連記事2019-10-02VBA関数のライブラリ名やモジュール名の省略を検知するアイディアこんばんわ。こ...www.excel-chunchun.com週1回の更新を目指して活動中です。ヶ月)私がExcelを使っていて気になったことを記事に書いていきます。VBAを使い初めて、もう10年ほど経ちましたが、楽しくて楽しくて毎日自宅でもVBA書いてます。自作PCとかサーバー立てたりするのも好きなのでPCとかサーバーのことも書くかもしれません。記事の元ネタは主にTwitterの方で呟いてますので、最速で情報を仕入れたい方は是非フォローしてください。part12019-11-12SpecialFoldersの引数にString型変数を指定すると意図した通りに動かない2019-11-03ワークシート用ユーザー定義関数は使い方を誤ると危険である2019-10-28VBAのコメントの書き方の試行錯誤2019-10-27VBAでの広域コメントアウトの代替案2019-10-26VBAで戻り値のある複数シートをコピーする関数を作ってみた2019-10-22Outlookでメール受信者がローカルパスをクリックできるようにUNCパス化するマクロを作ってみた2019-10-21Outlookでメール受信者がローカルパスをクリックできるようにするマクロを作ってみた2019-10-20VBAでWin32APIの64bit対応自動変換プログラムを作ってみた2019-10-06ワークシート用ユーザー定義関数を揮発性にする方法2019-10-04VBAによる安定したワークシート用ユーザー定義関数の作り方2019-10-02VBA関数のライブラリ名やモジュール名の省略を検知するアイディア2019-09-29EnumWindowsを使って別プロセスのExcelを取得してみた2019-09-24エクセルマクロで野生のマグロを駆逐するミニゲームを作ってみた2019-09-19VBAでIIF関数が全ての項を評価してしまうのは当然である2019-09-16VBAの裏技?コロンで好きな位置にブレークポイントを設置する2019-09-15VBAのStopとDebug.Assertステートメントの違い2019-09-13VBAのInStr関数の不思議な挙動について調べてみた2019-09-08VBAで文字列中の文字をカウントする関数を作ってみた2019-08-31VBAで環境に依存しないWindowsMediaPlayerの使い方もっと見る最新記事(ハードウェア)2019-10-31Realforceを買ってみた。TS-932X-2Gを購入しました。広告プライバシーポリシースターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。