Importer des colonnes d'un autre fichier Excel sans l'ouvrir

Le problème de la save est due au fait que ton fichier source est modifié à un moment donné, ce n'est pas la fonction copie qui est en cause, le problème peut survenir à cause d'une macro à ouverture de fichier par exemple, si ton fichier source comporte une action événement et qu'elle est activée, alors ça modifie ton fichier et il demande de le sauvegarder.

Pour squizzer la demande de sauvegarde, tu peux utiliser aussi désactiver les événements durant la procédure :

1. La désactivation d'événements durant la procédure :

Application.EnableEvents = False 'Début de procédure, après déclaration de variables

Application.EnableEvents = true 'fin de procédure avant end sub

2. Ou Indiquer lors de la fermeture, de ne pas sauvegarder :

ActiveWorkbook.Close savechanges = False

Si tu indique True, alors tu réponds en auto à la question voulez-vous sauvegarder ? > Oui

Pour ça :

"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?"

Voir mon post du : 11 Août 2015, 23:24

Ta la procédure, les fichiers en Zip.

Pour vérifier le déroulé d'actions que fait ta macro, tu te place dans la macro à lancer, tu fais F8, tu verra ta ligne être surlignée en jaune, tu rappuis sur F8 et ça confirme l'action à faire et ça passe à la suivante, etc etc, jusqu'à End Sub.

A partir de là, tu seras capable de savoir ou ça bloque.

Et si tu veux avoir des infos pour contrôler qui ne se trouve pas dans ta fenêtre variables locales, tu créé des variables qui te permettrons de faire un contrôle sur des questions précises, exemple, savoir à un moment donner, quel est le nom du fichier qui est en cours de traitement :

Dim quelfichier As String 'à mettre en déclaration

quelfichier = ActiveWorkbook.Name 'à mettre avant de faire l'action à vérifier

Merci pour ta réponse.

En fait ça marche pour le message d'enregistrement Par contre je ne peux pas utiliser ton code car il requiert l'ajout d'une Macro dans le fichier source et ce n'est pas envisageable pour mon cas C'est pour cela que je cherche une manière simple d’importation sans pour autant exécuter une Macro dans le fichier source

Oui je suis en train de regarder :

Mon problème vient du fichier source fermé, il y'a besoin de savoir ce qu'il faut copier de manière flexible, là j'essaye de créer une boucle par cellule non vide, bouclant par colonne, mais j'ai des difficultés à écrire la variable d'adresse reprise par RefersTo.

Après une fois la plage du fichier source définit, c'est plus simple, on définit la plage inutilisée du fichier à mettre à jour et il colle en dessous, mais là, je bloque sur l'adresse de plage à copier.

A moins que tu colle des plages prédéfini et dans ce cas c'est plus simple, mais si tu importe des données à partir de fichier qui doivent rester fermés sans rien connaitre, là problème, plus dur de traiter un fichier fermé qu'un fichier ouvert.

Voilà déjà sur quoi je suis, là maintenant :

le nom des fichiers source si situent dans la colonne F à partir de F2 jusqu'à F3

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
    'déclaration de variable comme étant un nombre
    Dim numligne As Integer

    Dim numlignecopy As Double
    numligne = 2 'pour commencer à la ligne 2

        '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

    '1. Définition contenu variable chemin et nom du fichier source
    Cheminsource = ThisWorkbook.Path & "\"
    Fichiersource = Range("F" & numligne).Text

       '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
       numlignecopy = 1
    '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'!$A$1:$F$10"

        '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("Feuil1").Range("A1").Value = "=plage"

    '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"

    '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
    numlignecopy = numlignecopy + 1
    'fichier suivant
    Next

    'Ok import des données de "plagesource" du "fichier a" dans la "plagesource2" du "fichier b"

        End Sub

Donc à par si tu change les paramètres de plage à importer, moi je suis en train de sécher et à moins que tu trouve de ton coté, il faudra que quelqu'un sur le forum apporte sa science.

Et si on veut précisément copier de la colonne A du fichier Source jusqu’à la colonne D et les coller dans notre fichier. Il y a pas moyen?

C'est pas grave si ça prend du temps ou pas, l'objectif c'est que les fichiers sources ne s'ouvrent pas.

Le temps que ça prend, ça le prend aussi chez moi, 15 minutes plus tard il a finit son traitement pour un fichier !

Et il faut passer au 2e, copier une colonne entière, c'est énorme, si pas de limite de fin, c'est la gallère, voila déjà une démo avec les nouveaux paramètres, pour copier de cellule à cellule j'ai trouvé comment rendre flexible les adresses, si j'ai le temps je posterai la solution terminée sur le topic :

Dim Cheminsource As String, Fichiersource As String

Dim numligne As Double

Dim plagecopy As String

Dim numplage As Double

Dim nomplage As Variant

numligne = 2 'pour commencer à la ligne 2

numplage = 1

'Le tableau comportant les noms commence en F2 et se termine en F3, c'est un tableau fixe ne gérant que 2 fichiers, mais dont les noms peuvent changer

'For i = 1 To 2

'1. Définition contenu variable chemin et nom du fichier source

Cheminsource = ThisWorkbook.Path & "\"

Fichiersource = Worksheets(1).Range("F" & numligne).Text

plagecopy = "='" & Cheminsource & "[" & Fichiersource & "]Feuil1'!A:D"

nomplage = "plage" & numplage

ThisWorkbook.Names.Add nomplage, _

RefersTo:=plagecopy

Worksheets("Feuil1").Range("A:D") = "=" & nomplage

Worksheets(1).Cells.Select

Selection.Copy

Selection.PasteSpecial Paste:=xlPasteValues

si tu enlève les 3 dernières lignes de code, tu verra que ça ne donne pas une valeur numérique, mais =plage en formule.

Alors toujours bloqué, je sèche, problème avec les adresses de plage, tu trouvera ce que j'ai fais en PJ.

Dans l'absolue l'import marche, ça colle en-dessous de la ligne comme il faut, mais à partir du moment où j'importe un 2e fichier, étant donné que l'adresse de plage à copier dans le fichier source, ne colle pas à l'adresse de plage à coller dans le fichier à MàJ, ça me colle une erreur valeur, à la place des valeurs, mais les données sont bien dans les données importés, si je les collais en début de tableur, je les aurais....

Il me semblait avoir résolus ce soucis quand je m'y étais penché la 1er fois, mais là, impossible de résoudre ce problème.

Je sais pas, peut être en utilisant une feuille vierge dans le fichier à MàJ et en y important des fichiers sources les données > ensuite on y colle dans la 1er feuille en début de tableur > remise à zéro de la feuille qui sert d'import > 2e fichier source > importation > on colle les données en dessous des 1er données > etc etc

bloqué

tu remplace A1:D500 par A:D pour importation de la colonne A à la D

Voilà pour ma solution en utilisant une feuille pour transvaser sur les données.

Donc en suivant l'objectif de ne pas ouvrir les classeurs :

1> Crée une feuille temporaire, nommé "import" qui servira à transvaser les données importées des fichiers fermés

2> Le classeur va dans la liste des fichiers source à importer pour savoir quel fichier traiter

3> Lit dans les fichiers fermées les données à importer dans la feuille 'import' de la plage A1:D5000

4> Formate en valeurs, supprime les 0

5> Transvase dans la feuille 1 les données formaté de la feuille "import"

6> si encore des fichiers à traiter repart à 2, sinon FIN

Voilà, donc si tu veux, tu peux allonger de 5000 à 500 000 la colonne à prendre, mais moi ça demande beaucoup trop de temps, en l'état faudrait la nuit, juste pour importer des 0.....

J'ai pas de solutions à partir de ma méthode, pour cibler la plage de cellules comme il faudrait, pour la coller dans le classeur, sans passer par une feuille temporaire.

Après il reste la méthode de l'ADO, voir mon post avec le lien, mais chez moi, l'activex ne marche pas, donc je ne peux pas t'aider.

Moi plus d'idées à vendre, donc j'espère que ça va aller.

Bonsoir

Ce qui gène le plus ybs c'est la vision du fichier qui s'ouvre (d'après ce que j'ai (rapidement) lu)

A tester

 Sub Importer()
Dim CheminSource As String
Dim Ligne As Long, J As Long
Dim Ws As Worksheet

  Application.ScreenUpdating = False
  Set Ws = ThisWorkbook.Sheets(1)
  Ws.Columns("A:D").ClearContents
  CheminSource = ThisWorkbook.Path & "\"
  Ligne = 1
  For J = 2 To Range("F" & Rows.Count).End(xlUp).Row
    With Workbooks.Open(CheminSource & Range("F" & J) & ".xlsm")
      With .Sheets(1)
        .Range("A1:D" & .Range("A" & Rows.Count).End(xlUp).Row).Copy Ws.Range("A" & Ligne)
      End With
      .Close savechanges:=False
    End With
    Ligne = Ws.Range("A" & Rows.Count).End(xlUp).Row + 1
  Next J
End Sub

Bonjour,

Votre méthode marche parfaitement pour le cas d'un seul fichier source. Mais dès qu'on rajoute un deuxième fichier source en faisant la même chose. Les fichiers s'ouvrent avant de copier les colonnes

Peut-on l'adapter pour deux/plusieurs fichier sources?

Bonjour

Évite de cliquer sur citer pour écrire un message, cela encombre le post

La macro est faite pour 1 à .....(beaucoup) fichier(s)

For J = 2 To Range("F" & Rows.Count).End(xlUp).Row

Les fichiers sont listés dans la colonne F à partir de la ligne 2

ybs a écrit :

Les fichiers s'ouvrent avant de copier les colonnes

Oui mais cela n'est pas visible

Hello Banzaï,

En fait Ybs veut importer ses données sans ouvrir les fichiers source et la commande .open, ouvre le fichier.

Bonjour

Oui je sais mais il faut savoir que le fichier s'ouvre car on ne voit pas ce flash d'ouverture de fichier

Donc c'est transparent à l'utilisateur

Mais bon ce n'est moi qui décide, si cela ne plait pas je remballe mes affaires et à une prochaine

bonjour, svp j'ai vraiment besoin d'aide pour automatiser une saisie que je dois faire quotidiennement.

j'ai deux fichiers excel un pour le suivi de la production journalière ( comportant des feuilles jj-mm-aaaa) et un autre pour le rendement journalier ( comportant aussi des feuilles jj-mm-aaaa)

en effet, plusieurs colonnes des tableaux du fichier "production" se répètent dans l'autre fichier alors je veux faire une seule saisie dans "production" et l'autre sera rempli automatiquement (les colonnes de la journée correspondante dans le fichier "rendement)

vous trouverez ci joint des modèles des fichiers "production" et "rendement"

merci pour votre aide

56mon-dossier.zip (44.25 Ko)

Pas possible faire sa sans le macro?

Rechercher des sujets similaires à "importer colonnes fichier ouvrir"