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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

解決済

3回答

43677閲覧

Dir関数の呼び出しでファイル名の昇順にマッチングしたい

Taishi2002

総合スコア12

VBA

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

0グッド

0クリップ

投稿2017/11/30 02:06

編集2017/11/30 07:21

フォルダ内に__FILENAMEyyyymmddHHMMSS.txt__という名前のテキストファイルが複数あり、ファイル数が100個を超えた場合日付が古いものを消すロジックを実装したいです。

そのため以下のようなコードで実装していますが、Dir関数で返るファイル名がファイル名の昇順になりません。
これを操作することは出来ないでしょうか?

lang

1 2 'バックアップフォルダー内のファイル数をカウント 3 Dim intFileCNT As Integer 4 intFileCNT = 0 5 Dim strBackupFileName As String 6 strBackupFileName = Dir("フォルダパス") 7 While strBackupFileName <> "" 8 If Left(strBackupFileName, 8) = "FILENAME" Then 9 intFileCNT = intFileCNT + 1 10 End If 11 strBackupFileName = Dir() 12 Wend 13 14 '古いバックアップファイルの削除 15 strBackupFileName = Dir("フォルダパス") 16 While intFileCNT > 100 '最大保存ファイル数は100個 17 If Left(strBackupFileName, 8) = "FILENAME" Then 18 Call Kill("フォルダパス" & strBackupFileName) 19 intFileCNT = intFileCNT - 1 20 End If 21 strBackupFileName = Dir() 22 Wend

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

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

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

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

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

guest

回答3

0

前に同じ内容で困った時にどなたかのHPで教えて頂いた
「StrCmpLogicalW」で、エクスプローラに近いソートができたような。

ひょっとしたら環境によって異なるのかもですが。。。

VBA

1Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long 2 3Public Function SortByIntuitiveFileName(ByRef PathAry As Variant) 4'+ エクスプローラで表示されている順に 5 6 Dim i As Long 7 Dim j As Long 8 Dim TempPath As String 9 Dim ConvAry() As String 10 11 If IsArray(PathAry) = False Then Exit Function 12 13 ReDim ConvAry(LBound(PathAry, 1) To UBound(PathAry, 1)) 14 15 For i = LBound(PathAry, 1) To UBound(PathAry, 1) 16 ConvAry(i) = StrConv(CStr(PathAry(i)), vbUnicode) 17 Next 18 19 For i = LBound(PathAry) To UBound(PathAry) 20 21 For j = i To UBound(PathAry) 22 23 If StrCmpLogicalW(ConvAry(i), ConvAry(j)) > 0 Then 24 25 TempPath = PathAry(i) 26 PathAry(i) = PathAry(j) 27 PathAry(j) = TempPath 28 29 End If 30 31 Next 32 33 Next 34 35End Function

投稿2017/11/30 03:12

ExcelVBAer

総合スコア1175

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

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

Taishi2002

2017/12/04 04:47

ありがとうございます。 エクスプローラの特殊なソートが使える関数があるんですね。
guest

0

ベストアンサー

ディスクのフォーマット形式によって取得順は異なるようです。
http://officetanaka.net/excel/vba/file/file07.htm

なので現状通りDir関数を使うのであれば、一旦取得結果を配列に格納してから、自力ソートするしかないと思います。

Dir関数ではなくFileSystemObjectを使うとソートは可能なようですが、コーディングにひと手間必要です。
とは言っても難しくはないと思います。
詳しくはこちらを参照。
https://kuroeveryday.blogspot.jp/2013/10/FileSystemObjectSort.html

追記
Dir関数で行うということでしたので、ソート処理について追記しておきます。
ファイル名をため込むのには、配列を使うよりもArrayListを使うと便利です。
とりあえずバックアップフォルダー内の処理だけ書き換えてみましたので参考にどうぞ。

VBA

1 Dim intFileCNT As Integer 2 Dim strFileName As String 3 intFileCNT = 0 4 5 'バックアップフォルダー内のファイル数をカウント 6 Dim strBackupFileNames As Object 7 Set strBackupFileNames = CreateObject("System.Collections.ArrayList") 8 strFileName = Dir("フォルダパス") 9 While strFileName <> "" 10 strBackupFileNames.Add strFileName 11 If Left(strFileName, 8) = "FILENAME" Then 12 intFileCNT = intFileCNT + 1 13 End If 14 strFileName = Dir() 15 Wend 16 strBackupFileNames.Sort 17 18 ' 確認 19 For Each tmp In strBackupFileNames 20 Debug.Print tmp 21 Next 22

投稿2017/11/30 02:22

編集2017/11/30 23:54
ttyp03

総合スコア16998

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

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

Taishi2002

2017/11/30 10:59

ありがとうございます。 FileSystemObjectでも良さそうですが、Dir関数で一通り取得した後に自力ソートしてみます。
Taishi2002

2017/12/04 05:03

重ね重ねありがとうございます。 VBAから.NET Framework クラス ライブラリの機能の一部を使用できるのですね。 勉強になりました。
guest

0

Dirの出力順をなんとかする事は出来ない(多分物理順)ので、ソートするしかないですね。
配列のソート関数とかは無いと思うので、自分でソート処理を書く事になるかと。取得する度に、位置を決めてずらすんでしょうか。

変数宣言を省略するとこんな感じか。

VBA

1n = 1 2files(0) = Dir("*") 3Do 4 file = Dir() 5 If file = "" Then Exit Do 6 For i = 0 To n - 1 7 If file < files(i) Then 8 For j = n - 1 To i Step -1 9 files(j + 1) = files(j) 10 Next 11 Exit For 12 End If 13 Next 14 files(i) = file 15 n = n + 1 16Loop 17For i = 0 To n - 1 18 Debug.Print files(i) 19Next

投稿2017/11/30 02:15

編集2017/11/30 03:50
otn

総合スコア84505

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

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

Taishi2002

2017/11/30 08:41

ありがとうございます。 For j = n - 1 To i Step -1 という部分はどういう意味なのでしょうか。
otn

2017/11/30 11:40

うーむ、見た通りの意味なのですが。
Taishi2002

2017/12/04 04:50

Step -1がよくわかっていませんでしたが、要素数の大きいものから処理するということなんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問