IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment importer des données d'un classeur fermé [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut Comment importer des données d'un classeur fermé
    Bonjour à tous,

    Ce sujet est abordé à de nombreuses reprises ici et figure également dans la FAQ, mais à ce stade, je n'ai pas encore commencé l'écriture de mon code.

    Je souhaite avant tout être sur de la méthode la plus appropriée pour mon cas particulier donc voici une description rapide :

    - Il s'agit d'une feuille de facturation mensuelle assez complexe (du moins pour moi) dans laquelle j'ai déjà conçue plusieurs petites macros qui fonctionnent très bien.

    - Avec une seule feuille, le classeur pèse entre 1 à 1.4 Mo selon la version, ce qui est énorme à priori.

    - Le fonctionnement de ce classeur est de recopier la feuille précédente en l'incrémentant de 1 chaque mois. Une macro permet de récupérer les données du mois précédent puisque tout se fait en cumulé, pour déterminer la facturation du mois en cours.

    Le hic, c'est que le classeur devient au fil des mois énorme et difficilement manipulable. Je souhaite donc à présent incrémenter les classeurs et non plus les feuilles pour résoudre ce problème.

    Chaque mois, une copie du fichier précédent sera faite et renommée en l'incrémentant de 1. Cela devrait être la seule variable. Le nombre d'occurence est limiter à 50.

    La feuilles d'origine possède un tableau destiné à recevoir et stocker les données des mois précédent et les cellules à importer sont parfaitement définies et connues.

    Dans le cas où tous les classeurs sont dans le même répertoire, est-il nécessaire d'avoir le chemin complet ? si oui, celui ci deviendrait alors une variable puisque potentiellement différent d'un utilisateur à l'autre.

    Autre difficulté, ce classeur est mis à la disposition des entreprises et leurs compétences sont souvent limitées sans parler des versions anciennes d'Excel, je pars du principe que cela doit fonctionner pour 2003.
    Difficile donc de compter sur eux pour activer tel ou tel fonction de VB pour que les macros fonctionnent.

    Actuellement, j'utilise Excel 2007 et Excel 2008 mac, mais ce dernier pose problème à présent.

    Si quelque chose vous échappe dans mon explication, n'hésiter pas à demander, se sera avec plaisir que je développerai.

    J'espère que vous pourrez me mettre sur le bon chemin pour me lancer dans cette tâche qui s'avère délicate. Je suis preneur de tous conseils.

    Pour info, je ne suis pas un béné complet en programmation, je pratiquais en loisir il y a plusieurs années (dos, pascal, turbo pascal, machine) et je n'ai réussi mes petites macros que par tatonnement et analogie avec des exemples trouvés sur le net sans forcément comprendre tout ce que je faisais. Bref, en VB, je suis plus que débutant.

    Merci par avance de votre aide
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    salut demongin,

    si j'ai bien compris, tu veux chaque mois faire ces 2 étapes :

    1. dupliquer ton classeur actuel (celui du mois en cours qui se termine)
    2. incrémenter de 1 le classeur que tu viens de copier-coller (pour le mois qui commence)

    La 2e étape, elle consiste en quoi précisément ? Juste renommer différemment le nom du fichier excel ?
    Par ex. Factures46 est dupliqué en Factures47 ?

    Il n'y aurait pas des modifs à faire à l'intérieure du nouveau classeur ? Je préfère être sur de bien comprendre...


    Pour ce qui est de dupliquer un fichier excel dans le meme répertoire et d'incrémenter son nom, j'ai déjà un ébauche fonctionnelle que j'avais utilisé il y a quelques semaines. Je la retrouve, et j'édite mon post

    edit : voila le code.

    Il y'a 3 variables
    1. nomfichier : nom du classeur excel que tu veux copier-coller

    2. nomfichier2 : nom du futur classeur excel. Lui, je ne sais pas comment le créer, il faut que tu me donnes + d'infos sur nomfichier. Si le fichier a toujours le même genre de titre, on pourra par exemple utiliser une fonction qui supprime 1 caractères à droite (par exemple le n° : factures2007_1 devient factures2007_), puis incrémente. C'est une ébauche hein, vu qu'à partir d'octobre il faudra virer 2 caractères. Bref, à toi de préciser !

    3. chemin : emplacement du fichier actif (celui d'où tu as lancé le programme).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    option explicit
     
    '======================================
    Public Sub DUPLICATION_FICHIER_EXCEL()
    '======================================
     
     
    'lexique
     
    dim NOMFICHIER as string	'nom du fichier actuel
    dim NOMFICHIER2 as string	'nom du fichier qui va être créé
    dim CHEMIN as string		'chemin du répertoire où se trouve le classeur à dupliquer
     
     
    'algorithme
     
    NOMFICHIER = ActiveWorkbook.Name
    'récupère le titre du fichier excel ouvert et actif, sans le suffixe .xls
     
     
    CHEMIN = Application.ActiveWorkbook.Path
    'récupère le chemin du dossier où se trouve le fichier excel ouvert et actif
    'ex. : D:\Travail\Factures2009
     
     
    <code pour incrémenter le nom du fichier de 1>
     
     
    ActiveWorkbook.SaveAs (CHEMIN & "\" & NOMFICHIER2 & ".xls")
    'sauvegarde le fichier actuel sous le nom du nouveau fichier (NOMFICHIER2)
    'équivaut à créer une copie du fichier
    Dis-moi déjà si ce premier jet correspond à peu près à ton besoin

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Bonjour Barbare_tf,

    Pour 1 et 2, oui c'est ça. Le fichier initial s'appelle AE1 (pour Etat d'Acompte 1), le mois suivant, on fait une copie et on le renomme EA2, ainsi de suite...

    C'est ce qui est fait à présent, mais à l'échelle de la feuille (onglet). Dans ce que je prévois, il n'y aura plus qu'une seule feuille par classeur (fichier) et son nom pourra refleter celui du fichier si nécessaire.

    Dans la feuille actuelle, à chaque nouvelle facture (se sont des situations de travaux pour être précis), l'utilisateur copie/colle la feuille précédente, la renomme comme vu précédement puis choisi dans un bouton avec liste déroulante le N° de la situation qu'il remplie, évidemment, c'est le même N° que pour le nom de la feuille. Une macro entre alors en fonction, importe un certain nombre de donnés pour modifier toutes les cellules faisant référence à l'état précédent. Ainsi, puisque l'avancement des travaux n'a pas encore été incrémenté, la situation est à 0€, signe que tout a bien fonctionné. L'utilisateur n'a plus qu'à saisir le % d'avancement de ces travaux pour chacunes des prestations et la facture se fait toute seule (là, je simplifie, mais en fait les calculs prennent en compte les révisions de prix, les primes, pénalités, sous-traitants, avance et résorption de démarrage, etc...). Exemple pour une presation donnée :
    EA1 => M-1 : 0% // M : 20% // cumulé : 20%
    EA2 => M-1 : 20% // M : 10% // cumulé : 30%

    Je ne sais pas si je suis claire car je suis dedans et je ne me rend pas vraiment compte si tout est facilement compréhensible alors n'hésitez pas...
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Merci d'avoir retrouver ce code,

    Cela pourra me servir et je l'intégrerai peut-être, mais je ne cherche pas à automatiser la duplication de mon fichier pour le moment.

    Je souhaite une fois la copie faite (manuellement ou non du coup), qu'une macro puisse rappatrier par l'intermédiaire de mon bouton (actuellement fonctionnel d'une feuille à la précédente) les données du classeur (fichier) précédents et cela avec toutes les contraintes que j'ai énuméré dans les posts précédents.
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    ah d'accord, je vois mieux la situation maintenant. Enfin j'ai pas tout compris à partir de "Une macro entre alors en fonction"...

    Je sais que c'est difficile d'etre clair quand on s'explique, j'ai aussi ce probleme quand j'expose un poblème sur un forum...

    Bon, revenons au sujet principal.

    D'après ton dernier message, il serait mieux d'avoir un bouton cliquable qui s'appelle "Rapatrier l'AE précédent", non ?

    1.
    Ce bouton appelle un programme qui déniche l'AE précédent (obligatoirement situé dans le même dossier -je dis obligatoirement car ca simplifie le travail).

    2.
    Le programme ouvre la feuille du classeur précédent, celle dans laquelle on va récupérer les données

    3.
    Le programme fait le tri, et copie-colle des cellules (cellules contenant les données)


    Est-ce bien ça ? A ce moment-là il faudrait savoir à quoi ressemble la présentation des données à récupérer : une colonne ? 2 ? plusieurs plages de cellules ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Vous avez tout compris et parfaitement synthètisé,

    La macro dont je parle est ratachée au bouton cliquable dont vous parlez et fonctionne à l'échelle des feuilles. Pour le nom du bouton, étant donné les utilisateurs, je préfère éviter d'être trop explicite, mais bon, c'est accessoire.

    Je préférerai que le classeur précédent reste fermé, surtout si à son tour il ouvre le précédent...

    Les données à récupérer sont dans des cellules non contigues; par contre, du fait de la mise en forme, les données sont souvent dans des cellules fusionnées
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  7. #7
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Premièrement est ce que le classeur dont tu veux récupérer les données a une structure comme une base de donnée?

    Extrait du tutoriel
    Les informations fournies dans ce document supposent que le classeur est structuré comme une vraie base de données:
    La première ligne sert à indiquer le nom des champs, à partir de la première colonne.
    Les champs respectent les bonnes pratiques dans la déclaration des Noms:
    * Nom le plus court possible.
    * Pas d'espace.
    * Pas d'accent.
    * Pas de caractères spéciaux.

    N'est-il pas préférable de désactivé la mise a jour de l'écran d'ouvrir le classeur de le manipuler puis de le fermer?
    Cela serais beaucoup plus simple a réaliser et l'utilisateur ne verrait rien.
    (un classeur de 1M est loin d'être gros pour les ordinateur "moderne" j'ai des fichier de 11Mo qui s'ouvre facilement)
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Bonjour Krovax,

    Non, le classeur ne se présente pas comme une base de donnée. La feuille s'étant sur 1835 lignes et jusqu'à la colonne GF. Elle est organisée en plusieurs pages ayant différents thèmes, le tout avec un affichage paramétrable par macro en fonction des besoins optionnels de l'utilisateur. Il y a donc selon une présentation directement éditable des cellules d'information, de formules, de reports et de saisie sans organisation de type base de donnée, j'entends par là une abscisse et une ordonnée faisant référence toujours à une valeur spécifique (pas très clair tout ça...)

    Ouvrir le fichier en arrière plan en quelque sorte, pourquoi pas mais ne faut-il pas activer une option dans VB pour que cela marche ?

    Si je reste sur le mode de fonctionnement actuel, le fichier pourra peser 70Mo, est-ce vraiment raisonnable ?
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    (re)bonjour à vous 2,

    en simulations j'ai déjà eu 1 fois un fichier de 75Mo, sur une bécane honnête (XP - 2gio de RAM - AMD double coeur 2ghz), et y'en avait pour 15 secondes à enregistrer...

    à mon humble avis, vaudrait mieux séparer les fichiers avec 1 mois = 1 fichier. En plus c'est plus facile à archiver non ?


    Pour revenir au programme, les cellules fusionnées et/ou mises en forme ne posent aucun problème (du moins à ma connaissance).

    Que le classeur précédent reste fermé pendant que le programme tourne, là aussi il n'y a aucun problème (Cf. désactivation de la mise à jour de l'écran dont parle Kovax : pendant toute la durée d'exécution du programme, l'utilisateur ne verra rien à part la feuille où se situe le bouton).

    Par contre, quelque chose a du m'échapper quand j'ai lu ça :

    le classeur [...] surtout si à son tour il ouvre le précédent...
    A première vue (j'insiste la dessus), il me parait difficile de créer un programme qui remonte le temps en ouvrant plusieurs fichiers, les uns derriere les autres...

    Y a-t-il la possibilité de voir un extrait du fichier, pour voir les cellules à récupérer ?

  10. #10
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Premièrement si le fichier n'est pas organisé comme une base de donnée tu es obligé de l'ouvrir (d'après ce que j'ai compris du tuto). Du coup si le fichier est trop lourd soit tu le découpe en plusieurs fichier, soit tu l'organise en base de donnée (ou alors tu prend to mal en patience pendant l'ouverture et le traitement)
    Voila le lien vers le tuto pour voir si ton classeur convient

    Pour l'ouvrir en arrière plan en fait ce n'est pas de l'arrière plan c'est juste que tu empêches juste l'écran d'afficher les changement du coup l'utilisateur en peux pas voir que le fichier s'ouvre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.screenUpdating=false
    'code
    Application.screenUpdating=true

    Pour le reste je n'ai pas trop compris ce que tu attendais. Le mieux serais que tu commence le code et quand ca coince tu nous expose le problème.
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par barbare_tf Voir le message
    (re)bonjour à vous 2,

    en simulations j'ai déjà eu 1 fois un fichier de 75Mo, sur une bécane honnête (XP - 2gio de RAM - AMD double coeur 2ghz), et y'en avait pour 15 secondes à enregistrer...

    à mon humble avis, vaudrait mieux séparer les fichiers avec 1 mois = 1 fichier. En plus c'est plus facile à archiver non ?


    Pour revenir au programme, les cellules fusionnées et/ou mises en forme ne posent aucun problème (du moins à ma connaissance).

    Que le classeur précédent reste fermé pendant que le programme tourne, là aussi il n'y a aucun problème (Cf. désactivation de la mise à jour de l'écran dont parle Kovax : pendant toute la durée d'exécution du programme, l'utilisateur ne verra rien à part la feuille où se situe le bouton).

    Par contre, quelque chose a du m'échapper quand j'ai lu ça :



    A première vue (j'insiste la dessus), il me parait difficile de créer un programme qui remonte le temps en ouvrant plusieurs fichiers, les uns derriere les autres...

    Y a-t-il la possibilité de voir un extrait du fichier, pour voir les cellules à récupérer ?
    Plus facile à archiver ? c'est une question de point de vue, moi je préfère avoir un fichier qui contient tout plutot que cinquante ! Je suis maître d'oeuvre, je range donc actuellemement toutes les situations de travaux de toutes les entreprises dans un même dossier et cela pour chacun des chantiers. A mon sens, plus simple, c'est difficile.
    Si ce que je dois faire maintenant à cause du poids fonctionne, je devrais créer un sous dossier pour chaque entreprise contenant tous le fichiers de situation mensuelle, mais cela ne me gène en rien.

    Ok pour les cellules fusionnées, je pensais la même chose.

    Ok pour la désactivation, mais il faut que je retrouve les différentes solutions car j'en ai finalement trouvé beaucoup et plusieurs font état de l'activation préalable de Microsoft ActiveX Data Object X.X Library.
    Or, pour qu'il n'y est pas de problème, il faut que les entreprises ne soit pas confrontées à ce genre de chose, se serait la pannique. Il faut juste qu'ils clic sur un ou quelques boutons et qu'ils saissisent leur % d'avancement du mois.

    C'est la raison de ce tuto, savoir sur quelle méthode partir et bien sur qu'elle soit la plus efficiente.
    Chose important que j'ai omise, c'est qu'il peut y avoir des échange par mail et là, la taille devient problématique très tôt (je sais, il y a le ftp, etc..., mais il est important de rester très simple)

    Pour l'histoire de remonter dans le temps, je me suis un peu emporter et j'aurai du réfléchir un peu. J'ai en fait penser à une réaction en cascsade si la macro est conditionnée à l'ouverture, mais elle sera sur le bouton et ciblé sur le fichier précédent, donc pas de soucis.

    Je vais télécharger le fichier sur un site d'hébergement et je ferai suivre le lien. Et voilà : http://www.gigasize.com/get.php?d=9vcc5qbsmdd
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Krovax Voir le message
    Premièrement si le fichier n'est pas organisé comme une base de donnée tu es obligé de l'ouvrir (d'après ce que j'ai compris du tuto). Du coup si le fichier est trop lourd soit tu le découpe en plusieurs fichier, soit tu l'organise en base de donnée (ou alors tu prend to mal en patience pendant l'ouverture et le traitement)
    Voila le lien vers le tuto pour voir si ton classeur convient

    Pour l'ouvrir en arrière plan en fait ce n'est pas de l'arrière plan c'est juste que tu empêches juste l'écran d'afficher les changement du coup l'utilisateur en peux pas voir que le fichier s'ouvre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.screenUpdating=false
    'code
    Application.screenUpdating=true

    Pour le reste je n'ai pas trop compris ce que tu attendais. Le mieux serais que tu commence le code et quand ca coince tu nous expose le problème.
    Ce n'est effectivement pas une base de donnée selon moi, mais il est possible de récupérer pour autant des données d'un classeur fermé en faisant seulement =c:\blabla...
    Je pourrai donc faire ça pour chaque cellule du tableau récapitulative stockant les reports, mais j'aurai alors une formule différente à écrire 768 fois, 16 valeurs x 48 mois (limité à 4 ans de chantier possible) (nb, j'ai dit 50 tout à l'heure pour simplifier). Je ne suis pas fainéant, mais bon, plutôt fastidieux...

    J'ai lu le tuto que tu me proposes et il y a des chances que je parte de là, mais il est fait référence à des fonctions ODO nécessitant l'activation préalable de "plugin" si j'ai bien compris. Si cela est nécessaire pour l'écriture du code, pas de problème, si cela est nécéssaire pour chaque personne qui sera amenée à s'en servir sur son ordinateur, ce n'est pas possible.

    Pouvez vous me dire ce que vous n'avez pas compris dans mes propos ?
    J'ai trouvé plusieurs code pour ce type d'importation qui font appel à des fonctions différentes que se soit sur ce forum ou encore sur d'autres, je ne sais pas si elle marche mais il est sûr qu'un copier/coller ne sera pas suffisant.
    C'est pourquoi, en fonction de mes contraintes, je souhaité être orienté vers une méthode appropriée pour me lancer dans la construction de mon code et ainsi ne pas perdre du temps vers une solution vouée à l'échec.
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  13. #13
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Citation Envoyé par demongin Voir le message
    mais il est possible de récupérer pour autant des données d'un classeur fermé en faisant seulement =c:\blabla...
    La tu m'étonnes, je ne me suis jamais vraiment intéressé a la lecture de fichier fermé (je préfère les fichier txt) mais si c'est aussi simple que ca... J'aimerais bien voir le code qui permet ceci.

    Et oui les plugin doivent être appliqué sur chaque ordinateur mais j'avais trouvé un code qui permet d'activer des plugins (pour ce que j'en ai compris), en le mettant au début du code cela ne pose plus de problème

    Pour ce qui est de ce que je n'ai pas compris a tes propos c'est surtout que je n'ai pas essayé. Je voulais juste te pousser gentillement a faire ton code sans attendre qu'un autre le fasse (surtout que ta demande est bien précise)
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Ce n'est même pas un code, tu saisis cela par exemple dans n'importe qu'elle cellule de ton fichier ouvert et c'est tout :
    ='C:\Documents and Settings\Hervé\Bureau\[EA1.xls]EA1'!$M$29
    Tu récupère instanément la valeur de la cellule en question. D'ailleurs, cette méthode est citée en premier dans le tutoriel indiqué plus haut.

    Le soucis tient dans le fait qu'on ne peut pas intégrer de variable liée au nom de fichier et que les commandes Indirect et Concatener ne permettent pas d'accéder à un fichier fermé, d'où le passage par une macro.

    Je ne demande pas à ce que l'on me fasse le code, je l'ai précisé dans mon premier post. Si j'ai le temps, je diffuserai ici les multiples solutions censées répondre à cette tâche et vous comprendrez alors pourquoi je voudrai juste être orienté dans telle ou telle direction.

    Interressant la possibilté d'automatiser le lancement des plugins. Vous pouvez m'en dire plus ou m'orienter vers quelque chose.
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    Autre difficulté, ce classeur est mis à la disposition des entreprises et leurs compétences sont souvent limitées sans parler des versions anciennes d'Excel, je pars du principe que cela doit fonctionner pour 2003.
    Difficile donc de compter sur eux pour activer tel ou tel fonction de VB pour que les macros fonctionnent.
    Tu pourrais utiliser une instance LateBinding pour résoudre ce souci.

    Comment activer une référence pour piloter une autre application ?


    bonne soirée
    michel

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Merci SilkyRoad
    Je pense être sur la bonne voie à présent pour pouvoir utiliser les connexions ADO qui vous avez développées dans Lire et écrire dans les classeurs Excel fermés.
    J'ai déjà bien avancé sur l'importation, il me reste à régler un souci de mise en forme car mes chiffres se transforme en date une fois collé et la commande IMEX=1 ne semble pas avoir d'effet. Ensuite, il faudra que je gère la variable (incrémentation de 1) du nom de fichier liée à une plage de donnée s'accroissant d'une ligne à chaque fois.
    Par rapport à la discussion sur la base de donnée, je me suis rendu compte que mon tableau regroupant tous mes reports pouvait en fait être assimilé à cela, rendant plus facile l'importation.
    Il faut encore que je mette tout ça au point.

    En revanche, je viens de prendre connaissance de votre instance LateBinding et je suis un peu perdu sur ce que je dois faire concrètement sachant que je dois activer Microsoft ActiveX Data Objects 2.0 Library. Quel fichier pointer et comment être sur qu'il sera au même endroit pour tout le monde ?
    Pouvez-vous m'aider à écrire cet partie de code de s'il vous plait ?
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  17. #17
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    Bonjour

    En revanche, je viens de prendre connaissance de votre instance LateBinding et je suis un peu perdu sur ce que je dois faire concrètement sachant que je dois activer Microsoft ActiveX Data Objects 2.0 Library
    Tu n'a plus besoin d'activer une référence si tu utilises une instance LateBinding.

    http://support.microsoft.com/?id=242375


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Dim Source As Object
     
        Set Source = CreateObject("ADODB.Connection")
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Chemin & "\" & Fichier & _
            ";Extended Properties=""Excel 8.0;HDR=No;"";"

    bonne journée
    michel

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Bonjour et MERCI

    En voilà une nouvelle, qu'elle est bonne...

    Je vais tenté d'intégrer cette instance et de finir mon code.
    Je reviendrai vers vous si je ne vois pas le bout du tunnel.
    J'afficherai ici le résultat pour que tous le monde puisse en profiter.

    Merci encore...
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

  19. #19
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    bonjour à vous 3,

    j'avoue que pour l'archivage en fait c'est pas si bien de tout séparer...

    pour revenir au programme, je ne suis pas sur d'etre en mesure de donner la solution, mais il me semble qu'il y a un moyen de feinter excel pour intégrer des formules de type
    ='C:\Documents and Settings\Hervé\Bureau\[EA1.xls]EA1'!$M$29

    Je m'explique : la formule doit intégrer le chemin du fichier, le nom du fichier, le nom de la feuille, puis le nom de la cellule courante. Le tout est séparé par diverses caractères, dans l'ordre :
    \ [ ] '!

    Si on décompose la formule et qu'on y intègre des variables, on peut faire faire ce qu'on veut par le programme !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    option explicit
     
    public sub EXEMPLE()
     
    dim chemin_fichier as string
    dim nom_fichier as string
    dim nom_feuille as string
    dim LIG as integer   'n° de ligne pour la cellule courante 
    dim COL as string    'lettre pour le nom de colonne de la cellule courante
    dim i as integer
    dim j as integer
     
     
    chemin_fichier = thisworkbook.activepath
    'récupère le chemin du fichier, sans le "\" à la fin
     
    nom_fichier = inputbox("nom du fichier à récupérer ?")
    'récupère le nom du fichier excel sans le suffixe .xls
     
    nom_feuille = activesheet.name
    'récupère le nom de la feuille active
     
    'on crée une boucle qui parcourt une plage de cellules
    'For ........ to ........
     
    cells(i,j) = chemin_fichier & "\" & "[" & nom_fichier & ".xls" & "]" & nom_feuille & "'!" & COL & LIG
    'la cellule courante de coordonnées i et j prends la valeur d'une cellule de notre choix dans un autre classeur
     
    'incrémentation des compteurs
     
    'Next
    'Fin de la boucle

    est ce que vous voyez le concept ? vous pensez que ca pourrait bien marcher ? je parle à vous 3

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 83
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par SilkyRoad Voir le message
    Bonjour
    Tu n'a plus besoin d'activer une référence si tu utilises une instance LateBinding.

    http://support.microsoft.com/?id=242375


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Dim Source As Object
     
        Set Source = CreateObject("ADODB.Connection")
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Chemin & "\" & Fichier & _
            ";Extended Properties=""Excel 8.0;HDR=No;"";"

    bonne journée
    michel
    Bonsoir,
    Je viens d'essayer d'intégrer votre instance dans la première évolution de mon code et cela ne marche pas si Microsoft ActiveX Data Objects 2.0 Library n'est pas activer au préalable.
    Une erreur de compilation indique : Type défini par l'utilisateur non défini.
    Je vois bien qu'il y a un souci avec les commandes ADO, mais je ne sais pas comment les gérer.
    Avez-vous une idée de ce que je dois faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Sub extractionValeurCelluleClasseurFerme()
     Dim Source As Object
     Dim Rst As ADODB.Recordset
     Dim ADOCommand As ADODB.Command
     Dim Fichier As String, Cellule As String, Feuille As String
     
     'Adresse de la cellule contenant la donnée à récupérer
     Cellule = "a1:e1"
      'Pour une plage de cellules, utilisez:
      'Cellule = "A4:C10"
     
     Feuille = "db$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
     'Chemin complet du classeur fermé
     Fichier = "C:\Documents and Settings\Hervé\Bureau\db1.xls"
     
     Set Source = CreateObject("ADODB.Connection")
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Fichier & _
            ";Extended Properties=""Excel 8.0;HDR=No;"";"
     
     Set ADOCommand = New ADODB.Command
     With ADOCommand
       .ActiveConnection = Source
       .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
     End With
     
     Set Rst = New ADODB.Recordset
     Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
     Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
     Range("a1:e1").CopyFromRecordset Rst
     
     Rst.Close
     Source.Close
     Set Source = Nothing
     Set Rst = Nothing
     Set ADOCommand = Nothing
    End Sub
    MacBook Pro 15" - Apple Cinema Thunderbolt 27" x2u - High Sierra - Office 2019 - Windows 10 Pro sous Parallels - MS Project 2019

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] Importation des données sur plusieurs fichiers fermés
    Par starid dans le forum Excel
    Réponses: 8
    Dernier message: 18/07/2009, 17h54
  2. Réponses: 4
    Dernier message: 02/10/2007, 11h30
  3. comment importer des données dans une table paradox
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/08/2007, 18h32
  4. comment importer des données bo sur excel
    Par Gecl.paris dans le forum Deski
    Réponses: 1
    Dernier message: 12/02/2007, 10h54
  5. [VBA-E]Importer des données de fichiers excel fermés
    Par bart64 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/04/2006, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo