Bred Posté(e) le 28 mars 2006 Partager Posté(e) le 28 mars 2006 Bonjours à tous,J'ai utilisé la routine lisp de Patrick_35 pour ouvrir et écrire/récupérer des données dans Excel.A la fin de la comande il demande d'enregistrer le tableau Excel ouvert.Je ne veux pas l'enregistrer et je ne sais pas comment faire.Quelqu'un aurait t'il une solution ??? De plus il faut toujours fermé Excel manuellement, malgré l'ordre de fermeture (vlax-release-object xl) .... y aurait t'il quelqu'un qui aurait trouvé la solution pour le fermer ? Merci d'avance Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 28 mars 2006 Partager Posté(e) le 28 mars 2006 Salut A la fin de la comande il demande d'enregistrer le tableau Excel ouvert.Tu peux être plus précis ? De plus il faut toujours fermé Excel manuellement, malgré l'ordre de fermeture (vlax-release-object xl) .... y aurait t'il quelqu'un qui aurait trouvé la solution pour le fermer ?Ton vlax est pour détruire le lien avec excel, pas pour le fermer Voici des exemples et il y a d'autre méthodes pour les faire, mais ne connaissant pas la manière dont tu as fait ton lien Pour sauver un fichier Excel(vlax-invoke-method (vlax-get-property Xl "ActiveWorkbook") "Save")Pour fermer le classeur(vlax-invoke-method (vlax-get-property Xl "ActiveWorkbook") 'Close)Pour quitter Excel(vlax-invoke-method Xl 'QUIT) Et pour détruire le lien et vider la mémoire(vlax-release-object Xl)(gc) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 29 mars 2006 Auteur Partager Posté(e) le 29 mars 2006 Un grand merci pour la fermeture d'Excel.Il serait bien je pense de mettre ce détail dans la routine que tu propose (http://www.cadxp.com/sujetXForum-4272.htm) Pour mon souci d'enregistrement : Comme je rentre des données dans ma feuille Excel, lorsque je ferme Excel, il me demande si je veux enregistrer les modifications. Je ne veux pas, donc je voudrais éviter d'avoir à chaque fois la boite de dialogue Excel "Voulez-vous enregistrer les modification ?"... Le vlax que tu proposes "pour détruire le lien et vider la mémoire" (vlax-release-object Xl)(gc) correspond à quoi exactement ??? Je débute en lisp, j'ai trouvé sur les différent liens que CADXP propose, l'explication des commandes de bases, mais je ne trouve pas d'explication traduite en français sur les commandes "vlax" ... cela existe ??? Merci pour tout. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 29 mars 2006 Partager Posté(e) le 29 mars 2006 Le vlax détruit le lien avec ExcelLe (gc) est pour nettoyer la mémoire. J'ai Constaté que quand on ferme excel est qu'ensuite on regarde dans le gestionnaire des taches, dans l'onglet processus, Excel est toujours présent. Donc, pour pouvoir l'éliminer définitivement, je lance donc la fonction (gc)Pour le post que tu cites, c'est une base de départ et il faut avouer que c'était mes débuts avec Excel. Pour ce qui est de ton souci d'enregistrement, la je n'ai pas de reméde miracle pour l'instant. c'est directement lié avec logicielPour ce qui est des commandes vlax, je n'ai jamais trouvé d'aide en français :( @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 30 mars 2006 Auteur Partager Posté(e) le 30 mars 2006 Trouvé !!!A force de chercher on trouve toujour une solution avec le lisp, et par des chemins détourné...Donc pour mon souci de message d'enregistrement d'Excel, voilà ce que j'ai fait : Après l'ouverture, l'écriture, à la fermeture je demande d'enregistrer une copie du fichier quelque part comme expliqué dans la routine déjà cité : (xl-saveas xl_feuille "c:\\test-copie.xls") Et juste après avoir fermer le fichier, fermer Excel, (et vidé la mémoire), je demande en lisp d'éffacer la copie ci-dessus : (setq testC "c:\\test-copie.xls") (if (findfile testC) (vl-file-delete testC) ) ... voilà .... et c'est bien .... trés content de moi sur ce coup là (je sais, c'est simple mais je ne suis pas programmeur, et cela fait qu'une dixaine de jour que je me suis mis au lisp, alors soyez tolérant !!!) Merci en tout cas de votre aide. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 8 avril 2006 Partager Posté(e) le 8 avril 2006 Je suis content que tu es trouvé une solution par toi-même, mais je vais quand même regarder pour le faire directement depuis Excel @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 15 mars 2007 Auteur Partager Posté(e) le 15 mars 2007 Salut,je reviens en ce moment sur la fermeture d'Excel, car j'avais une erreur (fermeture de tout excel, même si celui-ci était déjà ouvert...)Mais un problème subsiste, et ça me fait planter mes routines : Je n'arrive pas à fermer la tâche EXCEl dans les processus, malgré (vlax-release-object Xl)(gc) ... :casstet: Pour info, ci-dessous la routine de Patrick-35 mis en sous-routine à ma sauce. ;;; Ouverture Excel + Nom de feuille puis 1 = visible, 0 = invisible -> (XL-Ouv-Feuill "chemin fichier" "Nom de feuille" 0) (defun XL-Ouv-Feuill(Chem-fich Nom_feuil vis) (if (not (vlax-get-object "Excel.Application")) (setq XL-TestOuvert "N") (setq XL-TestOuvert "O")) (vl-load-com) (Excel_Version) (setq xl (vlax-get-or-create-object "Excel.Application")) (vlax-import-type-library :tlb-filename Chemin_Excel :methods-prefix "xl-" :properties-prefix "xlp-" :constants-prefix "xlc-") (setq xl_wks (vlax-get xl "Workbooks") xl_fichier (xl-open xl_wks Chem-fich) xl_classeur (vlax-get xl_fichier "Sheets") xl_feuille (xlp-get-item xl_classeur Nom_feuil)) (if (equal vis 0) (vla-put-visible xl :vlax-False) (vla-put-visible xl :vlax-True) ) ) ;;; Choix Cellule dans Excel - Ecriture Texte -> (XL-Put-Txt-Cell "Texte" "C4") - (defun XL-Put-Txt-Cell (Txt Cell) (setq DONN (xlp-get-range xl_feuille Cell)) (xlp-put-value2 DONN Txt) ) ;;; Choix Cellule dans Excel (liste) - Lire Cellule -> (XL-Get-Val-Cell '("B1" "C4")) - ;;; -> Retourne liste résultat - (defun XL-Get-Val-Cell (lst-Cell / x) (setq x 0 lst-val nil) (repeat (length lst-Cell) (setq lst-val (append lst-val (list (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (nth x lst-Cell)))))) x (+ x 1)) ) lst-val ) ;;; Fermeture de la page ouverte (defun XL-Ferm () (xl-saveas xl_feuille "C:\\XL-Lisp.xls") (vlax-invoke-method (vlax-get-property Xl "ActiveWorkbook") 'Close) (if (equal XL-TestOuvert "N") (progn (vlax-invoke-method Xl 'QUIT) [b](vlax-release-object Xl)(gc)[/b])) (if (findfile "C:\\XL-Lisp.xls") (vl-file-delete "C:\\XL-Lisp.xls")) ) ... je suis le seul dans ce cas ????... c'est quand même bizarre que (gc) ne fonctionne pas....merci ! [Edité le 15/3/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 15 mars 2007 Partager Posté(e) le 15 mars 2007 Salut,Pour fermer Excel correctement, il faut aussi faire des vlax-release-object pour les variables qui sont affecté au classeur, à la feuille, etc... Et ensuite se servir de la fonction (gc) deux fois pour bien nettoyer la mémoire. Depuis que j'utilise cette méthode, je n'ai plus ce problème.Regarde dans le lisp LXL à ce sujet.De plus, si tu fais attention, tu verras que si le fichier est déjà ouvert, je ne le ferme pas, ni le sauvegarde. Que si excel est déjà ouvert, je ne ferme pas non plus, mais s'il n'y a rien, je lance Excel et tout ce qui suit. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 15 mars 2007 Auteur Partager Posté(e) le 15 mars 2007 Super, merci, je vais regarder ça ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 15 mars 2007 Auteur Partager Posté(e) le 15 mars 2007 Je viens de télacharger Lxl.zip , mais je n'arrive pas à le lire (zip endommagé ?) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 15 mars 2007 Partager Posté(e) le 15 mars 2007 Je viens de le télécharger à l'instant dans le lien que tu as donné et ça à parfaitement fonctionné :casstet: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 15 mars 2007 Auteur Partager Posté(e) le 15 mars 2007 mmmmm !... en fait je dois avoir le firewall de mon bureau qui me bloc le téléchargement !...Je verrais ça chez moi ce soir !désolé. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 15 mars 2007 Partager Posté(e) le 15 mars 2007 Je veux bien le poster, mais ça risque de faire un peu long (1625 lignes - 50ko pour le lsp et 105 lignes - 4ko pour le dcl) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 15 mars 2007 Auteur Partager Posté(e) le 15 mars 2007 OK ! Récupéré et en train d'être décortiqué.merci ! :P [Edité le 15/3/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 16 mars 2007 Auteur Partager Posté(e) le 16 mars 2007 OK ! Récupéré et en train d'être décortiqué.... et complétement largué !!! :casstet: Je m'étais habitué à "vlax-import-type-library", et je vois que tu est passé par autre part ....j'ai éssayé d'aptater la précedente version que j'ai mis ci-dessus en mettant à la fermeture(foreach n (list xl xl_wks xl_fichier xl_classeur xl_feuille)(vlax-release-object n)) (setq xl nil xl_wks nil xl_fichier nil xl_classeur nil xl_feuille nil) (gc)(gc)... mais ça ne fonctionne toujours pas (j'ai toujours Excel en processus...) Donc, j'en suis à envoyer un appel à l'aide à qui peu pour que l'on puisse me pondre des routines équivalentes à celles que j'ai mis au dessus (ou que l'on me dirige fortement...) Je cherche à : 1 - Ouvrir Excel avec test si déjà ouvert (avec argument visible (1) ou pas (0))2 - Choix d'un fichier existant et pointage sur une feuille (argument fichier et nom de feuille)3 - Choix d'une cellule et écriture valeur (argument cellulle et valeur)4 - Choix de cellulles et lecture de cette cellule (avec argument une liste de cellulle) -> retourne une liste de valeur.5 - Fermeture de la page, voir d'Excel si celui-ci n'était pas déjà ouvert ... .... mon lisp précedent fait tout ça, mais il ne me ferme pas totalement Excel (et je ne suis pas sûr du test si déjà ouvert....) merci d'avance !!!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 16 mars 2007 Partager Posté(e) le 16 mars 2007 et je vois que tu est passé par autre part ....Oui, et directement en Activex, ce qui permet logiquement de le faire fonctionner sur toutes les versions (2010, 2015, ...) et donc de ne plus être ennuyé (pour rester poli) avec la logique Microsoft (un jour un olb, ensuite sur un exe et après ?)Mais le principe reste le même. Que ça soit par Activex ou par library. Les variables sont définis en objet et en les supprimant comme tu le fais, cela devrai fonctionner, à moins que tu en ai oublié une 1) (vlax-get-object "Excel.application") permet de savoir si Excel est lancé ou pasUn (vlax-get-or-create-object "Excel.application") permet donc de soit pointer sur excel s'il est déjà ouvert ou de le lancerensuite un (setq wks (vlax-get xl 'Workbooks)) 2) Choix du fichier par getfiled je suppose.Pour ouvrir un fichier depuis Excel, un (setq f (vlax-invoke wks 'open "Mon_fichier.xls")) est identique à (xl-open Xl_Wks "Mon_fichier.xls") Pour la suite, je n'ai plus le temps pour l'instant, mais si tu regardes bien, tu trouveras la logique @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 16 mars 2007 Auteur Partager Posté(e) le 16 mars 2007 pfffffffffffffffffff !!!... j'ai fait ça .... (je suis assez content de moi pour la manière de choisir l'onglet .... en gras) ; Lancer une liaison avec Excel - (defun lancer_excel (vis / sel) (setq xl (vlax-get-or-create-object "Excel.Application")) (setq wks (vlax-get xl 'Workbooks)) (vlax-for sel wks (setq liste_fichiers_ouvert (append liste_fichiers_ouvert (list (strcase (vlax-get sel 'fullname))))) ) (if (equal vis 0) (vla-put-visible xl :vlax-False) (vla-put-visible xl :vlax-True) ) ) ;;; Ouverture Excel + Nom de feuille puis 1 = visible, 0 = invisible -> (XL-Ouv-Feuill "chemin fichier" "Nom de feuille") - (defun XL-Ouv-Feuill (Chem-fich Nom_feuil vis) (lancer_excel vis) (setq xl-fichier (vlax-invoke wks 'open Chem-fich)) (setq xl-classeur (vlax-get xl-fichier 'sheets)) [b] (setq x 1) (repeat (vlax-get-property xl-classeur 'Count) (if (equal (strcase (vlax-get (vlax-get-property xl-classeur 'item x) 'name)) (strcase Nom_feuil)) (setq xl-feuille (vlax-get-property xl-classeur 'item x)) (setq x (+ x 1)) )[/b] ) (vlax-invoke-method xl-feuille 'Activate) ) ;;; Choix Cellule dans Excel - Ecriture Texte -> (XL-Put-Txt-Cell "Texte" "C4") - (defun XL-Put-Txt-Cell (Txt Cell) (vlax-put (vlax-get-property xl-feuille 'range Cell)'value2 Txt) ) ;;; Choix de Cellule dans Excel (liste) - Lire Cellule -> (XL-Get-Val-Cell '("B1" "C4")) - ;;; -> Retourne liste résultat - (defun XL-Get-Val-Cell (lst-Cell / x) (setq x 0 lst-val nil) (repeat (length lst-Cell) (setq lst-val (append lst-val (list (vlax-get (vlax-get-property xl-feuille 'range (nth x lst-Cell)) 'value2))) x (+ x 1)) ) lst-val ) ; Fermer la liaison avec Excel (defun XL-Close (/ ok sel) (if (not (member (strcase (vlax-get xl-fichier 'fullname)) liste_fichiers_ouvert)) (vlax-invoke-method xl-fichier 'close :vlax-false) ) (if liste_fichiers_ouvert (vla-put-visible xl :vlax-True) ) (foreach sel (list xl wks xl-fichier xl-classeur xl-feuille) (vlax-release-object sel) ) (setq xl nil wks nil xl-fichier nil xl-classeur nil xl-feuille nil) (gc)(gc) ) ) [Edité le 2/12/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 17 mars 2007 Partager Posté(e) le 17 mars 2007 C'est bien, c'est bien :D Tu y arrives petit à petit et ce qui me fait le plus plaisir, c'est que tu trouves par toi-même la logique. Encore un effort @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 17 mars 2007 Auteur Partager Posté(e) le 17 mars 2007 Merci Patrick_35...En fait, à tête (et ordi) refroidi, le code que j'ai posté ci-dessus fonctionne (ce qui n'est pas étonnant vu que la fermeture est un coper-coller de ton code.) Merci encore ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 17 mars 2007 Partager Posté(e) le 17 mars 2007 De rienEncore faut-il savoir interpréter le code, ce qui est loin d'être évident. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 23 mars 2007 Auteur Partager Posté(e) le 23 mars 2007 La routine de fermeture ne fonctionnait (pas bien) : il faut rajouter un test pour garder la visibilité d'Excel si il y avait déjà un document d'ouvert : ; Fermer la liaison avec Excel(defun XL-Close (/ ok sel)(if (not (member (strcase (vlax-get xl-fichier 'fullname)) liste_fichiers_ouvert))(vlax-invoke-method xl-fichier 'close :vlax-false))(if liste_fichiers_ouvert (vla-put-visible xl :vlax-True) )(foreach sel (list xl wks xl-fichier xl-classeur xl-feuille)(vlax-release-object sel))(setq xl nil wks nil xl-fichier nil xl-classeur nil xl-feuille nil)(gc)(gc))) -Routine précédente edité - [Edité le 26/6/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 2 décembre 2007 Auteur Partager Posté(e) le 2 décembre 2007 Salut,Comme ces derniers temps je dirige souvent vers ces routines, je vous décris ci-dessous une petite manipulation afin d'en comprendre l'utilisation ! Tout dabord vous crés sous C: un fichier Excel nommé c:\\testXL.xlsDans ce fichier, vous nommez un onglet de votre choix en "testcadXP"Dans cette feuille, vous tapez dans une cellulle (sauf C7 et B4) un nombre.Dans la cellulle C7, vous écrivez un calcul en utilisant la cellulle B4 (ex : =B4*B7)Vouss enregistrez et femer Excel. Enfin, vous charger le lisp ci dessous : (defun c:testxl (/ lst-result) ; ouverture fichier "c:\\testXL.xls" ; Aller sur l'onglet "testcadXP" ; Excel en arrière plan = 0 (XL-Ouv-Feuill (findfile "c:\\testXL.xls") "testcadXP" 0) ; Ecrire [b]10[/b] dans cellule B4 (XL-Put-Txt-Cell "10" "B4") ; Lire résultat dans cellule C7 (résultat sous formede liste) (setq lst-result (XL-Get-Val-Cell '("C7"))) ; donner résultat (alert (strcat "\n Résultat :" (rtos (car lst-result)))) ; Fermer Excel (XL-Close) (princ) ) .... vous devrez avoir en retour le résultat de votre calcul en C7 avec la cellule B4 = 10 [Edité le 2/12/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lili2006 Posté(e) le 2 décembre 2007 Partager Posté(e) le 2 décembre 2007 Bonsoir à toutes et tous, Testé sous Vista => Commande: testxl; erreur: no function definition: XL-OUV-FEUILLCommande: Encore le mêm pb ??!! Je regarderai demain sous XP, pour voir,... Bonne soirée. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bred Posté(e) le 2 décembre 2007 Auteur Partager Posté(e) le 2 décembre 2007 Re,citation extraite du message original:Commande: testxl; erreur: no function definition: XL-OUV-FEUILLCommande:Encore le mêm pb ??!! N'oublies pas de charger les routines de la réponse 16 ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lili2006 Posté(e) le 2 décembre 2007 Partager Posté(e) le 2 décembre 2007 Re, Effectivement, ça marche mieux comme ça !(J'ai chargé à l'ouverture car systématiquement j'oubli pour les tests,..) Vu ! <!--url{0}--> Pour commencer, j'ai pas fait trop compliqué,......... @+, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant