2011-04-13 139 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