Importer des données d'un fichier Excel vers une base de donnée

Bonjour à tous,

Je récupère des résultats sous forme d'un fichier Excel

Je souhaiterais créer une macro pour importer ces données du fichier Excel contenant les résultats dans une base de données.

J'ai identifié 2 étapes dans mon développement de macro :

  • Mettre au point l'importation des données
  • Ordonner les données pour tenir compte de la mise en page du fichier source

Je bloque à l'étape 1 sur une bêtise, je pense. Voici mon code :

Sub import()
Dim Source, Destination As Workbook
Dim Fichier_Travail, Fichier As String

'défini le nom et le chemin du fichier à ouvrir
Fichier = Application.GetOpenFilename(", *xlWindows", 0, "Sélectionner le ficher source")

'vérification selection fichier
If Fichier = "Faux" Then
    MsgBox "Pas de fichier selectionné", vbOKOnly + vbExclamation, "title"
    Exit Sub
Else
'ouvrir le classeur source
Set Source = Application.Workbooks.Open(Fichier, , True)
'définir le classeur destination
Set Destination = ThisWorkbook
MsgBox Destination

'copier les données de la "Feuil1" du classeur source vers la "Feuil1" du classeur destination
Source.Worksheets("Feuil1").Cells.Copy Destination.Worksheets("Feuil1").Range("A2")

'fermer le classeur source
Source.Close False

End If
End Sub

J’ai le message d'erreur suivant sur la ligne Source.Worksheets("Feuil1").Cells.Copy Destination.Worksheets("Feuil1").Range("A2")

image

Dans la destination, la feuille où l'on importe s'appelle bien "feuil1" mais dans la source, elle a été renommée. Est-il possible de garder la désignation Feuil1 pour que cela fonctionne à chaque classeur, indépendamment du nom de la feuille du fichier de résultats (la source)

Je vous remercie par avance pour votre aide

Bonjour,

En effet, c'est bien la cause de l'erreur.

Non, il n'est pas possible de garder ce nom dans le code alors qu'il ne correspond pas au nom d'une feuille.

Soit, vous remplacez worksheets("Feuil1") par son CodeName (visible dans l'éditeur VBA), soit vous choisissez l'index : worksheets(1) par exemple. Mais dans ce cas, il faut que la feuille reste à sa place...

Cdlt,

Merci pour ton aide.

Dans mon cas, je n'ai qu'une seule feuille dans les deux classeurs donc ça va passer avec Worksheets(1)

J'ai du aussi modifier la zone de copy car ça blocait pour copier tout le classeur source vers la destination a partir de la cellule A2 (étant donné que la ligne 1 est occupée par des entêtes).

Source.Worksheets(1).Range("A1:Q23").Copy Destination.Worksheets(1).Range("A2")

Si j'ai bien compris d'ailleurs, c'est presque plus simple de fonctionner avec l'index pour le fichier source. En effet, sauf si je n'ai pas tout compris, en "standard", les codename ne sont connus que pour le fichier contenant la macro et ne pourront être utilisés dans un code en référence a un autre fichier (que celui contenant le code) à moins de s'arranger pour que le code lise les codename du fichier "externe" a son ouverture pour être apte à sélectionné la bonne feuille.

Si c'est bien ça, au-delà du fait que je ne sais pas trop comment faire ça (pour être honnête), j'ai peur que ça alourdisse le code, non? SI tel n'est pas le cas, ce serait en effet plus "universel" de fonctionner avec le codename que l'index de la feuille.

Je vais maintenant bosser sur la suite du programme à savoir l'import des données et ça ne va pas être facile vu la structure du fichier source, je reviendrais sur ce post si je galère trop pour avoir vos lunières :-).

Je t'en prie, je n'ai pas fait grand-chose...

Oui, dans ce cas, c'est plus simple et plus sûr de rester sur l'index.

Pour la ligne, il est possible de faire ça peut-être :

Source.Worksheets(1).usedrange.Copy Destination.Worksheets(1).Range("A1")

sans ce soucier des en-têtes qui devraient être les mêmes sur les 2 fichiers non ?

Sinon :

with Source.Worksheets(1).usedrange
    .resize(.rows.count, .columns.count).offset(1, 0).Copy Destination.Worksheets(1).Range("A2")
end with

Bon courage pour la suite du programme !

Hello

Merci pour ta réponse.

Je me suis mal exprimé. Le bout de code que j'ai fait jusqu'a maintenant, était pour voir si j'arrivais a faire une macro pour ourvrir un fichier excel et importer des data. Ce qui est fait et fonctionne (ouverture fichiers contenant les data et import des data "pele-mele" dans le fichier destination).

Maintenant, comme je disais, je vais bosser sur l'import ordonné des data.

Et c'est la que ça se complique a mort. En effet, je n'ai pas la même dispostion des colonnes dans ma BDD (le fichier destination, list-da-test), voir même les même intitulés (parfois en anglais/Français ou formulé différement) que dans le fichier source (nn-aa) contenant les résultats de l'analyse.

Je pense que je peux armoniser dans uen certaines mesure les intitulé, par exemple tout mettre en anglais, mais ça risque d'etre compliqué dechanger la mise en page des entete du fichier source, par exemples les cellules fusionnées.

56liste-da-test.xlsm (37.07 Ko)
29nn-aa.xls (35.00 Ko)

Bonjour Bastien,

Tu n'as pas le contrôle sur les fichiers sources et il y en a plusieurs ?

Si c'est bien le cas, il est possible d'importer les données que tu souhaites mais ça peut devenir une petite usine à gaz... Il faut arriver à identifier chacun des titres possibles pour chacune des colonnes à récupérer dans les fichiers source.

Cdlt,

Hello

Oui, il y a et aura plusieurs fichiers sources (non-aa.xls). A chaque fois que je reçois des résultats d’analyse en fait.

Le format standard est celui qui est présente dans l’exemple et correspondent aux colonne à en-tête jaune dans mon fichier destination, la bdd (list-da-test.xlsm).

Merci pour la piste.

Rechercher des sujets similaires à "importer donnees fichier base donnee"