使用VBA从Excel文件检索列标题

使用VBA从Excel文件检索列标题,vba,excel,Vba,Excel,我和一个必须在excel文件中识别某些变量的人一起工作。目前,我的同事有很多文件夹和子文件夹,其中包含Excel文档。他使用VBA代码在文件夹中查找子文件夹,然后返回路径,然后创建子文件夹的超链接(这不是下面VBA代码的一部分),并查看其中的所有excel文件,无论主文件夹中的子文件夹级别如何 代码如下: Sub GetFolders() Dim path As String Dim folder As String Dim row As Integer path = "your d

我和一个必须在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
Sub-GetFolders()
将路径设置为字符串
将文件夹设置为字符串
将行设置为整数
path=“此处是您的目录”
folder=Dir(路径,vbDirectory)
行=1
在文件夹“”中执行操作
如果(GetAttr(路径和文件夹)和vbDirectory)=vbDirectory,则
单元格(行,1)=路径和文件夹
行=行+1
如果结束
folder=Dir()
环
端接头

这很好,但我知道必须有更好的方法。如何操作此代码以返回A)在文件夹中找到的任何excel文件的列标题,或B)在文件夹中包含的子文件夹中找到的任何excel文件的列标题。我希望将这些文件返回到excel电子表格中,这样就不需要打开100个excel文档,而只需打开这一个,然后我们就可以确定需要进一步调查的任何excel电子表格,并忽略其余部分。

您可以使用ADO查询它们(根据需要调整连接字符串):

然后对找到的每个文件这样调用:

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

请注意,这假设您不知道图纸名称,并且需要获取所有图纸的标题。输出数组中的字符串将采用
表$Field
的形式,但可以根据需要进行调整。

您可以使用ADO查询它们(根据需要调整连接字符串):

然后对找到的每个文件这样调用:

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

请注意,这假设您不知道图纸名称,并且需要获取所有图纸的标题。输出数组中的字符串将采用
表$Field
的形式,但这可以根据需要进行调整。

由于ADODB的限制,列标题中的单元格限制为255个字符。

由于ADODB的限制,列标题中的单元格限制为255个字符。

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