【问题标题】:Using VBA to retrieve Column Headers from Excel files使用 VBA 从 Excel 文件中检索列标题
【发布时间】:2016-08-24 20:49:02
【问题描述】:

我正在与必须在 excel 文件中识别某些变量的人合作。目前,与我一起工作的人有很多文件夹和子文件夹,其中包含 Excel 文档。他正在使用 VBA 代码在文件夹中查找子文件夹,然后返回路径,然后创建指向子文件夹的超链接(这不是下面 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 电子表格并忽略其余的。

【问题讨论】:

  • 展开循环并打开找到的每个工作簿相对简单。您必须做出的决定是 a) 该工作簿中的列标题在哪里 - 只有一张、多张、所有工作表? b) 每张纸上的标题位于哪一行 - 第 1 行或其他行?这当然是可能的......搜索这些想法并整理一些代码,然后回来问一些关于你所做的事情的问题。
  • 听起来你最好把它变成一个 Access DB。这不是 Excel 真正构建的类型。也就是说,找出为什么您必须通过所有这些来检索这些特定标头可能会帮助我们找到更好的解决方案。例如:如果文件与文件的列不同,是否有可以从文件夹位置找到的模式?列是否可以标准化并在某些文件中留空?
  • Excel 2010及以上版本可以使用Power Query查询文件夹中excel文件的列标题,无需打开
  • @slai - 您可以通过 ADO 在任何版本的 Excel 中执行相同的操作:Recordset.Fields(foo).Name
  • @Comintern 今天我确实学到了一些新东西并且非常有用。感谢您发布带有代码的完整答案。我一定会为这个添加书签! (+1) 我这边!很棒的东西。

标签: vba excel


【解决方案1】:

您可以使用 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,但可以根据需要进行调整。

【讨论】:

    【解决方案2】:

    由于 ADODB 的限制,col 标头中的单元格仅限于 255 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多