データを取得する必要があるExcelブックが約50個あります。特定のセル、特定のワークシートからデータを取得し、1つのデータセット(できれば別のExcelワークブック)にコンパイルする必要があります。
コードの実行に使用しているワークブックに結果をコンパイルできるように、VBAを探しています。
したがって、データをプルする必要があるxlsまたはxlsxファイルの1つ、worksheet( "DataSource")、cell(D4)を評価する必要があります。そして、nullでない場合は、cell(F4)からデータをプルして、コンパイルされたデータセットの新しい行に。上記のように、そのフォルダー内のすべてのExcelファイルをループします。
そして、できれば、最初の列の最初のデータフィールドに、結果のデータセットでデータを取得するファイルの名前を指定します。
誰かがこれを手伝ってくれる?私はVBAに精通しているのでVBAを探していますが、VBScriptにも興味があります(その中に入って違いを学びたいので)。
最初に 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
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を使用する利点は、対話用のグラフィカルフォームを作成できることです。これにより、進行状況バーを表示し、通過したファイルの数、ステータスの更新などを追跡できます。
多数のExcelファイルに連続してアクセスしているときは常に、ExcelのオートメーションオブジェクトではなくADODBを使用すると、通常、パフォーマンスが向上します。
それは次のコードで行うことができます
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
Excelオブジェクトへのアクセスが最も速くなく、データを取得しようとしているワークブックとシートがすべて一貫している(つまり、同じ列名などである)か、少なくとも列名が探している)ODBCを使用する方が良いでしょう。これにはいくつかの問題があり、回避できない場合や、コンテンツに基づいて実際にもっと複雑なことを行う必要がある場合は、回避策がない場合があります。その場合は、効率を上げるために、Excelオブジェクトを1つ作成し、必要に応じてファイルを開いたり閉じたりすることをお勧めします。