2011-04-13 84 views
16

尝试使用Excel VBA从文件中捕获文件中的所有文件属性,包括扩展属性。之所以能够通过文件得到它的循环和捕捉的基本属性(即来自文件系统):使用VBA获取扩展文件属性

  • 文件路径
  • 文件名
  • 文件大小
  • 创建日期
  • 日期上次访问
  • 最后修改日期
  • 文件类型

还要捕捉来自文件本身的扩展属性:

  • 作者
  • 关键词
  • 评论
  • 最后作者
  • 类别
  • 主题

等支柱在右击文件时可见的副本。

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

回答

21

你说loop ..所以如果你想这样做的目录,而不是当前的文件;

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是attribure列索引,9作者例如。 要列出可供您参考的索引,您可以用for替换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 
+1

另请参阅Microsoft网站:http://technet.microsoft.com/en-us/library/ee176615.aspx – 2012-09-17 15:46:04

+2

对于这些指向的用户,这已经过时了一点。现在有288个属性可以使用。例如,文件版本271.更新for循环以查看全部。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx – TrialAndError 2013-07-25 14:25:15

+0

进一步更新:当某个过去的这个夏天(2017年)6以上所有指标都是无效,只返回空字符串。 – 2017-11-06 19:06:29

7

你可以通过.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 

你可以用这个访问的所有字段看到这个页面:http://msdn.microsoft.com/en-us/library/bb220896.aspx

如果你想做到这一点,客户端之外(即用Excel关闭,从.NET程序运行代码),则需要使用DSOFile.dll

+0

我的问题不是很清楚。我试图从磁盘上的文件捕获文件属性。这看起来像是从打开的文档中读取属性。我如何从磁盘上的文件获取属性? – 2011-04-13 16:35:57

+0

啊,它被标记为Excel-VBA,所以我认为你想从客户端内部做到这一点。对于客户端外部(即从磁盘读取),您可以使用DSOFile。dll(我答案中的最后一段)。 – 2011-04-13 17:07:33

+0

更改了标签,因为这与Excel无关。 – 2011-04-14 00:50:44

2
'vb.net 
'Extended file stributes 
'visual basic .net sample 

Dim sFile As Object 
     Dim oShell = CreateObject("Shell.Application") 
     Dim oDir = oShell.Namespace("c:\temp") 

     For i = 0 To 34 
      TextBox1.Text = TextBox1.Text & oDir.GetDetailsOf(oDir, i) & vbCrLf 
      For Each sFile In oDir.Items 
       TextBox1.Text = TextBox1.Text & oDir.GetDetailsOf(sFile, i) & vbCrLf 
      Next 
      TextBox1.Text = TextBox1.Text & vbCrLf 
     Next