Aller au contenu

Autocad et Excel


Patrick_35

Messages recommandés

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

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

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

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

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

avec la déclaration de chemin

 

je vais l'essayer sur :

des NT4 + Office 97 (ou Office 2000) avec AutoCAD 2005

des 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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 ans après...
  • 2 semaines après...

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.

 

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

 

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 erreur

quant à 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.

Lien vers le commentaire
Partager sur d’autres sites

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

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é