Dépouiller plusieurs centaines de formulaires Excel

Bonjour,

Voici mon problème, j'ai plusieurs centaines de fichiers Excel différents (formulaire) que je souhaiterai rassembler en 1 tableau Excel unique ou:

Les lignes correspondraient à un fichier.

Les colonnes aux réponses du formulaire.

J'ai cru comprendre qu'en mettant tous mes fichiers dans un seul et même dossier, il était possible avec une macro d'automatiser le dépouillement.

Etant donné que mes connaissances en macro sont proche de zéro pourriez vous m'aiguiller sur la façon de faire.

Je vous met en pièce jointe un exemplaire du formulaire

Je vous remercie par avance de l'aide que vous pourriez m'apporter


rectification, il ne s'agit pas véritablement d'un "Formulaire excel " mais plutôt d'une fiche identique à tous les fichiers et qui a été rempli en fonction des caractéristiques de l'ouvrage.

52p1-rab.zip (107.41 Ko)

Bonsoir,

Il faut établir le modèle de ton fichier cible, à partir duquel tu piloteras l'opération.

Fournir également quelques précisions sur la structure de tes noms de fichiers, éventuellement l'ordre dans lequel tu veux classer...

Cordialement.

Bonjour et merci d'avance pour l'aide que vous m'apporter.

Ci joint le fichier cible, les colonnes correspondent aux valeurs que je souhaite récupérer dans la fiche , et les lignes correspondent a chacune des fiches (ouvrages en cours d'eau).

Chaque nom de fichier correspond à l'identifiant de l'ouvrage: exemple P1-RAB, P1-DOU, P3-LUZ ...

Je cherche à rapatrier toutes ces fiches dans un seul et unique fichier excel afin de pouvoir ensuite integrer les données dans un SIG: QGIS.

Etant novice en macro, existe t'il un tuto ou toute autre document qui pourrait m'aider à réaliser cette macro.

Merci par avance

22fichier-cible.xlsx (8.15 Ko)

Bonjour,

Les macros des applications Office, Excel au cas particulier, se font dans un langage de programmation : Visual Basic, une version asservie pour opérer avec l'application sur laquelle on l'utilise (ne fonctionnera pas en dehors), version pour Applications, d'où l'acronyme VBA le plus souvent utilisé.

Cette version permet une utilisation relativement simplifiée de ce langage (en ce sens que tu n'as pas besoin de poser de façon programmatique le cadre dans lequel tu vas opérer, soit pas besoin de déclarer préalablement les composant Excel sur lesquels tu vas travailler [on dit instancier...], c'est acquis lors de l'appel du programme dans l'application). Pour autant, toutes les fonctionnalités du langage demeurent disponibles, ce qui réclame pour une bonne utilisation un apprentissage minimal...

Il est donc conseillé d'acquérir quelques rudiments de VBA, ce que tu trouveras dans les cours de ce site (et de quelques autres sites spécialisés), en te concentrant au départ sur l'accès à l'éditeur VBA et la reconnaissance de ses différents composants que tu auras à utiliser, ne serait-ce que pour pouvoir mettre correctement en place les éléments que l'on te fournira. Au-delà, une vue des éléments de programmation (procédures, variables, constantes, principales instructions... d'une part et hiérarchie du modèle objet d'Excel d'autre part, sera utile pour savoir ce que tu fais, et au niveau immédiat comprendre les termes utilisés par les uns et les autres...

On pourra revenir sur tout ça... Pour l'instant, deux petits points à élucider :

- E10 n'existant pas dans la fiche, s'agit-il de F10 ?

et comme tu l'as dit, le nom du fichier étant l'identifiant, il sera inutile de doubler cette information...

- en ce qui concerne les fichiers, soit on en a une liste préalable, et on insèrera les données dans un ordre prédéfini, soit on pioche dans le dossier jusqu'à épuisement (et dans ce cas, faut-il reclasser dans un ordre déterminé ensuite (trier quoi...)

Comme je serai en déplacement aujourd'hui, un certain délai avant ma prochaine intervention...

(Mais tu peux avoir d'autres intervenants qui s'intéressent à ton projet...)

Cordialement.

Effectivement petite erreur, il s'agit de F10

L'ordre importe peu, puisque je reclasserai les données ensuite en fonction du nom de l'identifiant.

Pour la macro, je sais comment insérer une macro dans excel, ce qui me bloque c'est le langage VBA, finalement la rédaction de la macro.

J'ai trouver un exemple de macro qui semble correspondre à ce que je recherche (voire piece jointe), est ce que je suis sur la bonne voix.

11macro.docx (12.00 Ko)

Bonjour,

Sub parcourirFichiers()
    Dim chemin As String, Fichier As String
    Dim adr, valeur(), lig As Long, col As Long
    Dim wb As Workbook, wb2 As Workbook
    Set wb = ThisWorkbook
    chemin = wb.Path + "\"
    adr = [A1].Resize(, Cells(1, Columns.Count).End(xlToLeft).Column - 1)
    lig = Cells(Rows.Count, 1).End(xlUp).Row
    Fichier = Dir(chemin & "*.xl*")    ' 1er fichier
    Application.ScreenUpdating = False
    Do While (Len(Fichier) > 0)
        If Fichier <> ThisWorkbook.Name Then
            Set wb2 = Workbooks.Open(chemin & Fichier)
            ' traitement
            ReDim valeur(1 To 1, 1 To UBound(adr, 2))
            valeur(1, 1) = Fichier
            For col = 2 To UBound(adr, 2)
                valeur(1, col) = wb2.Sheets("modele").Range(adr(1, col))
            Next col
            wb2.Close
            lig = lig + 1
            Cells(lig, 1).Resize(, UBound(adr, 2)) = valeur
        End If
        Fichier = Dir()    ' fichier suivant
    Loop
End Sub

mettre ce fichier dans le répertoire à traiter.

eric

13fichier-cible.xlsm (19.14 Ko)

Bonjour Sylv19, bonjour à tous,

un exemple sans ouvrir les fichiers,

Sub test()
Dim Chemin As String, Fichier As String, i As Long, lign As Integer, coln As Integer

Chemin = ThisWorkbook.Path & "\" 'en supposant que tous les fichiers soient dans le même répertoire que ce fichier
col = Cells(1, Columns.Count).End(xlToLeft).Column
Fichier = Dir(Chemin & "*.xls") 'en supposant que tous les fichiers formulaire aient l'extention .xls

Do While Fichier <> ""
 If Fichier <> ThisWorkbook.Name Then
  n = Cells(Rows.Count, 2).End(xlUp).Row + 1
  Cells(n, 1) = Fichier
     For i = 2 To col
       lign = Range(Cells(1, i).Value).Row
       coln = Range(Cells(1, i).Value).Column
       Cells(n, i) = Data_in_closed_workbook(Chemin, Fichier, "modele", lign, coln)
     Next
 End If
 Fichier = Dir
Loop

End Sub

Function Data_in_closed_workbook(sRep As String, sFile As String, sSh As String, rw As Integer, cn As Integer) As Variant
x = ExecuteExcel4Macro _
      ("'" & sRep & "\[" & sFile & "]" & sSh & "'!R" & rw & "C" & cn & "")
      Data_in_closed_workbook = x
End Function
21sylv19-resumer.xlsm (17.69 Ko)

Bonjour sabV,

j'avais fait un premier jet avec ExecuteExcel4Macro, le pb est qu'une cellule vide retourne 0.

Pas toujours gênant, à voir. Et comme j'avais la flemme de faire avec une autre technique...

eric

Bonjour,

Un grand merci à vous tous pour toutes l'aide apportée, pour un novice comme moi ce petit programme c'est tous simplement inespéré (magie d'Excel).

ça va m'éviter de longues heures (jours) à tout ressaisir dans un tableau. J'ai 556 fichiers de ce type

revenons à nos moutons, j'ai mis le Fichier sylv19-résumer.xls dans mon dossier contenant les formulaires (*.xls version 97/2003)

Quand j'exécute la macro, les lignes par fichiers se créent, la première colonne est complétée par le nom du fichier, mais toutes les autres colonnes affichent #REF!

Une idée du problème?

J'ai mis en pièce jointe le dossier tel que je l'ai sur mon ordi.


oups oublier la pièce jointe

16essai-excel-v2.zip (640.24 Ko)

Bonjour,

quelle solution as-tu choisi ?

eric

Bonjour,

ça y est j'ai réussi à faire fonctionner le fichier d'éric, ça fonctionne parfaitement, il y avait d'autres fichiers qui venaient polluer l'exécution. Encore un grand merci.

Néanmoins j'aimerai comprendre pourquoi la macro de SABV ne fonctionne pas chez moi.

Si vous pouvez m'éclairer

Bonjour à tous,

sylv19 , j'ai mis les adresses de cellule à récupérer en ligne 1, cela pour facilité la modification si jamais le formulaire serait modifié.

chacune de ces adresses (en ligne 1) est traité dans cette section de la macro:

     For i = 2 To col  'pour chaque cellule de la ligne 1 entre la colonnes 2 et la dernière colonne de la ligne 1
       lign = Range(Cells(1, i).Value).Row
       coln = Range(Cells(1, i).Value).Column
       Cells(n, i) = Data_in_closed_workbook(Chemin, Fichier, "modele", lign, coln) 'lire l'info sur le classeur fermé
     Next

Bonjour,

Je n'ai pas trouvé pourquoi le fichier de SABV ne fonctionne pas!! une idée?

Rechercher des sujets similaires à "depouiller centaines formulaires"