プロが教えるわが家の防犯対策術!

Excel VBA ファイル取得について
フォルダの中に、ファイル名“会議“を含むファイルが1つまたは複数あります。

《実行内容》
Dim fullPath As String, myFile As String
※fullPath 省略
myFile = Dir(fullPath & "¥" & "*会議*")

“会議“ファイルが複数ある場合、
ファイルを昇順に並べた時に一番上に来る
ファイル1つを取得したいです。

どのようにしたら良いか教えて頂けると幸いです。
宜しくお願い致します。

質問者からの補足コメント

  • 補足です。○○○会議_4.xlsm、○○○会議_12.xlsmがあった場合、数字が小さい○○○会議_4.xlsm をファイル名として取得したいです。

      補足日時:2022/10/12 11:31

A 回答 (9件)

#5です 連投すみません


E:\Desktop\Excel_VBAはデバッグで使ったアドレスです
書き換えてください

!! インデックスを打ち間違いしています

判り難くなってしまいました。すみません訂正してください

For n = LBound(ary, 2) + 1 To UBound(ary, 2)
tmp1 = ary(0, n): tmp2 = ary(1, n)
If ary(1, n - 1) > tmp2 Then
k = n
場所分かりますか・・
    • good
    • 1
この回答へのお礼

助かりました

解決しました!!!丁寧に教えて頂いてありがとうございます。

お礼日時:2022/10/12 23:52

他に回答がついているようですが私には見えません。


どの道私の場合『 NET Framework 3.5 』がインストされているのが条件ですので最近のWIN10ですとどうなのかな?
私の場合VS2008をインストした関係で入れましたから(随分前に)。

他の回答で問題ないならそちらをご利用ください。
上記は『並び替えるのが億劫』ってだけの手抜き手法の関係ですので。
    • good
    • 1

要は、*会議*_nnn.xlsm のファイルのnnnが最小のファイル名を取得したいと理解しました。

(nnnは1桁以上の数字)
以下のようにしてください。
該当ファイルがメッセージボックスに表示されます。
(但し、数字は9桁までとします)

Option Explicit

Const CNumMax As Long = 1000000000
Public Sub sample()
Dim fullPath As String, tmpFile As String
Dim minFile As String
Dim minNo As Long
Dim tmpNo As Long
fullPath = "D:\goo\data8"
tmpFile = Dir(fullPath & "\" & "*会議*.xlsm")
If tmpFile = "" Then
MsgBox ("該当ファイルなし")
Exit Sub
End If
minFile = ""
minNo = CNumMax + 1
Do While (tmpFile <> "")
tmpNo = GetNumber(tmpFile)
Debug.Print tmpFile, tmpNo
If tmpNo < minNo Then
minFile = tmpFile
minNo = tmpNo
End If
tmpFile = Dir()
Loop
MsgBox (minFile)
End Sub

Public Function GetNumber(ByVal fname As String) As Long
Dim p1 As Variant
Dim p2 As Variant
Dim ll As Long
Dim num As String
GetNumber = CNumMax
p1 = InStrRev(fname, "_")
If p1 < 1 Then Exit Function
p2 = InStrRev(fname, ".")
If p2 < 1 Then Exit Function
ll = p2 - p1 - 1
If ll < 1 Then Exit Function
num = Mid(fname, p1 + 1, ll)
If IsNumeric(num) = False Then Exit Function
If Len(num) > 9 Then Exit Function
GetNumber = CLng(num)
End Function
    • good
    • 1
この回答へのお礼

助かりました

解決しました!!!綺麗にまとめて頂いてありがとうございます。コードわかりやすかったです!

お礼日時:2022/10/12 23:55

#5


少し訂正 If IsNumeric(str2) Then なので
ary(1, n) = CInt(str2) とすれば
Function側のCInt( )は要りませんね
この方が、処理数、Functionの使い方が広がりますので訂正します
    • good
    • 1

こんにちは


_の数は? .xlsm拡張子で_が数字の前に必ずあるのなら・・
ファイル名を取得したい場合、2次元配列でソートするのはどうでしょう
(数字部分を抜き出してソート)
Sub test01()
Dim ary() As Variant
Dim n As Long
Dim sPath As String, sFile As String
sPath = "E:\Desktop\Excel_VBA\"
sFile = Dir(sPath & "*_*.xlsm")
Dim str1 As String, str2 As String
Do Until sFile = ""
If InStr(sFile, "_") > 0 Then
str1 = Mid(sFile, InStr(sFile, "_") + 1)
str2 = Left(str1, InStr(str1, ".xlsm") - 1)
If IsNumeric(str2) Then
ReDim Preserve ary(1, n)
ary(0, n) = sFile
ary(1, n) = str2
n = n + 1
End If
End If
sFile = Dir
Loop
Debug.Print mySort(ary)
End Sub

Public Function mySort(ary As Variant) As String
Dim n As Long, k As Long
Dim tmp1 As Variant, tmp2 As Integer
'配列次元キー2 IntegerでSort
For n = LBound(ary, 2) To UBound(ary, 2)
tmp1 = ary(0, n): tmp2 = CInt(ary(1, n))
If CInt(ary(1, n)) > tmp2 Then
k = n
Do While k > LBound(ary)
If CInt(ary(1, k - 1)) <= tmp2 Then
Exit Do
End If
ary(0, k) = ary(0, k - 1): ary(1, k) = CInt(ary(1, k - 1))
k = k - 1
Loop
ary(0, k) = tmp1: ary(1, k) = tmp2
End If
Next
'結果出力
mySort = ary(0, 0)
End Function

エラー処理を加える必要があるかも・・条件も要考察
どの様に使うか分からないのでファンクション(2次元配列)にしました
    • good
    • 1

No.3です。



>○○○会議_4.xlsm、○○○会議_12.xlsmがあった場合

この○○○は同じ会議名でしょうか?
それとも異なる会議名(同一問題についての会議議事録ではない?)でしょうか?
あと数字については会議名が異なっていても同じ数字が存在しますか?
    • good
    • 0
この回答へのお礼

ファイル名は○○○会議□□□_4.xlsmになります....始まりの○○○会議までは一緒ですが、□□□が異なります。同じ数字はありません。

お礼日時:2022/10/12 12:53

>ファイルを昇順に並べた時に一番上に来る



『何?』を取得したいのでしょう?
そもそも複数あるって事はファイル名は違いますけど、単なるナンバリングと言うより『会議の内容(題目)?』『会議の開催日付?』・・・が『会議』に連結していると思います。
そこを記載した方が宜しいのかも。
    • good
    • 0
この回答へのお礼

ありがとうございます。説明不足ですみません。ファイル名を取得したいです。○○○会議_4.xlsm、○○○会議_12.xlsmがあった場合、数字が小さい○○○会議_4.xlsm をファイル名として取得したいです。

お礼日時:2022/10/12 11:30

2会議.xlsx


10会議.xlsx
上記の2つのファイルがあった場合、
10会議.xlsxを取得することになりますが、それであってますか。
(会議の前の文字"2","10"を数値としてソートはできません。文字列としてソートすることになります)
    • good
    • 0
この回答へのお礼

ありがとうございます。○○○○○会議_2.xlsm、○○○○○会議_10.xlsmがあった場合、数字が小さい○○○○○会議_2.xlsmを取得したいです。

お礼日時:2022/10/12 11:26

おはようございます。



1つの方法になりますが、シートに書き出して、シート上で並べ替えるのは、どうでしょうか? 比較的簡単かと思います。

ファイル名は、Split関数で\を使って、ファイル名を取得する方法。
https://happy-tenshoku.com/post-1777/
    • good
    • 0
この回答へのお礼

ありがとうございます。シートに書き出しですね。検討します。

お礼日時:2022/10/12 11:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!