2016-08-24 28 views
1

我正在與某個必須在excel文件中標識某些變量的人一起工作。目前,我正在使用的人有大量的文件夾和子文件夾,其中包含Excel文檔。他使用的VBA代碼在一個文件夾中查找子文件夾,然後返回該路徑,然後創建超鏈接到子文件夾(這不是下面的VBA代碼的一部分)並查看所有的excel文件,無論主文件夾內的子文件夾的級別如何。使用VBA從Excel文件中檢索列標題

下面的代碼:

Sub GetFolders() 
Dim path As String 
Dim folder As String 
Dim row As Integer 


path = "your directory here" 
folder = Dir(path, vbDirectory) 
row = 1 

Do While folder <> "" 
If (GetAttr(path & folder) And vbDirectory) = vbDirectory Then 
    Cells(row, 1) = path & folder 
    row = row + 1 
End If 
folder = Dir() 
Loop 

End Sub 

這是偉大的,但我知道必須有一個更好的辦法。我該如何處理這段代碼,才能返回文件夾中找到的任何Excel文件的COLUMN HEADERS A)或文件夾中包含的子文件夾內的B)。我希望將這些數據返回到Excel電子表格中,以便不需要打開100個Excel文檔,而只需要打開這個文檔,然後我們就可以識別出需要進一步調查並忽略其餘部分的任何Excel電子表格。

+3

擴展您所擁有的循環並打開找到的每個工作簿都是相對直接的。您必須做出的決定是a)該工作簿中的列標題在哪裏 - 只有一張紙,多張紙,所有紙張? b)這些表中的每一頁上的標題是哪一行 - 第1行還是其他行?當然可以...搜索這些想法並將一些代碼放在一起,然後回過頭來問一些你所做的事情。 – PeterT

+0

它聽起來像你可能會更好地把它變成一個Access數據庫。這不是Excel真正爲其構建的類型。這就是說,找出爲什麼你必須通過所有的檢索這些特定的標題可能會幫助我們找到更好的解決方案。例如:如果文件之間的列不相同,是否有可以從文件夾位置找到的模式?列可以標準化並在一些文件中保留空白嗎? – TesseractE

+0

使用Excel 2010或更高版本,您可以使用Power Query查詢文件夾中excel文件的列標題,而無需打開它們 – Slai

回答

3

你可以用ADO查詢它們(根據需要調整連接字符串):

'Requires reference to Microsoft ActiveX Data Objects #.# Library 
Private Function GetHeaders(filepath As String) As String() 
    Dim output() As String 
    Dim ado As New ADODB.Connection 
    output = Split(vbNullString) 

    With ado 
     .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & filepath & "';" & _ 
       "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;"";" 
     With .OpenSchema(adSchemaTables) 
      Dim table As String 
      Dim columns As ADODB.Recordset 
      Do While Not .EOF 
       table = .Fields("TABLE_NAME") 
       Set columns = ado.OpenSchema(adSchemaColumns, Array(Empty, Empty, table)) 
       With columns 
        Do While Not .EOF 
         ReDim Preserve output(UBound(output) + 1) 
         output(UBound(output)) = table & .Fields("COLUMN_NAME") 
         .MoveNext 
        Loop 
       End With 
       .MoveNext 
      Loop 
     End With 
    End With 
    GetHeaders = output 
End Function 

然後這樣稱呼它爲您找到的每個文件:

Sub Example() 
    Dim headers() As String 
    Dim i As Long 
    headers = GetHeaders("C:\Foo\Bar.xlsx") 
    For i = LBound(headers) To UBound(headers) 
     Debug.Print headers(i) 
    Next i 
End Sub 

請注意,這是假定你不知道表名並需要獲取標題全部其中。輸出數組中的字符串將採用Sheet$Field的形式,但可以根據需要進行調整。