Aller au contenu

Lien Excel : Fermeture...


Bred

Messages recommandés

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

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 Patrick

Le 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

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

Le vlax détruit le lien avec Excel

Le (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 logiciel

Pour ce qui est des commandes vlax, je n'ai jamais trouvé d'aide en français :(

 

@+

Les Lisps de Patrick

Le 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

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

  • 2 semaines après...
  • 11 mois après...

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

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 Patrick

Le 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

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

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

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 pas

Un (vlax-get-or-create-object "Excel.application") permet donc de soit pointer sur excel s'il est déjà ouvert ou de le lancer

ensuite 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 Patrick

Le 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

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

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

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

  • 8 mois après...

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.xls

Dans 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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité