Pour le moment on peut les nommer colonne1 et colonne3 je les modifierais par la suite.
Merci
Edit : en fait je souhaite renvoyer les colonnes intitulées colonne1 et colonne3 des fichiers (fichieràdupliquer cad qu'on doit faire des copier coller de ses fichiers manuellement afin de simuler le grand nombre de fichiers) et on doit coller les données dans le fichier synthese.
Merci
voici qui fera ce que tu demandes à partir de l'exemple que tu avais fourni dans tes précédents post.
Une recommandation toutefois. Eviter de nommer les colonne avec des mots réservés comme 'Date' (transformée ci-dessous en LaDate). En effet Date et une fonction SQL qui pourrait entrer en conflit avec un champ nommé Date, surtout si celui-ci n'est pas entouré de ` ou de [].
Petit plus: une procédure pour lister les champs du recordset vers une cellule, soit en ligne (horizontalement) soit en colonne (verticalement).
Code:
Sub TestImport()
'Attention il y a trois S dans le nom de la feuille
If IsDate(Sheets("Sommaire").Range("A1")) Then
ImportDonnées ThisWorkbook.Path & "\fichieradupliquer.xls", "esssai", Year(Sheets("Sommaire").Range("A1"))
End If
End Sub
Sub ImportDonnées(NomCompletFichier As String, NomOnglet, Annee)
'
' La référence à Microsoft ActiveX Data Objects 2.n Library doit être cochée
'
Dim cnx As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim SQL As String
'Il faut éviter les espaces dans les noms de champs (Source de problèmes)
'Ou alors les entrourer de []
'Il faut éviter les noms de champs qui sont des mots du langage VB (ex: Date)
'Initialisation de la chaine SQL
SQL = "SELECT LaDate ,Colonne1, Colonne3 From [" & NomOnglet & "$]" _
& " WHERE YEAR(LaDate)>=" & Annee _
& " ORDER BY LaDate;"
'Initialisation de la connexion au fichier
Set cnx = New ADODB.Connection
cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & NomCompletFichier & _
";Extended Properties=""Excel 8.0;HDR=YES;"""
'Initialisation du recordset
Set rsT = New ADODB.Recordset
rsT.CursorLocation = adUseClient
'Chargement du recordset
rsT.Open SQL, cnx, adOpenStatic, adLockReadOnly
'S'il n'est pas vide copie dans la feuille
If Not rsT.EOF Then
'Pour copier tout le recordset entêtes de champs inclus
With Sheets("Sommaire")
'Lister le noms de champs à partir de A2 en ligne
ListerChamps rsT, .Range("A2"), True
.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).CopyFromRecordset rsT
End With
End If
Set rsT = Nothing
cnx.Close
Set cnx = Nothing
End Sub
Sub ListerChamps(rs As ADODB.Recordset, CelluleDepart As Range, Optional bHorizontale As Boolean = True)
Dim i As Integer
If rs.State = adStateOpen Then
For i = 0 To rs.Fields.Count - 1
If bHorizontale Then
CelluleDepart.Offset(, i) = rs.Fields(i).Name
Else
CelluleDepart.Offset(, i) = rs.Fields(i).Name
End If
Next i
End If
End Sub
Si tu ne veux pas que la date s'affiche:
Code:
SQL = "SELECT Colonne1, Colonne3 From [" & NomOnglet & "$]" _
& " WHERE YEAR(LaDate)>=" & Annee _
& " ORDER BY LaDate;"
Désolé, mais je crois que tu devrais rester dans le fil de discussion. Si je ne réponds pas c'est que je n'ai pas le temps.
Ce que je t'ai donné n'est qu'un exemple de ce que l'on peut faire, adapté aux fichiers que tu m'as donnés. Si tu veux des réponses plus précises, soit plus précis dans tes demandes, avec fichier joints,
exemple etc.....
Mais surtout reste dans le fil.
Merci
Je mets cette réponse dans le fif afin que quelqu'un peut-être reprenne la main et comprenne ou tu en es.
En MP à dit:
Bonjour Hasco et merci de m'avoir répondu.
J'ai essayé ton code mais rien ne se passe.
J'ai mis les deux fichiers (Synthese et fichieradupliquer) dans le meme fichier mais rien.
Sinon dans le code suivant :
Code:
Sub TestImport()
'Attention il y a trois S dans le nom de la feuille
If IsDate(Sheets("Sommaire").Range("A1")) Then
ImportDonnées ThisWorkbook.Path & "\fichieradupliquer.xls", "esssai", Year(Sheets("Sommaire").Range("A1"))
End If
End Sub
Je vois que tu fais appel au fichier "fichieradupliquer". et a l'onglet "esssai" alros que je souhaite qu'il ouvre chaque fichier contenu dans le dossier dans lequel il est et qu'il copie les informations suivant certains critères des onglets dont les nom sont différents de feuil1, 2, 3 et Listes. Est ce réalisable?
Je sais que je t'en demande beaucoup mais la j'ai pas le niveau nécessaire pour modifier moi meme le code, j'essai mais j'ai beaucoup de mal.
En fait, pour expliquer, j'ai mon fichier "synthese" qui se situe dans le meme dossier qu'un nombre indéterminé de fichier du meme type que "Ficheradupliquer".
Je souhaite donc faire la synthese de ces fichiers (du type Fichieradupliquer) avec les critères cités dans les messages précédents (récupération des colonnes1 et 3 en fonction de l'année --> onglet "Sommaire" range("A1").)
Pour conclure, j'arrive à réaliser ces différentes actions en visual basic mais en ouvrant chaque fichier (du type fichieradupliquer : je sais que je me répéte) un par un, ce qui prend beaucoup de temps.
Hasco m'a donc proposée une autre solution qui à l'air beaucoup plus rapide mais le probleme est que je ne comprend pas forcement comment cela fonctionne (de toute évidence je n'ai pas le niveau).
Voila, je suis donc pour le moment bloqué alors que je sais que la solution à mon probleme est a porté de main (mais malheureusement, je n'ai pas les bras assez long...).
Sub TestImport()
If IsDate(Sheets("Sommaire").Range("A1")) Then
ImportDonnées ThisWorkbook.Path & [COLOR=blue][COLOR=black]"\[/COLOR][B]fichieradupliquer.xls[/B][COLOR=black]"[/COLOR][B],[/B][/COLOR] [COLOR=blue][B]"esssai"[/B][/COLOR], Year(Sheets("Sommaire").Range("A1"))
End If
End Sub
ThisWorkBook.Path = nom du répertoire(dossier) du classeur qui contient la macro
"fichieradupliquer.xls" est le nom du fichier dans lequel la procédure importDonnées fera la recherche. "esssai" est le nom de la feuille dans laquelle faire la recherche. Ces deux noms peuvent être remplacés par des variables.
Exemple:
Code:
Sub TestImport()
Dim NomFichier as string
Dim NomFeuille as string
NomFichier="LeFichier.xls"
NomFeuille="LaFeuille"
If IsDate(Sheets("Sommaire").Range("A1")) Then
ImportDonnées ThisWorkbook.Path & "\" & NomFichier, NomFeuille, Year(Sheets("Sommaire").Range("A1"))
End If
End Sub
Mais comme madame Irma n'est pas là ces temps-ci, je n'ai aucun moyen de savoir comment sélectionner les fichiers et le nom de feuilles.
Je t'ai fait un exemple, à toi d'adapter et éventuellement revenir avec plus de précisions sur le choix des fichiers à ouvrir et des noms de feuilles concernées.
Bonjour Hasco et merci d'avoir pris du temps pour me répondre.
En fait, tout les documents seront placés dans le même dossier (le fichier synthese et le nombre indéterminé de fichier du type fichieradupliquer).
Je veux donc prendre les informations dans tous les fichiers du type fichieradupliqer mais leur nom varie (un de fichiers pourrait tres bien s'appeler dudu alors que l'autre vivi par exemple).
Ensuite les données à exporter se trouvent dans un onglet dont le nom varie en fonction du fichier dans lequel il se trouve, la seule chose qu'on sait avec certitude c'est qu'il ne s'agit pas des noms Feuil1, Feuil2, Feuil3 et Listes. Donc en résumé si il ne s'agit pas d'un de ces noms c'est que c'est le bon onglet.
Est ce que c'est plus clair ? (c'est difficile a expliquer)
Utiliser ADO pour extraire des données Excel à partir de noms de colonnes suppose que les noms des colonnes soit sur la première ligne de la feuille du fichier excel.
De plus si ADO rencontre 2 lignes vides il les interprète comme fin de table.
Dans le fichier fichieradupliquer.xls l'entête doit-être sur la première ligne.
Ah d'accord, c'est ennuyeux, le probleme est que j'ai deux lignes (qui me servent de cartouche) avant le tableau contenant les données à extraire.
Ne peut on pas dire que les noms de colonnes sont en ligne 3 et donc de commencer la recherche à cet endroit ? enfin ou une astuce permettant d'arriver au meme résultat ?