web-dev-qa-db-ja.com

指定したフォルダー内のすべてのExcelファイルをループし、特定のセルからデータを取得するためのコード

データを取得する必要があるExcelブックが約50個あります。特定のセル、特定のワークシートからデータを取得し、1つのデータセット(できれば別のExcelワークブック)にコンパイルする必要があります。

コードの実行に使用しているワークブックに結果をコンパイルできるように、VBAを探しています。

したがって、データをプルする必要があるxlsまたはxlsxファイルの1つ、worksheet( "DataSource")、cell(D4)を評価する必要があります。そして、nullでない場合は、cell(F4)からデータをプルして、コンパイルされたデータセットの新しい行に。上記のように、そのフォルダー内のすべてのExcelファイルをループします。

そして、できれば、最初の列の最初のデータフィールドに、結果のデータセットでデータを取得するファイルの名前を指定します。

誰かがこれを手伝ってくれる?私はVBAに精通しているのでVBAを探していますが、VBScriptにも興味があります(その中に入って違いを学びたいので)。

11
Justin

最初に this google query で開始し、最初に表示されるリンクをクリックすると、 記事 に移動し、フォルダー内のExcelファイルのグループを反復処理する方法を示します。

Sub RunCodeOnAllXLSFiles()
Dim lCount As Long
Dim wbResults As Workbook
Dim wbCodeBook As Workbook


Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False

On Error Resume Next
    Set wbCodeBook = ThisWorkbook
        With Application.FileSearch
            .NewSearch
            'Change path to suit
            .LookIn = "C:\MyDocuments\TestResults"
            .FileType = msoFileTypeExcelWorkbooks
            'Optional filter with wildcard
            '.Filename = "Book*.xls"
                If .Execute > 0 Then 'Workbooks in folder
                    For lCount = 1 To .FoundFiles.Count 'Loop through all
                        'Open Workbook x and Set a Workbook variable to it
                        Set wbResults = Workbooks.Open(Filename:=.FoundFiles(lCount), UpdateLinks:=0)

                        'DO YOUR CODE HERE

                        wbResults.Close SaveChanges:=False
                    Next lCount
                End If
        End With
On Error GoTo 0
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub

ワークブックの名前を取得するには、「ここにコードを入力してください」のコードを変更して、wbResults.Nameを含めます。必要なファイル名の場合は、wbResults.FullNameを使用します。これは、ディスク上のパスを含むワークブックの名前を文字列として返します。

同じもののVBScriptバリエーション を検索すると、次のスクリプトを含め、役立つ多くの結果が得られます。

strPath = "C:\PATH_TO_YOUR_FOLDER"

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.DisplayAlerts = False

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder (strPath)

For Each objFile In objFolder.Files

If objFso.GetExtensionName (objFile.Path) = "xls" Then
   Set objWorkbook = objExcel.Workbooks.Open(objFile.Path)
   ' Include your code to work with the Excel object here
   objWorkbook.Close True 'Save changes
End If

Next

objExcel.Quit
11
Phil.Wheeler

VBScriptでも、VB.NETやPowershellでも、そうしたいと思っています。

VB.NETを使用すると、OLEDBプロバイダーを介して、データベースのようにExcelスプレッドシートにアクセスできます。値の範囲を選択するコードは次のようになります。

_ Try
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim DtSet As System.Data.DataSet
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        MyConnection = New System.Data.OleDb.OleDbConnection _
        ("provider=Microsoft.Jet.OLEDB.4.0;"  _
        " Data Source='testfile.xls'; " _
         "Extended Properties=Excel 8.0;")
        MyCommand = New System.Data.OleDb.OleDbDataAdapter _
            ("select * from [Sheet1$]", MyConnection)
        MyCommand.TableMappings.Add("Table", "TestTable")
        DtSet = New System.Data.DataSet
        MyCommand.Fill(DtSet)
        MyConnection.Close()
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
_

データを取得したら、それについて詳しく説明し、同じAPIを使用して結果を別のExcelスプレッドシートに挿入します。

ファイルのリストの取得は、.NETでは System.IO.Directory.GetFiles() ;を呼び出すことで簡単です。 "* .xls"ワイルドカードを指定するだけです。リストを取得したら、forループを使用してそれを反復処理し、各ファイルを順番に開いて、thatファイルに対してクエリを実行します。オン。

VBScriptを使用する場合、Excelファイルのリストを取得するには、 _Scripting.FileSystemObject_ 、具体的には GetFolderメソッド を使用することをお勧めします。基本的に同じように機能しますが、構文は少し異なります。


VBScriptまたはVB.NETの場合は、おそらくExcel自体の外部で実行されます。ダブルクリックするか、バッチファイルなどから実行します。 VB.NETを使用する利点は、対話用のグラフィカルフォームを作成できることです。これにより、進行状況バーを表示し、通過したファイルの数、ステータスの更新などを追跡できます。

4
Cheeso

多数のExcelファイルに連続してアクセスしているときは常に、ExcelのオートメーションオブジェクトではなくADODBを使用すると、通常、パフォーマンスが向上します。

1
Nilpo

それは次のコードで行うことができます

Sub LoopThroughFiles()

Dim StrFile As String
StrFile = Dir("V:\XX\XXX\*.xlsx")
 Do While Len(StrFile) > 0
    Debug.Print StrFile
       Set wbResults = Workbooks.Open("V:\XX\XXX\" & StrFile)   

                    'DO YOUR CODE HERE


       wbResults.Close SaveChanges:=True
    StrFile = Dir
 Loop
End Sub
0
Rakesh kumar

Excelオブジェクトへのアクセスが最も速くなく、データを取得しようとしているワークブックとシートがすべて一貫している(つまり、同じ列名などである)か、少なくとも列名が探している)ODBCを使用する方が良いでしょう。これにはいくつかの問題があり、回避できない場合や、コンテンツに基づいて実際にもっと複雑なことを行う必要がある場合は、回避策がない場合があります。その場合は、効率を上げるために、Excelオブジェクトを1つ作成し、必要に応じてファイルを開いたり閉じたりすることをお勧めします。