J'ai environ 50 classeurs Excel dont je dois extraire des données. Je dois prendre des données de cellules spécifiques, des feuilles de calcul spécifiques et les compiler dans un ensemble de données (de préférence dans un autre classeur Excel).
Je recherche un peu de VBA afin de pouvoir compiler les résultats dans le classeur que j'utilise pour exécuter le code.
Donc, l’un des fichiers xls ou xlsx dont je dois extraire les données, feuille de calcul ("DataSource"), j’ai besoin d’évaluer la cellule (D4) et, si ce n’est pas nul, extraire les données de la cellule (F4) et dans une nouvelle ligne dans le jeu de données compilé. Parcourez tous les fichiers Excel de ce dossier, comme indiqué ci-dessus.
Et si possible, j'aimerais que le premier champ de données de la première colonne soit le nom du fichier à partir duquel les données sont extraites.
Quelqu'un peut il m'aider avec ça? Je recherche VBA parce que je suis plus familier avec cela, mais que je suis également intéressé par VBScript (car j'essaie d'entrer dans cela et d'apprendre les différences).
Commencez d'abord par cette requête google et cliquez sur le premier lien qui apparaît, qui vous amène à un article montrant comment parcourir un groupe de fichiers Excel dans un dossier.
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
Pour obtenir le nom du classeur, vous devrez adapter le code dans "FAITES VOTRE CODE ICI" pour inclure wbResults.Name
. S'il s'agit du nom de fichier souhaité, utilisez wbResults.FullName
, qui renvoie le nom du classeur, ainsi que son chemin d'accès sur le disque, sous forme de chaîne.
Une recherche d'une variante de VBScript sur la même chose donne un certain nombre de résultats utiles, notamment le script suivant:
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
Je le ferais dans VBScript ou même, VB.NET ou Powershell si vous vous sentez si enclin.
À l'aide de VB.NET, vous pouvez accéder aux feuilles de calcul Excel comme s'il s'agissait de bases de données, via le fournisseur OLEDB. Le code permettant de sélectionner une plage de valeurs pourrait ressembler à ceci:
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
Une fois que vous avez obtenu les données, vous pouvez les développer, puis insérez le résultat dans une autre feuille de calcul Excel, en utilisant la même API.
Obtenir la liste des fichiers est facile dans .NET avec un appel à System.IO.Directory.GetFiles()
; spécifiez simplement le caractère générique "* .xls". Une fois que vous avez la liste, utilisez une boucle for pour la parcourir, ouvrant chaque fichier à tour de rôle, puis interrogez le fichier that, etc.
Si vous utilisez VBScript, le moyen préféré pour obtenir la liste des fichiers Excel consiste à utiliser le Scripting.FileSystemObject
, en particulier la méthode GetFolder . Cela fonctionne fondamentalement de la même manière mais la syntaxe est légèrement différente.
S'il s'agit de VBScript ou de VB.NET, il sera probablement exécuté en dehors d'Excel. Vous l'exécuteriez en double-cliquant sur un fichier de commandes ou quelque chose comme ça. L’utilisation de VB.NET présente l’avantage de vous permettre de créer une forme graphique d’interaction: une barre de progression, indiquant le nombre de fichiers que vous avez consultés, les mises à jour de l’état, etc.
Chaque fois que vous accédez successivement à autant de fichiers Excel, vous pouvez généralement obtenir de meilleures performances en utilisant ADODB plutôt que l'objet Automation d'Excel.
Cela pourrait être fait avec le code suivant
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
Je suis d'accord avec le fait qu'utiliser l'accès à l'objet Excel n'est pas le plus rapide et que les classeurs et les feuilles à partir desquels vous essayez d'extraire des données sont tous cohérents (c'est-à-dire qu'ils ont les mêmes noms de colonne, etc. cherchez), il serait préférable d'utiliser ODBC. Cela pose certains problèmes et si vous ne pouvez pas les contourner ou si vous devez réellement faire quelque chose de plus complexe en fonction du contenu, il n’y aura peut-être aucun moyen de le contourner. Si tel est le cas, je vous suggérerais de créer un objet Excel, puis d'ouvrir et de fermer les fichiers en fonction des besoins pour améliorer l'efficacité.