2016-08-24 5 views
1

Excelファイル内の特定の変数を特定する必要があるユーザーと協力しています。現在、私が働いている人には、Excel文書が入っているフォルダやサブフォルダがたくさんあります。彼はフォルダ内でサブフォルダを探すVBAコードを使用しているので、パスウェイを返し、サブフォルダへのハイパーリンクを作成します(これは以下の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 

これは素晴らしいですが、私はより良い方法がなければならない知っています。どのようにして、このコードを操作して、フォルダ内に含まれるサブフォルダ内のA)またはB)内にある任意のExcelファイルのCOLUMN HEADERSを返すことができます。私はこれらをExcelスプレッドシートに戻して、100を超えるExcel文書を開く必要はなく、これだけを開いて、さらに調査が必要なExcelスプレッドシートを特定し、残りの部分を無視できるようにします。

+3

ループを展開し、見つかった各ブックを開くのは比較的簡単です。あなたがしなければならない決定は次の通りです。a)ブック内の列ヘッダーはどこですか?1枚、複数枚、すべてのシート? b)これらのシートのそれぞれにあるヘッダー(行1または他の行)はどの行ですか?確かに可能です...これらのアイデアの周りを検索し、いくつかのコードをまとめて、戻って来て、あなたが何をしたのかについていくつか質問してください。 – PeterT

+0

これをAccess DBにする方が良いかもしれないようです。これはExcelが実際に構築しているものではありません。つまり、特定のヘッダーを取得するためにすべての処理を行わなければならない理由を見つけ出すと、より良い解決策が見つかるでしょう。例:列がファイルごとに同じでない場合は、フォルダの場所からパターンを見つけることができますか?一部のファイルで列を標準化して空白にすることはできますか? – TesseractE

+0

Excel 2010以降では、Excelクエリを使用して、Excelのファイルを開くことなく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の形式になりますが、必要に応じて調整することができます。

関連する問題