VBAで住所とかをエクスプローラ風の自然順ソートにする

VBAを使って自然順ソートをやりたいと思ったのですが、意外にやり方が限定されていました。自然順ソートという言葉を知っていると楽なので、そのあたりも含めつつ、どうするといい感じにできるかメモしておきます。

ファイルの取得順をエクスプローラ風にしたい

説明が難しいというか、Windowsでいうエクスプローラで詳細モードでファイル名を降順または昇順ってマウスクリックすれば出来ますよね。

その時ファイルの順番が「1,2,10,11」とかがエクスプローラ風といっていて、「1,10,11,2」みたいに、文字列扱いなのか気持ち悪いのがExcelのソート順です(笑)

これは仕様というか、文字列として例えば住所のソートなどでよく見られます。これは気持ち悪いし、しかもわりと何度もストレスを味わうので何かいい方法ないかといって試してみました。

結論的にはWindowsAPIのStrCmpLogicalW関数を宣言し使うことでオッケー

もちろんVBAでコードを書くことになります。

VBA フォルダパスをダイアログから取得する。更にそのフォルダ内のファイル名をソートして取得する

こちらの記事が非常に参考になりました。ありがとうございます!説明も端的にまとまっているので早くやり方知りたい人は見てみてください。

ファイルシステムオブジェクト、つまりFSOを使えばWindowsのファイル操作だから問題ないでしょと思っていたのですがそうではないんですよね。これは罠といえば罠だし、違うんですといえば違うので知らないと分からない話ですよね。

以下はまった話のメモです。

ADOは駄目

ADOという仕組みで、レコードセットを作りそこでSQLっぽくソートすればいけるじゃんと思ったのですが駄目でした。

参考にした記事は、

フォルダ内のファイル名をADO.Recordsetを使って並べ替える。

VBScriptでファイルの日時順でソートする

などです。Sortメソッドかなを使ってとか、最初にフィールドを定義とかも独特な感じです。

やったんですが、なんかソート出来てないというか、想定する順番ではなかったので却下です。

エクスプローラーのあの自然な感じは自然順ソートというものらしい

これを知れたのは良かったです。同じことを考える先達の知恵に感謝です。

エクスプローラのファイル順のように、自然順ソートで並び替える

では、自分でなんとかするという剛の者の発想ですがさすがにそこまではないので、すごいなあというところです。

Windowsのファイル名ソート順の再現が難しい件(StrCmpLogicalW)

こちらの記事では難しいよねというところで色々とメモがされています。その処理まで考えるのは辛いなあと調べていて思っていたところです(笑)

そして結果的に、結論としてあったWindowsAPIをかまして解決というところでした。めでたしめでたし。

タイトルとURLをコピーしました