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 ?! Le code que j'ai remonté est peu flexible, il faut que tout soit indiqué de manière exacte.

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 on copie toute la feuille du fichier source > dans le fichier b à mettre à jour, mais problème de temps, car la copie, même s'il n'y a que 30 données dans le classeur, prend plusieurs minutes

2/ Méthode à-la-va-vite, ne coller que les colonnes nécessaire prévus à l'avance, mais 1 colonne, prend chez moi 20s et toute les cellules vides importées du fichier a source, prennent erreur/valeur dans le fichier b à MàJ , c'est pas pro, patron pas content

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?

Rechercher des sujets similaires à "importer colonnes fichier ouvrir"