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

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

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

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

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

2回答

2269閲覧

vbaでオフィスファイルのプロパティのコメント取得、一部の拡張子を含むファイルの除外(小文字か大文字どちらかに変換して除外)

gaint

総合スコア4

VBA

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

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

0クリップ

投稿2021/12/27 15:58

vbaでオフィスファイル(wordやexcel)などのプロパティからコメントを取得する方法がさっぱりわからず、質問させていただきました。設計書にはbuiltindocumentpropertiesを使ってオフィスファイルからコメントを取得するようにかいてあったので、builtindocumentpropertiesを使ってコメントを取得したいです。

また、拡張子、ファイル名がtmp、temp、bk、bakを含むファイルを大文字または小文字どちらの場合でも除外できる方法も知りたいです。ifのネストで記述していたのですがこれだと可読性が低くなるというご指摘がありました。ifのネスト以外でファイル名や拡張子を判定する処理をfunctionプロシージャを使って処理したいです。

お手数をおかけして申し訳ございませんがわかる方よろしくお願いします。

vba

1Option Explicit 2Sub サブフォルダ含むファイルデータ取得() 3 Dim intIchi As Integer 4 Dim strPath As String 5 6 intIchi = 2 '開始行 7 8 strPath = Worksheets("保管場所").Range("B3").Value 'ファイルパス取得 9 10 Sheets("ファイル一覧").Select    ’シート選択 11 12 Call ファイル名取得(strPath, intIchi) 13 Call 空欄削除 14 Call 連番挿入 15End Sub 16 17Sub ファイル名取得(strPath As String, intIchi As Integer) 18 Dim objFSO As Object, objFile As Object, objsubFolder 'オブジェクト定義 19 Dim intIchi As Integer 20 Dim strPath As String 21 Dim vntpos As Variant 22 Dim vntfolderpathcontainer As Variant 23 Dim vntfolderpathcontainer2 As Variant 24 25 Set objFSO = CreateObject("Scripting.FileSystemObject") 'インスタンスの作成 26 27 For Each objFile In objFSO.GetFolder(strPath).Files 28 vntpos = InStrRev(objFile.Path, "\")    ’ファイルパス検索 29 vntfolderpathcontainer = Left(objFile.Path, vntpos - 1)    ’フォルダパス切り出し 30 vntpos = InStrRev(vntfolderpathcontainer, "\")    ’フォルダパス検索 31 vntfolderpathcontainer2 = Mid(vntfolderpathcontainer, vntpos + 1)    ’フォルダ切り出し 32 Worksheets("ファイル一覧").Cells(intIchi, 1) = objFSO.GetBaseName(objFile.Path) '拡張子なしのファイル名 33 Worksheets("ファイル一覧").Cells(intIchi, 2) = objFile.DateCreated 'ファイル作成日 34 Worksheets("ファイル一覧").Cells(intIchi, 3) = objFile.DateLastModified 'ファイル更新日 35 Worksheets("ファイル一覧").Cells(intIchi, 4) = "" 'コメント 36 Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(intIchi, 5), Address:=objFile.Path, TextToDisplay:=objFile.Name 'ファイル名ハイパーリンク 37 Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(intIchi, 6), Address:=strPath, TextToDisplay:=vntfolderpathcontainer2 'フォルダ名ハイパーリンク 38 intIchi = intIchi + 1 39 Next 40 41 For Each objsubFolder In objFSO.GetFolder(strPath).SubFolders 42 Call ファイル名取得(objsubFolder.Path, intIchi) 43 Next 44 45 Set objFSO = Nothing 46 Set objsubFolder = Nothing 47 Set objFile = Nothing 48End Sub 49 50Sub 空欄削除() 51 Dim ListLastRow As Long 52 Dim DeleteRows As Range 53 Dim ws As Worksheet 54 Dim i As Long 55 56 57 Set ws = Worksheets("ファイル一覧") '対象シート 58 ListLastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row 'A列を見て最終行を取得 59 60 61 For i = 2 To ListLastRow '2行目から探査 62 If IsEmpty(ws.Cells(i, 1)) Then 'Rangeに削除対象行を格納 63 If DeleteRows Is Nothing Then 64 Set DeleteRows = ws.Rows(i).EntireRow 65 Else 66 Set DeleteRows = Union(DeleteRows, ws.Rows(i).EntireRow) 67 End If 68 End If 69 Next 70 71 72 If Not DeleteRows Is Nothing Then DeleteRows.Delete '削除対象行が1つでもあれば行削除を実施 73 74End Sub 75 76Sub 連番挿入() 77 Dim ListLastRow As Long 78 Dim i As Long 79 Dim number As Long 80 Dim ws As Worksheet 81 82 Columns("A").Insert 83 number = 1 84 Set ws = Worksheets("ファイル一覧") 85 86 ListLastRow = ws.Range("B2").End(xlDown).Row 87 88 For i = 2 To ListLastRow 89 Cells(i, 1) = number 90 number = number + 1 91 Next 92End Sub 93

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

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

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

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

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

y_waiwai

2021/12/28 00:13

どこのどういうプロパティからどんなコメントを削除するんでしょうか。 問題が見えません
gaint

2021/12/28 03:11

ファイルを右クリックしたらプロパティという欄が表示されるかと思いますがそこの詳細タブのコメントの欄に書かれている文字列を取得したいです。 わかりにくく申し訳ございません。
guest

回答2

0

ベストアンサー

GetObjectで取得したオブジェクトのBuiltinDocumentPropertiesを参照すれば、コメントが取得できます。
GetObjectであれば、ファイルの種類に依存せず、コメントが取得可能になります。
GetObject実行時、その対象ファイルがexcel関連のファイルなら(.xlsx等)オープンされ、その内容が画面に
表示されます。
この表示を抑止するために、Application.ScreenUpdating = Falseを実行しておきます。

又「また、拡張子、ファイル名がtmp、temp、bk、bakを含むファイルを大文字または小文字どちらの場合でも除外できる方法も知りたいです。」については、IsJogaiのファンクションプロシージャを作成しました。
除外対象ならtrueを返します。したがって、結果がfalseの場合、処理をすれば良いことになります。

VBA

1Option Explicit 2 3Sub サブフォルダ含むファイルデータ取得() 4 Dim intIchi As Integer 5 Dim strPath As String 6 7 intIchi = 2 '開始行 8 9 strPath = Worksheets("保管場所").Range("B3").Value 'ファイルパス取得 10 11 Sheets("ファイル一覧").Select 'シート選択 12 Application.ScreenUpdating = False '画面表示抑止 13 14 Call ファイル名取得(strPath, intIchi) 15 Call 空欄削除 16 Call 連番挿入 17 Application.ScreenUpdating = True '画面表示抑止解除 18End Sub 19 20Sub ファイル名取得(strPath As String, intIchi As Integer) 21 Dim objFSO As Object, objFile As Object, objsubFolder 'オブジェクト定義 22'Dim intIchi As Integer '2重定義なので削除 23'Dim strPath As String '2重定義なので削除 24 Dim vntpos As Variant 25 Dim vntfolderpathcontainer As Variant 26 Dim vntfolderpathcontainer2 As Variant 27 28 Set objFSO = CreateObject("Scripting.FileSystemObject") 'インスタンスの作成 29 30 For Each objFile In objFSO.GetFolder(strPath).Files 31 If IsJogai(objFile.name) = False Then 32 vntpos = InStrRev(objFile.path, "\") 'ファイルパス検索 33 vntfolderpathcontainer = Left(objFile.path, vntpos - 1) 'フォルダパス切り出し 34 vntpos = InStrRev(vntfolderpathcontainer, "\") 'フォルダパス検索 35 vntfolderpathcontainer2 = Mid(vntfolderpathcontainer, vntpos + 1) 'フォルダ切り出し 36 Worksheets("ファイル一覧").Cells(intIchi, 1) = objFSO.GetBaseName(objFile.path) '拡張子なしのファイル名 37 Worksheets("ファイル一覧").Cells(intIchi, 2) = objFile.DateCreated 'ファイル作成日 38 Worksheets("ファイル一覧").Cells(intIchi, 3) = objFile.DateLastModified 'ファイル更新日 39 Worksheets("ファイル一覧").Cells(intIchi, 4) = getComment(objFile.path) 'コメント 40 Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(intIchi, 5), Address:=objFile.path, TextToDisplay:=objFile.name 'ファイル名ハイパーリンク 41 Worksheets("ファイル一覧").Hyperlinks.Add Anchor:=Cells(intIchi, 6), Address:=strPath, TextToDisplay:=vntfolderpathcontainer2 'フォルダ名ハイパーリンク 42 intIchi = intIchi + 1 43 End If 44 Next 45 46 For Each objsubFolder In objFSO.GetFolder(strPath).SubFolders 47 Call ファイル名取得(objsubFolder.path, intIchi) 48 Next 49 50 Set objFSO = Nothing 51 Set objsubFolder = Nothing 52 Set objFile = Nothing 53End Sub 54 55Sub 空欄削除() 56 Dim ListLastRow As Long 57 Dim DeleteRows As Range 58 Dim ws As Worksheet 59 Dim i As Long 60 61 62 Set ws = Worksheets("ファイル一覧") '対象シート 63 ListLastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row 'A列を見て最終行を取得 64 65 66 For i = 2 To ListLastRow '2行目から探査 67 If IsEmpty(ws.Cells(i, 1)) Then 'Rangeに削除対象行を格納 68 If DeleteRows Is Nothing Then 69 Set DeleteRows = ws.Rows(i).EntireRow 70 Else 71 Set DeleteRows = Union(DeleteRows, ws.Rows(i).EntireRow) 72 End If 73 End If 74 Next 75 76 77 If Not DeleteRows Is Nothing Then DeleteRows.Delete '削除対象行が1つでもあれば行削除を実施 78 79End Sub 80 81Sub 連番挿入() 82 Dim ListLastRow As Long 83 Dim i As Long 84 Dim number As Long 85 Dim ws As Worksheet 86 87 Columns("A").Insert 88 number = 1 89 Set ws = Worksheets("ファイル一覧") 90 91 ListLastRow = ws.Range("B2").End(xlDown).Row 92 93 For i = 2 To ListLastRow 94 Cells(i, 1) = number 95 number = number + 1 96 Next 97End Sub 98 99Private Function getComment(ByVal path As String) As String 100 Dim obj As Object 101 On Error GoTo ERR99 102 Set obj = GetObject(path) 103 getComment = obj.BuiltinDocumentProperties("Comments") 104 obj.Close False 105ERR99: 106End Function 107 108Function IsJogai(ByVal File_name As String) As Boolean 109 Dim names As Variant 110 Dim name As Variant 111 IsJogai = True 112 names = Array("tmp", "temp", "bk", "bak") 113 For Each name In names 114 If InStr(LCase(File_name), LCase(name)) > 0 Then 115 Exit Function 116 End If 117 Next 118 IsJogai = False 119End Function 120 121

投稿2021/12/29 03:09

tatsu99

総合スコア5493

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

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

0

BuiltinDocumentPropertiesを使ってやるのはどうかと思うのですが使ってやるのであれば

VBA

1 Dim objBook As Workbook 2 Set objBook = Workbooks.Open("パス") 3 Debug.Print objBook.BuiltinDocumentProperties.Item("Comments").Value

で、Excelであればコメントは取れるみたいですね。
Wordに関しても、同様な形でコメントは取れるようです。

VBA

1 Dim objWordApp As Object 2 Dim objDocument As Object 3 Set objWordApp = CreateObject("Word.Application") 4 Set objDocument = objWordApp.Documents.Open("パス") 5 Debug.Print objDocument.BuiltinDocumentProperties.Item("Comments").Value 6 objDocument.Close 7 objWordApp.Quit

PowerPointとかでも取れるんじゃないかなあと思いますが
同じようにファイルを開く必要があるので処理は遅くなりそうですね。

あと一部のファイルを除くという所ですがVBScript.RegExpを使えば一応そんなにif文は使わなくていいですね。

VBA

1 Dim objRegExp As Object 2 Set objRegExp = CreateObject("VBScript.RegExp") 3 objRegExp.Pattern = "tmp|temp|bk|bak" 4 5 If Not objRegExp.test(LCase("ファイル名")) Then 6 ' ここに入ってくるのが処理対象 7 End If 8

VBScript.RegExpを使わないなら、配列でArray("tmp","temp","bk","bak")として
ループでLikeで処理して判定でも出来そうですね。

投稿2021/12/28 02:05

xail2222

総合スコア1508

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問