Excel - Liens relatifs
Bonjour, je pensais que cette "fonctionnalité" pouvait être gérée aisément sous Excel mais je me rends compte que j'avais complètement tord
Pour faire simple et concis, j'ai un répertoire, nommé "gestion". Dans ce répertoire, j'ai un fichier xlsm nommé "membres" et un dossier source qui contient un fichier xlsx nommé "source".
En résumé
- \gestion\
niveau 1 - membres.xlsm
niveau 1 - \source\
niveau 2 - source.xlsx
Dans le fichier Excel xlsm j'importe les données du fichier source. Aussi j'importe dans ce même classeur ("membres") des données qui viennent de la feuille (toujours du fichier "membres") où cette feuille comporte les données du fichier "source" (dont en gros une boucle sur lui même mais d'une autre feuille).
Pour cela j'utilise dans Excel l'onglet "Données" puis ensuite je créé une Connexion. LE problème est que cette connexion est en chemin absolu, ce qui veut dire qu'elle part du lecteur "C:\blablabla". Hors je souhaiterais qu'elle soit relative. Soit 'source\source.xlsx'.
De cette manière, il est possible de déplacer le dossier "gestion", tous en gardant fonctionnel les liaisons dans les fichiers Excel.
J'ai fais pas mal de recherche Google et j'ai pas vraiment trouvé de réponse. Du moins des personnes ayant eu un problème similaire ont apparemment résolu leur problème, sauf que of course, il ne donne pas comment
Merci d'avance pour votre temps !
PS : soit je suis une quiche soit je suis sidéré que Excel ne propose pas cela de manière un minimum intuitif
Bonjour,
avec ce bout de code
ThisWorkbook.Pathqui vous donne le chemin jusqu'à votre classeur ouverte("Membres").
il suffira de la concaténer avec la suite
chemin = ThisWorkbook.Path & "source\source.xlsx" Bonjour,
M'est avis que la situation est plus simple que ta description !
Mais il faudrait que tu opères d'abord une révision-rectification : xlsx et xlsm ? qui est qui ? (ça change au long de ton propos, et par ailleurs xsl n'est pas Excel, c'est une feuille de style...)
Cordialement.
minanse a écrit :Bonjour,
avec ce bout de code
ThisWorkbook.Pathqui vous donne le chemin jusqu'à votre classeur ouverte("Membres").
il suffira de la concaténer avec la suite
chemin = ThisWorkbook.Path & "source\source.xlsx"
Ce qui voudrait dire que ma connexion au classeur doit se faire via macro et non via l'onglet "Données" etc.. ?
MFerrand a écrit :Bonjour,
M'est avis que la situation est plus simple que ta description !
Mais il faudrait que tu opères d'abord une révision-rectification : xlsx et xlsm ? qui est qui ? (ça change au long de ton propos, et par ailleurs xsl n'est pas Excel, c'est une feuille de style...)
Cordialement.
Yep, quelques erreurs de frappe c'est rectifié !
Ta focalisation sur "connexion" a tendance à brouiller les cartes... Il n'y a pas de "connexion" à proprement parler, tout se passe sur ton disque dur et dans l'application Excel !
J' ai l'impression que tu crées des liaisons entre tes 2 classeurs. Si c'est bien le cas, c'est par formules ! C'est Excel alors qui les mémorise et a la maîtrise de leur mise à jour éventuelle, et qui te questionnera s'il ne s'y retrouve pas...
Pour ma part, je considère que créer des liaisons entre classeurs aboutit quasiment toujours à se créer des difficultés supplémentaires inutiles. L'utilisation de VBA permet parfaitement de s'en passer : Minanse t'a expliqué comment pointer ton classeur xlsx à partir du classeur xlsm. Tant que la position relative des deux classeurs demeurent cela fonctionnera toujours.
Mais en utilisant VBA, tu n'as besoin de cet adressage que pour ouvrir le classeur xlsx à partir du classeur xlsm. Les 2 classeurs une fois ouverts dans l'application, tu n'as plus besoin d'aucun adressage, leurs noms suffit pour les manipuler et opérer toutes les opérations que tu as à faire.
Cordialement.
Quand je parle de connexion, c'est par rapport à la fonctionnalité Excel mise à disposition. Dans l'onglet "Données" -> "Connexions" -> une fenêtre s'ouvre "Connexions du classeurs" qui répertorie toutes les connexions.
Cela permettait d'importer simplement toutes les informations sans avoir besoin de passer par des lignes de codes de VBA. Qui plus est que je pouvais choisir les données à importer par des requêtes SQL.
Donc de ce j'ai compris, pour pouvoir réaliser ce que je souhaite, c'est du full VBA ?!
Si tu te connectes à des bases de données externes, tu utilises effectivement cette rubrique Connexions !
Mais je n'ai rien vu de tel dans tes propos : les relations établies entre classeurs Excel sont des Liaisons (c'est au même endroit).
Et les liaisons, on peut fort bien s'en passer en utilisant VBA...
Non en effet je ne me connecte pas à une base de données externe mais bien à un autre fichier Excel (qui est une bdd en soit).
Ok, merci ! Je vais donc chercher comment importer les données d'une feuille d'un fichier Excel dans une feuille d'un autre fichier Excel en VBA.
importer d'une feuille à une autre n'est pas compliquer en soi tout dépend des format qui faut adapter, avec un petit fichier et un peu d'explication l'équipe Excel-pratique pourra surement t'aider =)
Au final j'arrive à me débrouiller. Je suis des parties du tuto "Lire et écrire dans les classeurs Excel fermés" et j'arrive à faire ce que je souhaite pour l'instant. Je reviens vers vous si j'ai d'autre soucis.
Encore merci !
PS : j'attends un peu avant de mettre en résolu !
Petite question : lorsque j'appuie sur un bouton de ma feuille 1, je souhaite activer une macro sur la feuille 3.
J'arrive à ceci mais est-ce une bonne solution ?
Sheets("Liste Membres AG Perm & Temp").Select ' ma feuille 3
Application.Run ("Feuil3.refresh")
Sheets ("Tous les membres").Select ' ma feuille 1Sachant qu'au préalable je gèle l'écran :
Application.ScreenUpdating = FalseBonsoir,
Un bouton est un objet graphique que tu apposes sur une feuille. Il est bien à ce titre sur la feuille.
Une macro est un objet VBA qui est certes dans l'application, mais l'idée qui soit sur une feuille ou une autre est une notion absolument fausse !
Et qui ne peut qu'induire en erreur.
Essaie d'améliorer un peu ton code, en bannissant tout Select...
Select est toujours (sauf pour montrer un résultat à la fin, donc suivi par rien !) une opération parasite, en trop et qui qui occupe VBA à une action inutile qui ralentit l'exécution.
Il convient en lieu et place de qualifier ses expressions...
On ne voit pas grand chose de ton code, je ne vois donc pas ce qui justifie d'utiliser Application.Run alors que tu n'avais au départ qu'un seul classeur xlsm... ?
Et que donc la macro devrait normalement répondre au simple appel de son nom...
Cordialement.
Je me suis mal exprimé.
J'ai plusieurs feuilles dans mon fichier membres.xlsm. Ces feuilles sont construites grâce à la première feuille (celle qui contient les informations que je récupère du fichier source.xlsx), c'est la seconde partie des importations de données que j'ai décris auparavant.
J'importe mes données du fichier source.xlsx dans mon fichier membres.xlsm, dans une feuille 1, et dans celui-ci je crée plusieurs feuilles qui importent des données bien précise (suivant la valeur de certaines colonnes et donc grâce à la feuille 1) ceci via des requêtes SQL.
Sur chaque feuille j'ai un bouton qui permet tout simplement d'actualiser le tableau de la feuille.
Dans la feuille 1, je souhaite appeler une macro/méthode qui actualise le tableau qui est utilisé dans la feuille 3 et qui est aussi associé au bouton de cette feuille pour actualiser le tableau.
En gros la feuille 3 possède un bouton qui appelle la macro qui actualise le tableau de la feuille 3 (le tableau qu'elle contient).
Et la feuille 1 possède un bouton qui actualise le tableau de la feuille 1 (même principe que la feuille 3) et j’appelle aussi la macro de la feuille 3 pour actualiser le tableau de la feuille 3.
La macro répond à l'appel de son nom mais je souhaite l'exécuter sur la feuille 3 alors que j'ai appuyé sur le bouton de la feuille 1.
D'ailleurs une autre chose que je viens de voir, c'est qu'il faut aussi que je gère le redimensionnement du tableau. En effet, contrairement à ce que j'avais mis en place auparavant pour importer les données d'un autre fichier Excel, cette méthode ne supprime pas les lignes du tableau qui ne sont plus présentes dans le fichier source. Il faut donc que je vide toutes les lignes du tableau, que je redimensionne celui-ci, et que je recopie les informations importées du fichier source.
donne nous le code d'actualisation de la feuille feuille3 et on va la modifier pour quels puisse être exécuté depuis n'importe quels autre feuille du classeur
Requêtes SQL à l'intérieur d'un même classeur ! Je ne pensais pas cela possible (ni nécessaire d'ailleurs) mais bon
Pour le reste beaucoup de notions à clarifier !
macro est l'appellation courante d'une procédure...
méthode, hors du sens général du terme, en VBA a une signification précise, c'est une caractéristique d'un objet (un objet est généralement doté de propriétés et de méthodes), une action qu'on peut accomplir, qui se traduira par un résultat de l'action ou le renvoi d'un autre objet.
Une macro est dans l'application, ce pourquoi on peut l'exécuter, dès lors qu'elle est dans un classeur ouvert, à partir de n'importe quel classeur ouvert (sauf si elle est privée naturellement).
macro de la feuille 3 n'a donc strictement aucun sens !
Lorsqu'une macro est lancée, elle fait ce qui prévu dans son code !
S'il y a des effet inattendus, c'est que le code est mauvais.
Plus précisément, que les expressions utilisées dans le code n'ont pas été précisément qualifiées pour que la macro exécute exactement ce qui est prévu en toute circonstance.
Je ne répète pas ce que j'ai déjà dit dans un post précédent...
Il faut donc à mon avis que tu commences par te débarrasser de tes idées fausses pour commencer à programmer correctement.
Possible si, voir le lien que j'ai mis dans un de mes précédents poste. Cela permet d'importer des colonnes, de pouvoir choisir quelles colonnes importer et surtout de mettre des clauses.
Nécessaire ? Complément je peux comme cela importer les données que je souhaite. Soit tout les membres possédant tel ou tel propriété.
Je ne possède aucune idée fausse. J'essaye tout simplement de comprendre comment ça fonctionne et avec quel moyen arriver à mes fins de manière correcte.
J'ai mis cela en place avec la macro tout simplement parce que j'ai vu des personnes qui l'avait conseillé pour faire une action dans le même style que moi.
Si tu préfères, je vais prendre un autre point de vue. Chaque feuille possède un bouton et comme tu l'as dit chaque bouton est associé à sa feuille. Et sur la feuille 1, lorsque l'on clique sur le bouton, je souhaiterais exécuter, en plus de l'action du bouton, l'action que le bouton de la feuille 3 exécute sur sa feuille.
Pour cela, ce que j'ai lu sur des forums et qui ont été conseillé, c'est d'externaliser le code. Ceci dans le but de pourvoir l'appeler dans le bouton de la feuille 3, mais aussi dans le bouton de la feuille 1. Ceci dans un principe de fonction comme dans d'autre langage ( pour éviter de réécrire le même code deux fois, quoique la ça ressemblerait plus à une méthode dans le sens où le code exécuté n'est pas générique, mais qui agît sur la feuille 3 (que l'on pourrais qualifier d'objet à ce moment)).
J'ai bien compris le "macro de la feuille 3". Donc comment mettrais tu en place et appellerais tu un code qui est propre à une feuille et que l'on peut appeller d'une autre feuille (mais pas pour qu'elle s'exécute sur cette feuille mais bien sur la feuille à laquelle elle appartient) ?
Chaque feuille possède un bouton et comme tu l'as dit chaque bouton est associé à sa feuille.
Je n'ai pas dit ça ! j'ai dit que le bouton était sur la feuille, en tant qu'objet graphique, Il a en ce sens un lien avec la feuille entant que membre de la collection Shapes de la feuille. Mais cela ne concerne que le bouton, et en aucune façon la macro !
Une macro n'est intérieure à rien, d'où son externalisation (et pour la sortir de quoi ?!) est quelque peu problématique !
Puisque tu ne possèdes aucune idée fausse, poursuis-donc... !
MFerrand a écrit :Chaque feuille possède un bouton et comme tu l'as dit chaque bouton est associé à sa feuille.
Je n'ai pas dit ça ! j'ai dit que le bouton était sur la feuille, en tant qu'objet graphique, Il a en ce sens un lien avec la feuille entant que membre de la collection Shapes de la feuille. Mais cela ne concerne que le bouton, et en aucune façon la macro !
Une macro n'est intérieure à rien, d'où son externalisation (et pour la sortir de quoi ?!) est quelque peu problématique !
Puisque tu ne possèdes aucune idée fausse, poursuis-donc... !
J'ai bien compris cela et le sens de la macro maintenant.
Donc je poursuis !
J'ai bien compris le "macro de la feuille 3". Donc comment mettrais tu en place et appellerais tu un code qui est propre à une feuille et que l'on peut appeller d'une autre feuille (mais pas pour qu'elle s'exécute sur cette feuille mais bien sur la feuille à laquelle elle appartient) ?
Comme tu l'as explique et de ce que j'ai compris une macro est comme une fonction générique. Mais ce que je souhaite c'est plus une méthode en public qui appartiendrait à la feuille 3. Est ce possible de réaliser cela en VBA ?
C'est lourd !
Une macro exécute ce que tu as écrit dans le code ! Rien de plus, ni de moins ! Sauf erreur d'exécution où elle te signifie que tu t'es foutu dedans et qu'elle refuse de continuer !
Elle agit feuille 1 quand tu dis d'agir feuille 1, elle agit feuille 3 quand tu dis d'agir feuille 3 ! C'est simple !
Oui mais là c'est à coté de ma question ! Ça je l'ai bien compris depuis plusieurs poste.