アプリ版:「スタンプのみでお礼する」機能のリリースについて

EXCEL VBA初心者です。
以前こちら(https://oshiete.goo.ne.jp/qa/9377896.html)で更新日時の追加のご助言をいただき大変助かりました。
しかし、今度は最終更新者をわかるようにしてほしいと言われ、どうにか追加できないでしょうか…。

●「Excelでファイル階層表作成」(http://www.vector.co.jp/soft/winnt/util/se499921 …)というフリーソフトで指定フォルダの階層を取得しています。
●レジストリに書き込んだりするexeのインストールは不可
●サイズを表示する列の右隣に更新日時を追加したのでその右隣へ追加したいです。
重ね重ね頼ってばかりで申し訳ありませんが、どうぞよろしくお願いいたします。

A 回答 (4件)

No2です。


最終更新者が取得できるのは、excel,word等のoffice関連のファイルになります。
それ以外のファイルは取得できません。
excel,word等のファイルから最終更新者を取得する場合、GetObjectを呼び出しますが、これは
execl,wordファイルをオプーン、クローズするのと同じ程度の時間がかかります。
もし、100個のexecl又はwordファイルがあれば、オプーン、クローズを100回行ったのと同じ程度の時間がかかります。
又、excel,word以外のファイルに対してGetObjectの呼び出しを行った場合は、エラーになり、最終更新者を取得できません。その為、最初にファイルの拡張子を見て、GetObjectの呼び出しを行うか否かを判断するようにします。
又、GetObjectの呼び出し対象ファイルが新しいバージョンのファイル(.xlsx,xlsm等)の場合、
古いexcel(excel2003以前)で、このマクロを呼び出すと、ファイルのコンバージョンが発生します。
この事態を回避するためには、excel2007以降で、このマクロを使用するか、
古いexcel(excel2003以前)で、このマクロを使用する場合は、新しいバージョンのファイルを最終更新者の取得対象外にする必要があります。
そうした事情を踏まえて、以下の仕様でもよろしければ、修正したソースを提示することは可能です。

1.最終更新者を表示できるのはexecl,word関連のファイルのみとする。
(拡張子がxls,xlsx,xlsm,doc,docxのみとする。拡張子の追加はソースの修正で簡単に追加可能)
上記以外のファイルは、最終更新者欄は空白で表示する。
2.exel,word関連のファイルの最終更新者の取得は時間がかかるため、既存の「Excelでファイル階層表.xls」に比べて処理時間が劇的に遅くなる。
3.excel2007以降で、このマクロを使用することを推奨する。
もし、古いexcel(excel2003以前)で、このマクロを使用する場合は、ソースから拡張子(xlsx,xlsm)を削除して使用する必要がある。

上記仕様で問題ないか依頼者にご確認をお願いします。
    • good
    • 0
この回答へのお礼

ひとまとめでのお礼で失礼いたします。
たくさんのご回答をいただきありがとうございました。
No2で教えて頂いたVBAマクロで試してみましたが、こちらの回答でおっしゃっている通り開いては閉じ…とやっているものでした。
取得はできるものの、大量のファイルがあるため断念致しました。
色々と教えていただきましてありがとうございます。

お礼日時:2016/09/13 19:21

>今度は最終更新者をわかるようにしてほしいと言われ、


AtiveWorkbook.BuiltinDocumentProperties("Last Author")
と外部的に取り出すのと比較してみましたが、なぜか、内部(ファイルを開いて)から取り出す場合は、エラーが発生するものがあります。Attribute とかチェックしたのですが、それとは違うようです。

ここはExcelだけですので問題ないようですが、私の記憶では、Word のプロパティを取るのが厄介だったはずです。また、取れるものと取れないものがあるのは承知で行っててください。

Excelだけでしたら、 fName = Dir(mFolder & "*.xls?", vbNormal)
です。リストの適当の列に、これを加えればよいです。

'//
Sub GetAuthor()
 'Object等は、型の宣言ができないものがある。
 Dim oShell, oFolder, buf As String
 Dim mFolder, fName
 Dim i As Long, ret As String
 
 mFolder = "C:\Temp\Test1\"  '末尾に\を入れてください。
 Set oShell = CreateObject("Shell.Application")
 Set oFolder = oShell.Namespace(mFolder)
 
 Cells(1, 1).Value = "ファイル名"
 Cells(1, 2).Value = "Author"
 i = 2
 Application.ScreenUpdating = False
 fName = Dir(mFolder & "*.*", vbNormal)
 Do While fName <> ""
  If fName <> "." And fName <> ".." Then
    Cells(i, 1).Value = fName  '1列目
    ret = oFolder.GetDetailsOf(oFolder.ParseName(fName), 20)
    Cells(i, 2).Value = ret  '2列目
    i = i + 1
  End If
  fName = Dir
 Loop
 Application.ScreenUpdating = True
 Set oFolder = Nothing
 Set oShell = Nothing
End Sub

'//
試してみましたが、BuiltinDocumentPropertie と、Last Auther は一致しているようです。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます。
頂いたこちらのコードで試してみましたが、エラーが返ってきてしまいました…。。。
教えて頂いたのに使いこなせなくて大変申し訳ないです…。
EXCELとWordが多くあるので、やってみたのですが…。
もっと勉強してやってみます。ありがとうございました。

お礼日時:2016/09/13 19:24

No1です。


若干、うそが混じっていました。
office関連のファイル(excel,word等)に限って言えば、
vbaの obj.BuiltinDocumentProperties(7)
を使用して最終更新者が取得できるようです。下記参照
http://excel-ubara.com/excelvba4/EXCEL256.html

ファイル一覧に表示しているのは、excel,word関連のファイルですか?
それとも、テキストファイルとかの上記以外のファイルでしょうか。
もし、excel,word関連のファイル限定でよいなら、できるかもしれません。
    • good
    • 0

残念な話ですが、簡単にはできません。


>「Excelでファイル階層表作成」(http://www.vector.co.jp/soft/winnt/util/se499921 …)というフリーソフトで指定フ>ォルダの階層を取得しています。
ということですが、これは、excel vba でFileオブジェクトを使用しています。(下記参照)
http://officetanaka.net/excel/vba/filesystemobje …
この情報の中に、「最終更新者」の情報はありません。ないものを出力することはできません。
エクスプローラで何がしかのファイルのプロパティを確認していただければわかりますが、ここにも「最終更新者」の情報は
ありません。
従って、結論はできませんになります。
もしかして、あなたが、いわれる、「最終更新者」とは、excelファイル(.xls,xlsx)とかwordファイル(.doc,docx)とかを
wordもしくはexeclで開いたときにユーザー情報のようなもののことをいってますか?
そうであれば、(APIを駆使すればもしかすればできるかもしれないが)、簡単な改造ではできません。理由は前述のとおりです。)
あなたが、とるべき対策は、現行のvbaで扱っているには、Fileオブジェクトの情報に「最終更新者」の情報がないので
できませんと依頼されたかたに説明することです。
(エクスプローラで何がしかのファイルのプロパティを表示し、確認していただくことも必要かもしれません)
    • good
    • 0

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