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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

1464閲覧

vbaのFileSystemobjectでコメントの取得、フォルダ名の表示、一部のフォルダ名、ファイル名、拡張子の除外

gaint

総合スコア4

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/12/21 16:50

現在、excelのvbaでファイルリスト一覧を表示させるプログラムを作成しています。その際に、どのように実装したらよいかネットなどで調べてもわからないので質問させていただきました。当方プログラミング自体ほぼほぼ初心者で分かりやすく解説していただけると大変うれしいです。

実装したいこと

  • for each文のループ中のWorksheets("ファイル一覧").Cells(IRow, 5) = ""ここの""の処理にファイルプロパティからコメントの取得したい。
  • Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(IRow, 7), Address:=strPath, TextToDisplay:=(フォルダ名)ここの処理の()の部分でフォルダ名を表示させてたい。
  • ファイル一覧を表示させるのですがファイル名、フォルダ名、拡張子が以下の文字を含む場合は除外tmp,temp,bk,bak,~$, - コピー

ソースプログラムはこちらになります。

vba

1Option Explicit 2 3Public IRow As Variant 4Public number As Variant 5 6Sub サブフォルダを含むファイルデータを取得() 7 8 IRow = 1 9 number = 0 10 Sheets("ファイル一覧").Select 11 12 Call ファイル名取得("C:\Users\hi610\OneDrive\ドキュメント\temp") 13End Sub 14Sub ファイル名取得(strPath As Variant) 15 Dim FSO As Object, Folder As Object, File As Object, objDP As DocumentProperties 16 17 Set FSO = CreateObject("Scripting.FileSystemObject") 18 19 For Each File In FSO.GetFolder(strPath).Files 20 If Not number = 4 Then 21 IRow = IRow + 1 22 number = number + 1 23 Dim dps As DocumentProperties 24 Dim dp As DocumentProperty 25 Worksheets("ファイル一覧").Cells(IRow, 1).Value = number 26 Worksheets("ファイル一覧").Cells(IRow, 2) = FSO.GetBaseName(File.Path) 27 Worksheets("ファイル一覧").Cells(IRow, 3) = File.DateCreated 28 Worksheets("ファイル一覧").Cells(IRow, 4) = File.DateLastModified 29 Worksheets("ファイル一覧").Cells(IRow, 5) = "" 30 Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(IRow, 6), Address:=File.Path, TextToDisplay:=File.Name 31 Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(IRow, 7), Address:=strPath, TextToDisplay:=File.Path 32 Else 33 Exit For 34 End If 35 Next 36 37 For Each Folder In FSO.GetFolder(strPath).SubFolders 38 Call ファイル名取得(Folder) 39 Next 40 41 Set FSO = Nothing 42 Set Folder = Nothing 43 Set File = Nothing 44End Sub

自分で試したこと
フォルダ名を取得する処理ですがfor eachでfilesystemobjectのfilesプロパティを使用しているため、object.Nameではファイル名が表示されてしまう。なので二重ループにして(例:for each ~ .Folders)プロパティをフォルダ名を取得しようとしたがオブジェクトの参照ができなかった

一部の文字を除外することに関しましてはif not Like File.Name Like ".tmp" And File.Name "tmp."とfor each中にネストとしていったが処理が途中で終わってしまう。またこの場合、一部の文字を含むフォルダ名を除外する方法が検討もつかない。

ファイルプロパティからコメントを取得する方法は調べたがよくわからなかった。

現状このような感じです。誰かわかる方いらしたらご回答お願いします。

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

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

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

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

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

tatsu99

2021/12/22 08:26

If Not number = 4 Then この行の為、ファイルが4件しか出力されませんが、意図した動作でしょうか。
gaint

2021/12/22 10:03

設計者でレコードの6件目以降はファイル一覧を表示させないという記載があったためこのような処理をしています。
guest

回答2

0

ベストアンサー

ファイルプロパティのコメントの取得については、下記が参考になります。
コメント取得
Sub Sample8()が参考になります。

windows7での確認なので、参考程度にしてください。
出力件数に制約は設けていません。
コメントはFolder.GetDetailsOf(Folder.ParseName(File_name), 24)で取得しています。
24の数値は、Sub Sample9()を実行してコメント用の番号を取得しています。
コメントは普通のテキストファイルなどでは取得対象外となります。

VBA

1Option Explicit 2 3Public IRow As Variant 4Public number As Variant 5Public ws As Worksheet 6 7Sub サブフォルダを含むファイルデータを取得() 8 9 IRow = 1 10 number = 0 11 Dim maxrow As Long 12 Set ws = Worksheets("ファイル一覧") 13 maxrow = ws.Cells(Rows.Count, 1).End(xlUp).Row '最終行を求める 14 If maxrow > 1 Then 15 ws.Rows("2:" & maxrow).ClearContents 16 End If 17 18 Call ファイル名取得("C:\Users\hi610\OneDrive\ドキュメント\temp") 19End Sub 20Sub ファイル名取得(strPath As Variant) 21 Dim FSO As Object, Folder As Object, File As Object, objDP As DocumentProperties 22 23 Set FSO = CreateObject("Scripting.FileSystemObject") 24 25 For Each File In FSO.GetFolder(strPath).Files 26 If IsJogai(File.name) = False Then 27 IRow = IRow + 1 28 number = number + 1 29 Dim dps As DocumentProperties 30 Dim dp As DocumentProperty 31 ws.Cells(IRow, 1).Value = number 32 ws.Cells(IRow, 2) = FSO.GetBaseName(File.path) 33 ws.Cells(IRow, 3) = File.DateCreated 34 ws.Cells(IRow, 4) = File.DateLastModified 35 ws.Cells(IRow, 5) = getComment(strPath, File.name) 36 ws.Hyperlinks.Add Anchor:=Cells(IRow, 6), Address:=File.path, TextToDisplay:=File.name 37 ws.Hyperlinks.Add Anchor:=Cells(IRow, 7), Address:=strPath, TextToDisplay:=strPath 38 End If 39 Next 40 41 For Each Folder In FSO.GetFolder(strPath).SubFolders 42 Call ファイル名取得(Folder.path) 43 Next 44 45 Set FSO = Nothing 46 Set Folder = Nothing 47 Set File = Nothing 48End Sub 49 50Function getComment(ByVal path As String, ByVal File_name As String) 51 Dim Shell As Object 52 Dim Folder As Object 53 Set Shell = CreateObject("Shell.Application") 54 Set Folder = Shell.Namespace(path & "\") 55 getComment = Folder.GetDetailsOf(Folder.ParseName(File_name), 24) 56 Set Folder = Nothing 57 Set Shell = Nothing 58End Function 59 60Function IsJogai(ByVal File_name As String) As Boolean 61 Dim names As Variant 62 Dim name As Variant 63 IsJogai = True 64 names = Array("tmp", "temp", "bk", "bak", "~$", "- コピー") 65 For Each name In names 66 If InStr(LCase(File_name), LCase(name)) > 0 Then 67 Exit Function 68 End If 69 Next 70 IsJogai = False 71End Function 72

投稿2021/12/22 10:18

tatsu99

総合スコア5493

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

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

gaint

2021/12/22 10:30

コードまで丁寧に記述してくださりありがとうございます。実装してみます。
guest

0

ファイル名、フォルダ名、拡張子が一部の文字を含む場合の除外とハイパーリンクのフォルダ名の表示は自己解決できました。
ファイルプロパティのコメントの取得はまだできていないのでわかる方いましたらよろしくお願いします

投稿2021/12/22 10:08

gaint

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問