Importer des colonnes d'un autre fichier Excel sans l'ouvrir
Bonjour tout le monde,
Je viens de commencer la formation VBA et j'ai besoin de votre aide pour mon problème. Je sais qu'il y a pas mal de questions similaires mais j'avais du mal à adapter les codes proposés pour mon cas.
J'aimerais bien savoir comment faire l'opération suivante:
Récupérer les colonnes d'un fichier A et les copier dans un autre fichier B sans ouvrir le fichier A.
Sachant que les deux fichiers se trouve dans le même dossier.
Je vous remercie par avance pour votre aide.
Bien à vous,
Bonjour et bienvenue sur le forum
un essai à tester. Te convient-il ?
Sub Importer()
Workbooks.Open Filename:=ThisWorkbook.Path & "\Fichier A.xlsx"
Columns("A:A").Copy ThisWorkbook.Sheets(1).Range("A1")
ActiveWorkbook.Close
End Sub
Bye !
Oui ça marche parfaitement, un super merci!
Hello Gmb,
Heu si tu utilise la propriété .open, tu ouvre le classeur source pour le refermer à la fin.
En testant ton code moi ça me fait :
Ouverture fichier source > Copie colonne source > fermeture fichier source
Par contre, pour importer sans ouvrir le fichier et ne travailler qu'avec un fichier ouvert c'est :
Sub ImporterDonneesSansOuvrir()
'http://www.commentcamarche.net/faq/32961-vba-excel-lire-dans-un-classeur-ferme
'Déclaration variable chemin et nom en texte
Dim Cheminsource As String, Fichiersource As String
'Définition contenu variable
Cheminsource = "C:\Users\waard\Desktop\test planification\"
Fichiersource = "test.xlsm"
'Création d'une plage de remontée de données à partir du fichier source fermé sinon bug, de la feuille 1 et de la plage cellule A1>F10
ThisWorkbook.Names.Add "plage", _
RefersTo:="='" & Cheminsource & "[" & Fichiersource & "]Feuil1'!$A$1:$F$10"
'De la feuille 1 du fichier source
With Worksheets("Feuil1")
'Colle les données du fichier ouvert sur la feuille 2, sur la plage A1>F10 à partir des données du fichier source copiées dans "=laplage"
Worksheets("Feuil2").Range("A1:F10").Value = "=plage"
End With
End Sub
Voilà c'était plus pour info.
Bye
Bonjour waard
Je te remercie de m'apprendre quelque chose.
Ce serait parfait si j'arrivais à l'adapter au cas plus général de ybs avec deux fichiers, ''Fichier A.xlsx'' et ''Fichier B.xlsm'' placés dans un même dossier, n'importe où dans le PC.
Qu'y a-t-il donc qui cloche dans cette adaptation de ton code qui l'empêche de donner le résultat ?
Merci par avance.
Bye !
Sub ImporterDonneesSansOuvrir()
'Déclaration variable chemin et nom en texte
Dim Cheminsource As String, Fichiersource As String
'Définition contenu variable
Cheminsource = ThisWorkbook.Path & "\" 'C:\Users\waard\Desktop\test planification\"
Fichiersource = "Fichier A.xlsx" '."test.xlsm"
'Création d'une plage de remontée de données à partir du fichier source fermé sinon bug, de la feuille 1 et de la plage cellule A1>F10
ThisWorkbook.Names.Add "plage", _
RefersTo:="='" & Cheminsource & "[" & Fichiersource & "]Feuil1'!$A$1:$F$10"
'De la feuille 1 du fichier source
With Worksheets("Feuil1")
'Colle les données du fichier ouvert sur la feuille 2, sur la plage A1>F10 à partir des données du fichier source copiées dans "=laplage"
Worksheets("Feuil2").Range("A1:F10").Value = "=plage"
End With
End Sub
Une petite question liée, si je veux avoir le nombre de lignes de mon fichier A j'ai utilisé:
Nbreligne = Range("A:A").SpecialCells(xlCellTypeLastCell).Row
Mais si je change le nombre de lignes du fichier A, ça garde toujours la première valeur enregistré et non pas celle modifiée (Après ajout ou suppression de lignes). Comment puis-je résoudre ce problème?
Je vous remercie encore une fois
ybs a écrit :si je change le nombre de lignes du fichier A, ça garde toujours la première valeur enregistré et non pas celle modifiée (Après ajout ou suppression de lignes).
Mais c'est normal : la macro n'a fait que copier dans ton Fichier B le contenu de la colonne A du Fichier A
Comment puis-je résoudre ce problème?
En faisant tourner une nouvelle fois la macro pour mettreà jour de ton Fichier B
Bye !
Justement c'est ça le problème même si je fais tourner ma macro une autre fois, Le "nombre de ligne" garde la toute première valeur (Celle du nombre de lignes initial)
Voici le code pour mieux comprendre ce que je voulais faire:
Sub Update()
Dim LastRow As Long
Dim i As Integer
Worksheets(1).Cells.ClearContents
Workbooks.Open Filename:=ThisWorkbook.Path & "\FichierB. xlsm"
LastRow = Range("A:A").SpecialCells(xlCellTypeLastCell).Row
Columns("A:K").Copy ThisWorkbook.Sheets(1).Range("A1")
ActiveWorkbook.Close
For i = 5 To LastRow
Sheets(1).Range("M" & i).Formula = Sheets(1).Range("L" & i) - Sheets(1).Range("K" & i)
Next
End Sub
Merci
gmb a écrit :Bonjour waard
Je te remercie de m'apprendre quelque chose.
Ce serait parfait si j'arrivais à l'adapter au cas plus général de ybs avec deux fichiers, ''Fichier A.xlsx'' et ''Fichier B.xlsm'' placés dans un même dossier, n'importe où dans le PC.
Qu'y a-t-il donc qui cloche dans cette adaptation de ton code qui l'empêche de donner le résultat ?
Problème d'extension de fichier, chez moi j'ai repris tes modifs tel quels, ça marche comme même, mais ça m'ouvre une fenêtre d'ouverture de fichier ?!
Mes 2 fichiers s'appelant fichier a.xlsm et fichier b.xlsm, si tu change ton extension de .xlsx en .xlsm, alors ça marche nickel, sans bug.
Sinon dans le cas plus général où on ne sait pas vraiment quel extension a le fichier, mais qu'on connait son nom et son chemin, alors tu peux faire ça :
Cheminsource = ThisWorkbook.Path & "\" 'C:\Users\waard\Desktop\test planification\"
fichiersource = Dir(Cheminsource & "fichier a.*")
' 'fichiersource = "fichier a.xlsx" '."test.xlsm"
Evidement s'il ne s'agit pas d'un fichier excel, bug, mais tant que c'est du excel, ça marche
@ ybs
Si j’en crois ton code, tu ouvres le Fichier B alors que la macro lui est attachée.
Tu ne remonteras donc aucune ligne du Fichier A et bien sûr ta variable ne changera pas !
@ waard
Merci encore. Je vais regarder cela de plus près.
Bye !
Hello, Hello,
Sa m'a pris plusieurs heures, mais j'ai trouvé une solution 8) year !
Posons le problème :
Donc, nous avons un fichier source fermé et qui doit le rester, qui s'appelle fichier a.
De temps en temps des gens, allez savoir pourquoi... le remplisse, du coup la taille du tableur augmente, à chaque ajout.
Alors que faire
1/ Méthode à la Barbare
2/ Méthode à-la-va-vite, ne coller que les colonnes nécessaire prévus à l'avance, mais 1 colonne, prend chez moi 20s
3/ Tatataaaa ma solution de la mort qui tue 8)
Tableau dans le fichier a source, partant de la ligne A3 à A.... fin de tableau non connue à l'avance.
A. Sauvegarde modifiée dans "fichier a source" des infos variables pour l'importation
1 - A chaque sauvegarde du fichier a source, le fichier source crée une plage nom ("plagesource") correspondant au tableau à importer à jour de sa nouvelle taille (le tableau allait initialement de A3 à A7, quelqu'un a entré 3 données, il va jusqu'à A10 maintenant, la plagesource du tableau va de A3 à A10).
> Ce sera utile plus tard pour l'importation, au lieu d'importer à partir d'une adresse fixe ou de colonne, on importe de plagesource.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 - A chaque sauvegarde du fichier a source, le fichier source indique dans une de ses cellules que l'user ne touche pas, la taille que fera ton tableau et en même temps, l'adresse que devra prendre la plage de données "plagesource2" de ton fichier b à MàJ, comme ça tu as : en prédéfinit l'emplacement et sa taille d'importation, préparé à l'avance dans le fichier a source pour le fichier b MàJ, qui collera parfaitement, donc ni trop petit (perte de données), ni trop grand (erreur valeur nulle).
B. Coeur du sujet : Importation de données dans le fichier b à MàJ
1 - Importation de l'info du fichier source du point A.2. dans la cellule B1 du fichier b
> Création et MàJ (écrase en fait) d'une plage cellule : "plagesource2" dans le fichier b source, qui contiendra l'emplacement des données.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 - Importation des données du fichier a source vers le fichier b à MàJ
Et non à partir de plage cellules fixes, ni à partir de colonne ou ligne entière, mais à partir de plages cellules nommées mobiles.
Voilà le code qu'il faut mettre dans ThisWorkbook du fichier a source :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'A. Apès chaque enregistrement du fichier source, MàJ de l'adressage de la plage tableur
'1. Déclaration variable plagesourcevba en texte
Dim plagesourcevba As String
'2. Définition valeur adresse de la plage tableau dans une variable à part pour raccourcir les lignes de code
plagesourcevba = "=Feuil1!" & Range("A3", Range("A3").End(xlDown)).Address(ReferenceStyle:=xlR1C1) & ""
'3. Modification adresse de la plage plagesource, nouvelle plage source prenant bien le tableau dans la colonne A de la feuil1
ActiveWorkbook.Names.Add Name:="plagesource", RefersToR1C1:=plagesourcevba
'4. Indexe l'adresse de la taille de la plage de données à la sauvegarde pour le fichier B, avec modifs,car le traitement dans le fichier B doit importer dans la feuil2
ThisWorkbook.Worksheets(1).Range("B1").Value = "=Feuil2!" & Range("A3", Range("A3").End(xlDown)).Address(ReferenceStyle:=xlR1C1) & ""
'5. conversion cellule B1 en texte, sinon importation ne marche pas... ??
Range("B1").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 2), TrailingMinusNumbers:=True
'Fin sauvegarde
End Sub
Voilà le code pour l'importation dans le fichier b MàJ
Sub ImporterDonneesSansOuvrir()
'Rappel fichier B = fichier MàJ / fichier a = fichier source
'0. Déclaration variable chemin / nom / plagesource en texte
Dim Cheminsource As String, Fichiersource As String, plagesource_màj As String
'1. Définition contenu variable chemin et nom du fichier source
Cheminsource = ThisWorkbook.Path & "\"
Fichiersource = "fichier a.xlsm"
'Problème, apporter toute la feuille, prend du temps, si valeur vide = erreur valeur, il faut définir la taille du tableau à importer, pour le coller
'donc il faut définir la taille exacte du tableau du fichier A dans le fichier B MàJ pour ne pas avoir ces erreurs ou la durée d'importation
'A. Transmettre info par code au fichier B, de la taille du tableau "plagesource" du fichier A
'2. Remonte info, de l'adresse de la plage "plagesource" du fichier source
ThisWorkbook.Names.Add "plage", _
RefersTo:="='" & Cheminsource & "[" & Fichiersource & "]Feuil1'!$B$1:$B$1"
'3. Reporte sur la feuille 2, à la cellule B1 du fichier à MàJ, l'adresse de la plage source, pour MàJ de la plagesource du fichier b mis à jour
Worksheets("Feuil2").Range("B1").Value = "=plage"
'3. Définition nouvelle plagesource dans le fichier mis à jour, pour mettre à jour sans erreur valeur, utilisation d'une variable pour réduire la ligne ci-dessous
plagesource_màj = Worksheets("Feuil2").Range("B1").Text
'4. Modification adresse de la plage plagesource2 (nommé 2 pour distinction avec le nom source)
ActiveWorkbook.Names.Add Name:="plagesource2", RefersToR1C1:=plagesource_màj
'B. Enfin Importation des données du fichier a source au fichier b MàJ
'1. Remonte données, de la plage "plagesource" du fichier source // si nommée plage, fait bugé, nommé plage2
ThisWorkbook.Names.Add "plage2", _
RefersTo:="='" & Cheminsource & "[" & Fichiersource & "]Feuil1'!plagesource"
'2. Reporte sur la feuille 2, dans la plage "plagesource2" du fichier b MàJ, les importations de données de la "plagesource" du fichier a source
Worksheets("Feuil2").Range("plagesource2").Value = "=plage2"
'Ok import des données de "plagesource" du "fichier a" dans la "plagesource2" du "fichier b"
End Sub
Voili, Voilà, .Rar avec les fichiers en P.J
ybs a écrit :Une petite question liée, si je veux avoir le nombre de lignes de mon fichier A j'ai utilisé:
Nbreligne = Range("A:A").SpecialCells(xlCellTypeLastCell).Row
Mais si je change le nombre de lignes du fichier A, ça garde toujours la première valeur enregistré et non pas celle modifiée (Après ajout ou suppression de lignes). Comment puis-je résoudre ce problème?
Je vous remercie encore une fois
Oui les adresses de plage étaient fixes, le truc c'est de trouver des moyens de les rendre mobiles
genre :
numligne = 1
range("A" & numligne)
numligne = numligne + 1
Avec une boucle do while loop, ce serait possible de coller une valeur une à une, en fonction de l'adresse ci dessous
Mais c'est long à programmer, j'ai fais au plus simple.
Sur le code compteur de lignes utilisées regarde ça :
http://www.info-3000.com/vbvba/selectioncellule/selectioncellule.php
Bravo !
Et merci de m'en faire profiter ...
Bye !
Salut gmd,
J'ai essayé de faire pareil pour importer les données de deux fichiers mais un fichier des deux s'ouvre, comment je peux faire?
gmb a écrit :Bonjour et bienvenue sur le forum
un essai à tester. Te convient-il ?
Sub Importer() Workbooks.Open Filename:=ThisWorkbook.Path & "\Fichier A.xlsx" Columns("A:A").Copy ThisWorkbook.Sheets(1).Range("A1") ActiveWorkbook.Close End Sub
Bye !
Hi,
Gmb te le dira aussi, c'est normal qu'il n'y a que le fichier A qui s'ouvre, la procédure est fixe pour ne gérer que ce fichier
Ta demande initiale était comment importer les données d' 1 fichier source, dont le nom est connu, la procédure y répond.
Si tu demande ensuite d'importer des données de partout, ce n'est plus le même process, avant de coder, il faut savoir ce qu'y va être fait précisément, ce n'est pas une I.A. autonome qui jouerait au magicien, mais un automate que tu construis pour répondre à une demande particulière, tu dois donc d'abord changer ton raisonnement dans la prise en compte des problématiques.
Là par exemple tu pourrais dupliquer la procédure et sur la 2e indiquer le nom du fichier b, tu pourrais aussi transformer le nom en variable, qui serait définit dans une cellule du classeur d'importation, est dans ce cas, au lieu du nom tu aurais range("A1").value.
Tu pourrais aussi faire une boucle, qui ouvrirait un répertoire et balayerait tous les fichiers excel pour en importer les données, etc....
Merci pour la réponse. Justement est ce qu'il y a moyen d'adapter le code de gmb pour le cas d’importation de deux fichier?
Je suis un novice en VBA c'est pour cela que je trouve encore des difficultés.
ça :
1. Méthode duplication
Sub Importer()
Workbooks.Open Filename:=ThisWorkbook.Path & "\Fichier A.xlsx"
Columns("A:A").Copy ThisWorkbook.Sheets(1).Range("A1")
ActiveWorkbook.Close
Workbooks.Open Filename:=ThisWorkbook.Path & "\Fichier B.xlsx"
Columns("A:A").Copy ThisWorkbook.Sheets(1).Range("A1")
ActiveWorkbook.Close
End Sub
2. Comment rendre flexible un nom, en le reprenant à partir d'une cellule excel
Sub Importer()
'Le nom se trouve en A24
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & Range("A24").Text
Columns("A:A").Copy ThisWorkbook.Sheets(1).Range("A1")
ActiveWorkbook.Close
End Sub
3. Comment faire une importation à partir du nom d'une cellule excel et en utilisant une boucle, par exemple For Next, pour importer les données, à partir des noms d'un tableau à MàJ, au fur et à mesure, le fichier MàJ se trouve toujours au même endroit que les fichiers sources
Sub Importer()
'déclaration de variable comme étant un nombre
dim numligne as integer
numligne = 24 'pour commencer à la ligne 24
'Le tableau comportant les noms commence en A24 et se termine en A25, c'est un tableau fixe ne gérant que 2 fichiers, mais dont les noms peuvent changer
for i = 1 to 2
'Le nom se trouve en A24 au premier passage, puis en A25 au 2e passage, numligne, indique le numéro de ligne
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & Range("A" & numligne).Text
'le fichier actif est le fichier ouvert
Columns("A:A").Copy ThisWorkbook.Sheets(1).Range("A1")
'fermeture du fichier ouvert source
ActiveWorkbook.Close
'on ajoute +1 en fin de procédure pour le prochain passage de boucle, pour déplacer la prise de ligne vers le bas du tableau
numligne = numligne + 1
'fichier suivant
next
End Sub
Comme tu apprends, mon but c'est d'essayer de te mettre sur la voie, pour que tu comprenne ce qu'il faut faire pour trouver ce que tu ne connais pas encore, c'est la clef pour avancer et traiter des problèmes complexes et quelque soit le domaine.
Je t'ai mis 3 exemples, il est possible d'envisager ton problème sous différents angles.
Un super merci!
Ça traite tous les cas possible. Mais j'ai encore un problème lors de l’exécution:
Mon fichier qui est censé rester fermé, s'ouvre et m'afficher le message "voulez-vous enregistrer les modifications" alors j'ai fait que copier des colonnes.
Je pense que c'est un problème lié à ce fichier, comment puis-je y remédier?
Merci par avance.
Cdlt,
Hi,
Je sais pas t'a utilisé quel scénario, celui où il faut mettre à jour d'1 fichier source ou plusieurs fichiers sources ?
T'a utilisé quel code ? T'a fais les éventuelles modifs à faire ?
Dans ce topic, y'a 2 scénarios et 4/5 codes pour y répondre, dis moi ce que t'a pris je teste pour voir ce qu'il manque et je te dis.
Re-bonjour,
En fait, j'ai utilisé ce code:
Workbooks.Open Filename:=ThisWorkbook.Path & "\FichierB.xlsm"
Sheets(1).Columns("A:A").Copy ThisWorkbook.Sheets("Fichier de suivi").Range("E1")
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
J'ai enfin évité le message d'enregistrement qui s'affiche par l'utilisation du (ActiveWorkbook.Saved = True)
Mais le fichier s'ouvre pendant un instant avant de se fermer. Est ce qu'il y a moyen de ne pas l'ouvrir carrément?