Excel (VBA) |
![]() ![]() |
(Windows 10全般 : Excel 2019)
順番に並べたい
投稿日時: 23/03/13 16:39:54
投稿者: eco2019
|
---|---|
フォルダーを読み込むマクロで、読み込んだらフォルダー名の順番が下記のようになります。1の次は2が来るようにできないでしょうか・・・
|
![]() |
投稿日時: 23/03/13 17:06:45
投稿者: 詠み人知らず
|
---|---|
ff = Range("B3")
|
![]() |
投稿日時: 23/03/13 17:20:37
投稿者: eco2019
|
---|---|
こんにちは。すみません、有難うございます。
|
![]() |
投稿日時: 23/03/13 18:18:40
投稿者: 詠み人知らず
|
---|---|
Sort効かないんですね。残念。
|
![]() |
投稿日時: 23/03/13 18:28:34
投稿者: simple
|
---|---|
回答いただいたように、StrCmpLogicalWを使う方法で対応可能だと思います。
|
![]() |
投稿日時: 23/03/15 06:58:21
投稿者: simple
|
---|---|
StrCmpLogicalWを使った私なりのコードを挙げておきます。
Option Explicit #If VBA7 And Win64 Then '64Bitの場合 Declare PtrSafe Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long #Else '32Bitの場合 Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long #End If Sub test() Dim target As String Dim fldNames() As String Dim fso As Object Dim fld As Variant Dim ind As Long Dim f As Object Dim tmp As Variant Dim i As Long Dim j As Long Set fso = CreateObject("Scripting.FileSystemObject") target = Range("B3") 'target = "D:\MyDocuments\202303" ''デバッグ用 For Each fld In fso.GetFolder(target).SubFolders ReDim Preserve fldNames(ind) fldNames(ind) = fld.Name ind = ind + 1 Next 'fldNamseをエクスプローラと同様の並び順に変換 Call SortByFilename(fldNames) 'フォルダ一覧の出力 j = 6 For Each fld In fldNames Cells(j, "E") = fld j = j + 1 Next Set fso = Nothing End Sub 'ソート用の関数 Sub SortByFilename(ByRef fldNames() As String) Dim i As Long Dim j As Long Dim tmp As String Dim p As Long For i = 0 To UBound(fldNames) For j = i + 1 To UBound(fldNames) If StrCmpLogicalW(StrConv(fldNames(i), vbUnicode), _ StrConv(fldNames(j), vbUnicode)) > 0 Then tmp = fldNames(i) fldNames(i) = fldNames(j) fldNames(j) = tmp End If Next Next End Sub 【余談】 StrCmpLogicalWというAPI関数については、10年以上前ですが、 こちらの給湯室で議論したことがあります。(nさんに情報をいただいた) なお、StrCmpLogicalW関数については、 https://www.excel-chunchun.com/entry/GetFileFolderList_04 が参考になります。(ネット検索して上位に来ただけです) # この記事で使われている # Arr = VBA.Array("X10Y1", "X10Y10", "X10Y2", "X1Y1", _ # "X1Y10", "X1Y2", "X2Y1", "X2Y10", "X2Y2") # という配列の例は、moug給湯室で議論したときに使用したものと同じでした。 # たしか、なにかのコードコンテスト(どのプログラム言語が一番簡潔に書けるか)に # 使用された例だった記憶があります。 # なお、上記参照ページで引用している記事の作者(半角チルダさん)と n さんは同一人です。 |
![]() |
投稿日時: 23/03/15 10:13:31
投稿者: eco2019
|
---|---|
すみません、有難うございます。中々、上手くいかずにどうすればいいのか分からなくなっていました。
|
![]() |
投稿日時: 23/03/15 10:35:36
投稿者: eco2019
|
---|---|
StrCmpLogicalWという関数があるのですね。思ったようにいきました。すごいです。有難うございました。 |