web-dev-qa-db-fra.com

Code permettant de parcourir tous les fichiers Excel d'un dossier spécifié et d'extraire des données de cellules spécifiques

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).

11
Justin

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
11
Phil.Wheeler

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. 

4
Cheeso

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.

1
Nilpo

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
0
Rakesh kumar

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é.

0