Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA获取扩展文件属性_Vba_File Attributes_Fso - Fatal编程技术网

使用VBA获取扩展文件属性

使用VBA获取扩展文件属性,vba,file-attributes,fso,Vba,File Attributes,Fso,尝试使用Excel VBA从磁盘上的文件捕获所有文件属性,包括扩展属性。能够让它在文件中循环并捕获基本属性(来自文件系统): 文件路径 文件名 文件大小 创建日期 上次访问的日期 上次修改日期 文件类型 还要捕获来自文件本身的扩展属性: 作者 关键词 评论 最后作者 类别 主题 以及在文件上单击鼠标右键时可见的其他属性 目标是创建文件服务器上所有文件的详细列表。您可以通过.BuiltInDocmementProperties获得该列表 例如: Public Sub PrintDocume

尝试使用Excel VBA从磁盘上的文件捕获所有文件属性,包括扩展属性。能够让它在文件中循环并捕获基本属性(来自文件系统):

  • 文件路径
  • 文件名
  • 文件大小
  • 创建日期
  • 上次访问的日期
  • 上次修改日期
  • 文件类型
还要捕获来自文件本身的扩展属性:

  • 作者
  • 关键词
  • 评论
  • 最后作者
  • 类别
  • 主题
以及在文件上单击鼠标右键时可见的其他属性


目标是创建文件服务器上所有文件的详细列表。

您可以通过
.BuiltInDocmementProperties
获得该列表

例如:

Public Sub PrintDocumentProperties()
    Dim oApp As New Excel.Application
    Dim oWB As Workbook
    Set oWB = ActiveWorkbook

    Dim title As String
    title = oWB.BuiltinDocumentProperties("Title")

    Dim lastauthor As String
    lastauthor = oWB.BuiltinDocumentProperties("Last Author")

    Debug.Print title
    Debug.Print lastauthor
End Sub
请参阅本页,了解您可以通过以下方式访问的所有字段:


如果您试图在客户端之外执行此操作(即关闭Excel并从.NET程序运行代码),则需要使用。

您说的是循环。。因此,如果您希望对dir而不是当前文档执行此操作

Dim sFile As Variant
Dim oShell: Set oShell = CreateObject("Shell.Application")
Dim oDir:   Set oDir = oShell.Namespace("c:\foo")

For Each sFile In oDir.Items
   Debug.Print oDir.GetDetailsOf(sFile, XXX) 
Next
其中XXX是一个属性列索引,例如Author为9。 要列出可用索引以供参考,可以将for循环替换为

for i = 0 To 40
   debug.? i, oDir.GetDetailsOf(oDir.Items, i)
Next
快速获取单个文件/属性:

Const PROP_COMPUTER As Long = 56

With CreateObject("Shell.Application").Namespace("C:\HOSTDIRECTORY")
    MsgBox .GetDetailsOf(.Items.Item("FILE.NAME"), PROP_COMPUTER)
End With

我终于能够满足我的需要

旧的投票代码不在windows 10系统上运行(至少不是我的)。下面引用的MS library链接提供了如何实现此功能的当前示例。我的示例将它们用于后期绑定

属性代码在我的计算机上是不同的,就像上面提到的人一样,大多数返回空白值,即使它们不是。我使用for循环遍历了所有这些内容,发现标题和主题仍然可以访问,这对于我的目的来说已经足够了

Private Sub MySubNamek()
Dim objShell  As Object 'Shell
Dim objFolder As Object 'Folder

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace("E:\MyFolder")

If (Not objFolder Is Nothing) Then
Dim objFolderItem As Object 'FolderItem
Set objFolderItem = objFolder.ParseName("Myfilename.txt")
        For i = 0 To 288
           szItem = objFolder.GetDetailsOf(objFolderItem, i)
           Debug.Print i & " - " & szItem
       Next
Set objFolderItem = Nothing
End If

Set objFolder = Nothing
Set objShell = Nothing
End Sub
幸运发现

如果调用时,
objFolderItem
为空

objFolder.GetDetailsOf(objFolderItem, i)
返回的字符串是属性的名称,而不是它的(未定义)值 e、 g.当
i=3
时,返回“修改日期”

对I的所有288个值执行此操作可以清楚地说明为什么大多数文件类型都会导致它返回空白
e、 g
i=175
是“水平分辨率”

我的问题不是很清楚。我正在尝试从磁盘上的文件捕获文件属性。看起来它正在从打开的文档中读取属性。如何从磁盘上的文件中获取属性?啊,它被标记为Excel VBA,所以我认为您希望从客户端内部执行此操作。对于客户端外部(即从磁盘读取),您将使用DSOFile.dll(我回答中的最后一段)。更改标记,因为这与Excel无关。另请参阅Microsoft站点:对于此处指导的内容,这有点过时。现在您可以使用288个属性。例如,文件版本271。更新for循环以查看它们。进一步更新:截至去年夏天(2017年)的某个时候,所有高于6的指数都是无效的,只返回空字符串。还有其他答案提供了OP的问题,并且它们是在一段时间前发布的。在发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答旧问题时。好的,我想我已经清楚了。旧的投票代码不在windows 10系统上运行(至少不是我的)。上面提到的参考MS library链接提供了如何实现此功能的当前示例。我的示例将它们用于后期绑定。请检查我的编辑-因此,我们应该删除注释以进行清理。请详细说明
objFolder.GetDetailsOf(objFolderItem, i)