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

リストボックスにフォルダ名を表示させるマクロを作成しました。
すると、フォルダ名の他にExcelファイルも表示されてしまいます。
下記マクロの’ファイルが見つからなくなるまで繰り返す に「該当の
Excelファイル名」を入れれば表示されなくなることは分かるのですが、該当のExcelファイル名が固定とは限らないので、「Excelファイル(.xlsm)ならどのようなファイル名であっても表示させない」といったようにしたいです。
どのようにすれば良いかご教授いただけないでしょうか?

作成したマクロ↓
Private Sub UserForm_Initialize()

Dim S_folderPath As String '該当のフォルダ=このブックと同じフォルダ
Dim FileName As String

Me.TextBox1 = ThisWorkbook.Path & "\"
S_folderPath = Me.TextBox1.Text

UserForm1.Caption = "フォルダ名を選択して下さい"
'ファイル名(フォルダ名)の取得
FolderName = Dir(S_folderPath, vbDirectory) '←リストボックスに表示させるフォルダ名

'ファイルが見つからなくなるまで繰り返す
Do While FolderName <> ""
If FolderName <> "." And FolderName <> ".." Then
ListBox1.AddItem FolderName
End If
FolderName = Dir()
Loop

End Sub

A 回答 (3件)

this〜で自分のファイル名を取得できます。


表示させる前に、それを除外すればいい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
開いている自分のファイル以外にもExcelファイルが入る場合がありまして、、、
自分のファイル名のみで済む場合はそちらの方法を試したいと思います。

お礼日時:2021/01/13 13:43

以下のようにしてください。



If FolderName <> "." And FolderName <> ".." And LCase(Right(FolderName, 5)) <> ".xlsm" Then

FileSystemObjectを使用すると、指定フォルダ内のすべてのサブフォルダ
を簡単に取得できます。(.とか..とか、及び他のファイルを最初から除いて取得できますので、提示された例のようにそれらをはじく必要がありません)
以下サンプルです。
s_folderpathにあなたが取得したい指定フォルダを記述してください。
イミデイとウインドウに結果が表示されます。

Public Sub 指定フォルダ内の全サブフォルダ取得()
Dim wFSO As Object
Dim wfolder As Object
Dim wfolders As Object
Dim disp_folder As Object
Dim s_folderpath As String
Set wFSO = CreateObject("Scripting.FileSystemObject")
s_folderpath = "d:\goo\excel\goo番外"
Set wfolder = wFSO.GetFolder(s_folderpath)
Set wfolders = wfolder.SubFolders
For Each disp_folder In wfolders
Debug.Print disp_folder.name
Next

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
FileSystemObjectを用いれば指定しないで済むのでよさそうですね。そちらの方法も試してみます。
また、LCase(Right(FolderName, 5))はどのような意味か教えていただくことはできますでしょうか?インターネットで検索しましたが、回答が得られなかったので気になっています。

お礼日時:2021/01/13 13:41

>LCase(Right(FolderName, 5))



FolderNameの右側5桁が".xlsm"であるかを判定します。

FolderNameが"?????.xlsm"であれば、この条件にマッチします。(?は任意の文字)
但し、FolderNameが"?????.XLSM"のケースもマッチさせる必要があります。
まず、FolderNameの右側5文字を取り出します。
Right(FolderName, 5)がそれになります。
次に、その文字を強制的に小文字に変換します。(.XLSMは.xlsmに変換される)
LCase(対象となる文字)がそれになります。
そうすると、xlsmもXLSMも処理したことになります。

これは
dim name1 as String
dim name2 as String
name1 = Right(FolderName,5,1)
name2 = Lcase(name1)

if If FolderName <> "." And FolderName <> ".." And name2 <> ".xlsm" Then

としても同じ結果になります。
    • good
    • 0
この回答へのお礼

迅速かつとても分かりやすい回答をありがとうございます。
このようなLCase関数の使い方は初めてでしたので、参考になりました。
こちらも今後のコード作成に利用したいと思います。
本当にありがとうございました!!

お礼日時:2021/01/13 14:07

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