2016-08-24 105 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的形式,但可以根据需要进行调整。