Patrick_35 Posté(e) le 13 décembre 2004 Posté(e) le 13 décembre 2004 Un exemple pour lire/ecrire des valeurs dans Excel depuis Autocad Pour activer les fonctions visual-lisp(vl-load-com) Lancer Excel(setq xl (vlax-get-or-create-object "Excel.Application")) (vlax-import-type-library :tlb-filename "C:/Program Files/Microsoft Office/Office/Excel8.olb" :methods-prefix "xl-" :properties-prefix "xlp-" :constants-prefix "xlc-") (setq xl_wks (vlax-get xl "Workbooks")) Ouvrir le fichier test.xls sur la racine du c, ou sinon, l'active dans Excel(setq xl_fichier (xl-open xl_wks [b]"c:\\test.xls"[/b])) Rendre Excel visible(vla-put-visible xl 1) Choisir la feuil1 du classeur(setq xl_classeur (vlax-get xl_fichier "Sheets")) (setq xl_feuille (xlp-get-item xl_classeur [b]"feuil1"[/b])) Choisir la cellule A10 de la feuille(setq rng (xlp-get-range xl_feuille [b]"A10"[/b])) Lire la valeur dans la cellule et la mettre dans la variable valeur(setq [b]valeur[/b] (vlax-variant-value (xlp-get-value rng))) Ecrire une valeur dans la cellule(xlp-put-value rng [b]"VALEUR A ECRIRE"[/b]) Copier la feuil1(setq xl_feuille (xlp-get-item xl_classeur [b]"feuil1"[/b])) (setq xl_dernier xl_feuille) ; xl_dernier=xl_feuille par défaut (xl-copy xl_feuille xl_dernier) ; si :vlax-true, ça s'est bien passé Déplacer la feuille copié(setq xl_deplace (xlp-get-item xl_classeur [b]"feuil1 (2)"[/b])) (xl-move xl_feuille xl_deplace) ; si :vlax-true, ça s'est bien passé Renommer la feuille feuil1 (2) en TEST(xlp-put-name xl_deplace [b]"TEST"[/b]) Sauvegarder le fichier Test1.xls sur la racine du c(xl-saveas xl_feuille [b]"c:\\Test1.xls"[/b]); si :vlax-true, ça s'est bien passé Fermer le fichier(xl-close xl_wks) Voila, c'est déjà un commencement pour travailler à la fois sur Autocad et 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
Serge Posté(e) le 13 décembre 2004 Posté(e) le 13 décembre 2004 Patrick_35, C'est bon. Tout ce qui manque et un cond ou un if où tu pourras choisir la version d'Excel. Mentionnons qu'avec Excel10, le type library est dans le fichier exe. Serge
Patrick_35 Posté(e) le 14 décembre 2004 Auteur Posté(e) le 14 décembre 2004 Exact, exact Serge, et je suis persuadé que ça se trouve dans les registres Pour l'instant je trouve par ce type de code(setq a (vl-registry-read "HKEY_CLASSES_ROOT\\Excel.sheet\\CLSID")) (setq b (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\CLSID\\" a "\\Typelib"))) (setq c (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\Typelib\\" b "\\1.2\\0\\win32")))Mais je ne suis pas persuadé que ça fonctionne quelle que soit la plate forme, la version et que j'utilise les bonnes clés. Et comme je n’ai qu’un type de config. , difficile de comparer :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
Tramber Posté(e) le 14 décembre 2004 Posté(e) le 14 décembre 2004 Applause ! Si je ne me trompe pas, tu t'y es mis recemment. Congratulations Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 14 décembre 2004 Auteur Posté(e) le 14 décembre 2004 Merci Tramber, effectivement, ça ne fait pas très longtemps que j'ai retroussé les manches et que je m'y suis mis. De plus, comme je vois régulièrement des demandes concernant un dialogue entre Autocad et Excel, maintenant, c'est fait. il ne reste plus qu'à s'en inspirer @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
lecrabe Posté(e) le 15 décembre 2004 Posté(e) le 15 décembre 2004 Bonsoir Bravo, je suis impressionné et donc je propose une nouvelle fonction VLISP pour Patrick (vl-congratulation-patrick) Zut, c'est un peu tard pour l'implanter dans AutoCAD 2006 (RIO), mais c'est promis Autodesk essayera de l'implanter dans la 2007 :) :D :cool: Bye PS: Et en plus, c'est parfait pour les 2 Patrick :P [Edité le 15/12/2004 par lecrabe] Autodesk Expert Elite Team
BIM G CO Posté(e) le 14 février 2005 Posté(e) le 14 février 2005 avec la déclaration de chemin je vais l'essayer sur :des NT4 + Office 97 (ou Office 2000) avec AutoCAD 2005des W2k + Office 2000 (ou Office XP) avec AutoCAD 2005 WXP (SP1)+ Office XP (2002 ou oFFice10) avec AutoCAD 2005 PS: j'ai créer un (defun c:excel ()) pour charger excel à partir d'AutoCAD mais j'ai des erreurs si je le tape une deuxième fois alors que je viens de le fermer par inadvertance! va falloir que je regarde cà de plus prêt! Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
chris_mtp Posté(e) le 12 juillet 2009 Posté(e) le 12 juillet 2009 Bonjour à tous, Savez vous comment on peut ajouter dans un fichier excel une feuille que l'on appelle par exemple import ? Merci par avance de votre aide.John.
chris_mtp Posté(e) le 25 juillet 2009 Posté(e) le 25 juillet 2009 Bonjour, Je vous explique.J'ai un fichier de points sous Excel avec 4 colonnes Numéro X Y Z.Je voudrais faire un zoom sur certains de points dans Autocad à partir des coordonnées sous Excel. Serait il possible donc de récupérer le nom du point d'une cellule active sous Excel,récupérer dans des variables les coordonnées de ce point puis faire un zoom centré du type (command "_zoom" "center" (strcat x","y) 15) ? Merci par avance de votre aide.John.
(gile) Posté(e) le 26 juillet 2009 Posté(e) le 26 juillet 2009 Salut, Tu peux regarder les routines de GetExcel ou celles sur ce lien donné par Tramber. Mais attention, la communication en LISP avec des applications extérieures ne peut se faire qu'avec Visual LISP (COM/ActiveX) et demande beaucoup de rigueur quant à la suppression des pointeurs vers l'objet application et la gestion des ressources (voir ici par exemple) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 1 août 2009 Posté(e) le 1 août 2009 Bonjour à tous, Je vous écris car je ne m'en sors pas avec les fonctions VLA.Je vous explique. J'ai Autocad et Excel d'ouvert. Mon fichier excel est composé de la façon suivante 4 colonnes avec pour titre de chacune Numéro X Y et Z Je met mon curseur sous Excel dans la première colonne sur une ligne quelconque, par exemple la cellule A4, je voudrais récupérer les valeurs contenus dans les cellules donc B4, C4 et D4 pour pouvoir ensuite insérer sous Autocad un texte qui correspond au numéro du point en question. J'ai essayé de faire ceci mais c'est pas bon (defun c:zx (/ x y z label) (vl-load-com) (setvar "TEXTSIZE" 10) (setq label (Getcell "A2")) (setq x (atof (Getcell "B2"))) (setq y (atof (Getcell "C2"))) (setq z (atof (Getcell "D2"))) (command "_zoom" "c" (strcat x","y) 15) (command "_text" "bc" (list x y z) 10 100 label) (prin1) ) De là, deux questions, j'ai essayé de mettre au lieu d'une cellule spécifié la référence ActiveCell mais sans retour du type (setq label (Getcell "ActiveCell")) Doit on obligatoirement ouvrir une liaison avec Excel même si Excel est ouvert avec la bonne feuille ? Merci par avance de votre aide.John.
(gile) Posté(e) le 1 août 2009 Posté(e) le 1 août 2009 Doit on obligatoirement ouvrir une liaison avec Excel même si Excel est ouvert avec la bonne feuille ? Bien sûr, sinon comment ton programme peut-il savoir de quelle fichier/feuille il s'agit. Lit bien les commentaires dans GetExcel, il y en a dans l'en-tête et avant chaque fonction.Les fonctions s'utilisent par "groupes" : En lecture :GetExcel ouvre le fichier sur la feuille spécifiée et récupère les données jusqu'à la cellule spécifiée (ou jusqu'à la fin de la région si l'argument est nil). Ces données sont conservées dans une liste affectée à une variable globale : *ExcelData@. Puis tout est proprement refermé/nettoyé.GetCell retourne le contenu d'une cellule depuis la liste contenue dans *ExcelData@. En écriture :OpenExcel ouvre un classeur Excel (visible ou non)PutCell écrit dans une cellule (ou une rangée à partir de la cellule)CloseExcel referme proprement le classeur (indispensable) Donc, suivant ton exemple, il faudrait faire :(defun c:zx (/ x y z label) (vl-load-com) (setvar "TEXTSIZE" 10) (GetExcel "Chemin du fichier" "NomDeLaFeuille" nil) (setq label (Getcell "A2")) (setq x (atof (Getcell "B2"))) (setq y (atof (Getcell "C2"))) (setq z (atof (Getcell "D2"))) (command "_zoom" "c" (strcat x","y) 15) (command "_text" "bc" (list x y z) 10 100 label) (prin1)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 1 août 2009 Posté(e) le 1 août 2009 Salut, Gile, Oui, en spécificiant à l'avance le nom du fichier excel, le nom de la feuille et le nom de la cellule où extraire les données ca marche mais mon but est le suivant : Avoir Excel et Autocad ouvert en même temps, être capable avec le lisp de récupérer automatiquement le nom du fichier excel ouvert, le nom de la feuille et le nom de la cellule active où se trouve mon curseur sur Excel pour afficher le numéro du point sous Autocad aux coordonnées indiquées sur Excel avec le X dans la colonne B, le Y dans la colonne C et le Z dans la colonne D. Ou du moins trouver une méthode simple pour spécifiez le fichier feuille et cellule à traiter. Merci par avance de ton aide.John.
(gile) Posté(e) le 1 août 2009 Posté(e) le 1 août 2009 Voilà un exemple, mais attention, il y a peu de contrôles et si tu veux te lancer dans ce genre de truc, il faudrait un peu mieux maîtriser le LISP en général et Visual LISP en particulier. On ne peut inter agir avec des applications extérieures qu'avec les fonctions vlax* (defun c:test (/ ExcelApp cell row range pt) (vl-load-com) (if (setq ExcelApp (vlax-get-object "Excel.Application")) (progn (if (setq cell (vlax-get-property ExcelApp "ActiveCell")) (if (= (vlax-get-property cell "Column") 1) (progn (setq label (vlax-variant-value (vlax-get-property cell "Text")) row (vlax-get-property cell "Row") range (strcat "A" (itoa row)) pt (list (vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" (Column+n range 1) ) "Value" ) ) (vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" (Column+n range 2) ) "Value" ) ) (vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" (Column+n range 3) ) "Value" ) ) ) ) (command "_zoom" "c" pt 15) (command "_text" "bc" pt 10 100 label) ) ) ) (vlax-release-object ExcelApp) (gc) ) ) (princ) ) ;;------------------------------------------------------------------------------- ;; ColumnRow - Retourne une liste des indices de colonne et rangée ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; Cell$ = Référence de la cellule ;; Exemple de syntaxe : (ColumnRow "IV987") = '(256 987) ;;------------------------------------------------------------------------------- (defun ColumnRow (Cell$ / Column$ Char$ Row#) (setq Column$ "") (while ( (setq Column$ (strcat Column$ Char$) Cell$ (substr Cell$ 2) ) ) (if (and (/= Column$ "") (numberp (setq Row# (read Cell$)))) (list (Alpha2Number Column$) Row#) '(1 1) ;_ default to "A1" if there's a problem ) ) ;;------------------------------------------------------------------------------- ;; Alpha2Number - Convertit une chaîne alphabétique en nombre entier ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; Str$ = Chaîne à convertir ;; Exemple de syntaxe : (Alpha2Number "BU") = 73 ;;------------------------------------------------------------------------------- (defun Alpha2Number (Str$ / Num#) (if (= 0 (setq Num# (strlen Str$))) 0 (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)) ) (Alpha2Number (substr Str$ 2)) ) ) ) ;;------------------------------------------------------------------------------- ;; Number2Alpha - Convertit un nombre entier en chaîne alphabétique ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; Num# = Nombre à convertir ;; Exemple de syntaxe : (Number2Alpha 73) = "BU" ;;------------------------------------------------------------------------------- (defun Number2Alpha (Num / Val) (if ( (chr (+ 64 Num)) (if (= 0 (setq Val (rem Num 26))) (strcat (Number2Alpha (1- (/ Num 26))) "Z") (strcat (Number2Alpha (/ Num 26)) (chr (+ 64 Val))) ) ) ) ;;------------------------------------------------------------------------------- ;; Column+n Retourne la cellule située à n colonnes de cell ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 2 ;; cell = cellule à incrémenter ;; n = incrément ;; Exemple de syntaxe : (Column+n "B12" 3) = "E12" ;;------------------------------------------------------------------------------- (defun Column+n (cell n) (setq cell (ColumnRow cell)) (strcat (Number2Alpha (max 1 (+ (car cell) n))) (itoa (cadr cell)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 1 août 2009 Posté(e) le 1 août 2009 Merci Gile pour cette appli surtout à cette heure aussi tardive.C'est exactement ce que je cherché à faire. Par contre, serait il possible sous Excel de mettre en couleur bleu ou rouge la cellule dont on vient de faire un zoom ?Puis de mettre le curseur sous Excel à la cellule N+1 ligne toujours dans la colonne A. Exemple, si sous Excel la cellule active A4, serait il possible après le zoom sous Autocad de mettre le curseur en cellule A5 de manière à répéter la commande ? et donc de mettre la cellule A4 en couleur rouge ou bleu. Sinon, c'est pas grave.Je vais bien ananlyser ton code.Merci encore pour ton aide précieuse.John.
chris_mtp Posté(e) le 1 août 2009 Posté(e) le 1 août 2009 En cherchant dans les fonctions disponibles sur le lien de Tramber http://www.atablex.com/htmls/vlxls-functions.htm j'ai trouvé ceci (Defun vlxls-text-put-aci (xl id aci / Rtn) (if (null aci) (msxl-put-colorindex (msxl-get-font (setq Rtn (msxl-get-range xl id))) (vlax-make-variant -4105) ) (msxl-put-colorindex (msxl-get-font (setq Rtn (msxl-get-range xl id))) (vlxls-color-aci->eci aci) ) ) Rtn ) mais dès que j'essaye de l'intégrer dans le code, j'ai une erreur Autocad. John
chris_mtp Posté(e) le 2 août 2009 Posté(e) le 2 août 2009 la fonction vlax-get-property ne permet que d'extraire les propriétés de la cellule active.C'est bien çà ? Elle ne permet pas de déplacer le curseur sous Excel ou de modifier les propriétés d'une cellule sous Excel. J'ai essayé d'incrémenter la cellule active de A4 en A5 comme décrit dans l'exemple en ajoutant (setq cell (vlax-get-property ExcelApp (Row+n (cell 1)))) à la suite des commands mais il y a toujours une erreurquant à la couleur, il y a aussi un problème. Je ne vois pas comment les utiliser ni dans l'aide ou c'est flou.J'ai ajouté en fin de code la fonction Row+n dont tu en est l'auteur dans le même principe Column+n mais sans succés. Merci encore pour ton aide..John.
(gile) Posté(e) le 2 août 2009 Posté(e) le 2 août 2009 Salut, Tu donnes vraiment l'impression de vouloir courir (dans tous les sens) avant de savoir marcher. ;) La programmation AutoCAD/Excel en LISP suppose de bien connaître Visual LISP (donc de maîtriser AutoLISP) et, en plus, de connaître le VBA Excel ou d'avoir de l'intuition (et de savoir où chercher) pour trouver les propriétés et méthodes de Excel (elle ne sont pas dans l'aide d'AutoCAD).On y arrive avec méthode, en faisant des pas à pas et en interrogeant les objets nouvellement créés avec la fonction : vlax-dump object. Encore une fois, on ne peut rien construire de solide uniquement en assemblant des morceaux de codes trouvés ici et là aussi solides que puissent être chacun des morceaux. Il faut aussi que le ciment qui les lie et que l'architecture globale tiennent la route. Je te donne un autre exemple, mais je pense sincèrement qu'avant de t'attaquer à si gros, tu devrais essayer d'aboutir tout seul des projets moins ambitieux. (defun c:test (/ DoIt ExcelApp cell row range) (vl-load-com) (defun DoIt (range label / pt) (setq pt (list (vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" (Column+n range 1)) "Value" ) ) (vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" (Column+n range 2)) "Value" ) ) ;|(vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" (Column+n range 3)) "Value" ) )|; ) ) (vlax-put-property (vlax-get-property (vlax-get-property ExcelApp "Range" range) "Interior") "ColorIndex" 3 ) (command "_zoom" "c" pt 15) (command "_text" "bc" pt 10 100 label) ) (if (setq ExcelApp (vlax-get-object "Excel.Application")) (progn (if (setq cell (vlax-get-property ExcelApp "ActiveCell")) (if (= (vlax-get-property cell "Column") 1) (progn (setq row (vlax-get-property cell "Row") range (strcat "A" (itoa row)) label (vlax-variant-value (vlax-get-property cell "Text") ) ) (if (= (vl-string-trim " " label) "") (alert "Cellule vide") (vl-catch-all-apply '(lambda () (DoIt range label))) ) (while (or (initget "Oui Non") (/= "Non" (getkword "\nRangée suivante ? [Oui/Non] : ")) ) (setq range (row+n range 1) label (vlax-variant-value (vlax-get-property (vlax-get-property ExcelApp "Range" range) "Text" ) ) ) (if (= (vl-string-trim " " label) "") (alert "Cellule vide") (vl-catch-all-apply '(lambda () (DoIt range label))) ) ) ) ) ) (vlax-release-object ExcelApp) (gc) ) ) (princ) ) ;;------------------------------------------------------------------------------- ;; ColumnRow - Retourne une liste des indices de colonne et rangée ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; Cell$ = Référence de la cellule ;; Exemple de syntaxe : (ColumnRow "IV987") = '(256 987) ;;------------------------------------------------------------------------------- (defun ColumnRow (Cell$ / Column$ Char$ Row#) (setq Column$ "") (while ( (setq Column$ (strcat Column$ Char$) Cell$ (substr Cell$ 2) ) ) (if (and (/= Column$ "") (numberp (setq Row# (read Cell$)))) (list (Alpha2Number Column$) Row#) '(1 1) ;_ default to "A1" if there's a problem ) ) ;;------------------------------------------------------------------------------- ;; Alpha2Number - Convertit une chaîne alphabétique en nombre entier ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; Str$ = Chaîne à convertir ;; Exemple de syntaxe : (Alpha2Number "BU") = 73 ;;------------------------------------------------------------------------------- (defun Alpha2Number (Str$ / Num#) (if (= 0 (setq Num# (strlen Str$))) 0 (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)) ) (Alpha2Number (substr Str$ 2)) ) ) ) ;;------------------------------------------------------------------------------- ;; Number2Alpha - Convertit un nombre entier en chaîne alphabétique ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; Num# = Nombre à convertir ;; Exemple de syntaxe : (Number2Alpha 73) = "BU" ;;------------------------------------------------------------------------------- (defun Number2Alpha (Num / Val) (if ( (chr (+ 64 Num)) (if (= 0 (setq Val (rem Num 26))) (strcat (Number2Alpha (1- (/ Num 26))) "Z") (strcat (Number2Alpha (/ Num 26)) (chr (+ 64 Val))) ) ) ) ;;------------------------------------------------------------------------------- ;; Column+n Retourne la cellule située à n colonnes de cell ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 2 ;; cell = cellule à incrémenter ;; n = incrément ;; Exemple de syntaxe : (Column+n "B12" 3) = "E12" ;;------------------------------------------------------------------------------- (defun Column+n (cell n) (setq cell (ColumnRow cell)) (strcat (Number2Alpha (max 1 (+ (car cell) n))) (itoa (cadr cell)) ) ) ;;------------------------------------------------------------------------------- ;; Row+n Retourne la cellule située à n rangées de cell ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 2 ;; cell = cellule à incrémenter ;; n = incrément ;; Exemple de syntaxe : (Row+n "B12" 3) = "B15" ;;------------------------------------------------------------------------------- (defun Row+n (cell n) (setq cell (ColumnRow cell)) (strcat (Number2Alpha (car cell)) (itoa (max 1 (+ (cadr cell) n))) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 2 août 2009 Posté(e) le 2 août 2009 Merci Gile pour ce code qui va m'être très utile.C'est sur, je dois encore apprendre le Lisp classique avant de me mettre au Vlisp mais j'avais besoin de cette fonction. Je vais encore bien lire et comprendre ton code.Merci encore pour ton aideJohn.
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