vba - 如何获取工作簿文件的 "Last Saved By"属性

标签 vba excel file winapi

在 Windows 资源管理器中,如果我右键单击一个文件并选择“属性”以获取该文件的“属性”窗口,然后选择“详细信息”选项卡,则会列出一个名为“上次保存者”的属性。好像是上次修改文件时登录的Windows帐户名。

我查看了 FileSystemObject,但没有看到 File 对象具有这样的属性。

如何在 VBA 中获取该属性?有 Windows API 吗?

更新:

该线程中有 3 次尝试使用 Shell 的 GetDetailsOf 来完成此操作。我很欣赏这种努力,但在尝试了所有方法(尤其是 OssieMac 的代码示例)后,我似乎很清楚,在 GetDetailsOf 中找不到存储在文件系统的“最后保存者”字段中的文本。

挠我的头。 Windows 资源管理器是如何做到的?

最佳答案

试试这个 - 代码使用 BuiltinDocumentProperties类:

Option Explicit

Sub Test()
    MsgBox LastAuthor
End Sub

Function LastAuthor() As String
    LastAuthor = ThisWorkbook.BuiltinDocumentProperties("Last Author")
End Function

编辑

使用扩展文件属性 - Microsoft报告Author 的魔数(Magic Number)是9。然而,这个数字随着 Windows 版本的推移而变化,自 Vista 以来一直是 20 - 请参阅 this link 。为了进一步进行一些测试,您还可以尝试适用于 Windows 10 的 10

Option Explicit

Sub Test()

    Dim varPath As Variant
    Dim varFileName As Variant

    varPath = "C:\Users\foo\bar\" '<~~ ensure final \
    varFileName = "lol.xlsx"


    'depending on OS version, try 9, 10 and 20
    Debug.Print GetAuthorFromShell(varPath, varFileName, 9)
    Debug.Print GetAuthorFromShell(varPath, varFileName, 10)
    Debug.Print GetAuthorFromShell(varPath, varFileName, 20)

End Sub

Function GetAuthorFromShell(varPath As Variant, varFileName As Variant, intProperty As Integer) As String

    Dim objShell As Object
    Dim objFolder As Object
    Dim strAuthor As String

    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(varPath) 

    With objFolder
        strAuthor = .getdetailsof(.Items.Item(varFileName), intProperty)
    End With

    GetAuthorFromShell = strAuthor

End Function

关于vba - 如何获取工作簿文件的 "Last Saved By"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275072/

相关文章:

c# - 在 C# 中将数据集导入 Excel 时无法文件位置?

android - 使用我的应用程序从 html 文件读取数据的简单方法?

c - 搜索文件夹会显示内部和外部的所有内容

java - 基于行/ token 的处理 (java)

excel - 在单个按钮中运行功能的程序(1 个功能 = 1 次单击)

HTML 表单不会提交,可能是表单验证问题

excel - 将公式复制到整个列表

vba - Excel VBA 多个循环与循环内的变量

Excel VBA - 选择动态单元格区域

excel - 将新标签页复制并粘贴到 MSForms.Page 中