Aller au contenu

Communiquer et récupérer une variable excel uniquement en lisp


vins13007

Messages recommandés

Bonjour à tous,

Tout d'abord merci encore pour toutes les solutions que vous pouvez nous apporter, c'est toujours un plaisir de trouver des astuces ou des solutions grâce à vous.

Je poste aujourd'hui car ce n'est pas faute d'avoir cherché et cherché mais la je bloque. Je communique avec excel afin de lui lancer mes propres fonctions et je souhaite récupérer les résultats de mes variables excel uniquement à l'aide du lisp sans connecter excel à autocad en vba.

Je vous voit venir 😉 vous allez me dire connecte excel à autocad et définit ta variable dans autocad directement avec AcadDoc.SendCommand ("(setq selectexcel " & ta-variable & " ) ") mais j'aimerai éviter de faire ça et de façon aléatoire excel ne détecte pas mon autocad d'ouvert donc rien ne marche.

Je savais que je pouvais lancer des fonctions excel avec autocad mais je ne savais pas définir de variables en lisp dans excel. J'ai réussi à trouver comment lancer une fonction avec un argument et je pense que ça fera plaisir à plus d'une personne 🙂.

(vlax-invoke-method exl "Run" "ma-fonction" (vlax-make-variant "mon-texte" vlax-vbString)) ; Lancer fonction  excel avec un argument de type texte

Je remercie Didier au passage pour ses infos concernant les variants à consulter sans modération https://www.da-code.fr/types-de-donnees-vlax/#ANCRE_vlax-make-variant

La ou je bloque c'est pour récupérer le résultat de ma fonction dans une variable que j'ai créé sur excel depuis mon lisp

On connait les librairies à importer (:methods-prefix "xl-" :properties-prefix "xlp-"  :constants-prefix "xlc-") mais je n'arrive pas à trouver d'infos sur les fonctions qu'on peut utiliser avec mis à part les basiques pour récupérer un texte dans une cellule (xlp-get-item xl_classeur "ton-onglet") (xlp-get-range xl_feuille ...). Est ce qu'avec ces librairies la on pourrait récupérer la valeur d'une variable  excel ? Je n'ai pas trouvé.

J'ai voulu m'intéresser aux possibilités avec vlax-invoke-method et vlax-get-property, je suis certain qu'on peut décortiquer excel avec tout ça mais je ne trouve pas ou peu d'infos sur ce qu'on peut faire avec dans excel.

Est-ce qu'à tout hasard un membre de la communauté aurait une liste des propriétés des ces fonctions avec excel car je ne suis pas le seul à chercher ce genre d'infos.

(vlax-get-property object property)

Merci d'avance,

Vincent,

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Avec (vlax-get-property object property) tout dépend de ce qu'est object. Dans tous les cas, c'est l'aide pour les références VBA Excel que tu trouveras les listes de propriétés.

Si object est l'Application Excel, les propriétés sont listées ici.

Si object est un classeur, les propriétés sont listées ici.

Si object est une feuille, les propriétés sont listées ici.

etc.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Giles,


Un grand merci pour ta réactivité et ces 3 liens qui vont pouvoir nous aider à mieux analyser ce qu’on peut faire avec Excel.

Je vais fouiner ce soir et si je trouve comment récupérer ma variable Excel, je posterai la ligne. 
 

A bientôt et au plaisir de te lire. 

Lien vers le commentaire
Partager sur d’autres sites

Re,

Bon j'ai pas réussi à trouver la fonction qui permet de trouver et de lire une variable dans excel. Je pars en congé et je voulais débloquer le problème donc ce que j'ai fait c'est que je lance 2 fonctions excel à l'aide de (vlax-invoke-method exl "Run" "ma-fonction") pour ne pas connecter excel à autocad.

La première je trie mon équipement parmi mes 15000 lignes, excel le fait très vite et la deuxième, il me renvoi le numéro de ligne pour que je puisse récupérer les valeurs dans la bonne cellule. Je vous garantie que ça dépote, on est loin de la recherche cellule par cellule d'autocad pour trouver ce qu'on cherche.

Si ça peut aider :

(defun emplacement_equipements (/ sélection compteur nom-caneco info-liste-entité nom-recherché pt noms-recherchés problèmes nom-fichier-exl nom-dossier exl xl_fichier xl_classeur xl_feuille compteur txtcellule x y z justification-txt rotation-txt selectexcel)
  (setvar "cmdecho" 0)
  ;; Création type de ligne
  (if (not (tblsearch "LTYPE" "DISCONTINU"))
    (entmake
      '(
	(0 . "LTYPE")					; Type d'entité nom du groupe
	(100 . "AcDbSymbolTableRecord")			; Type d'entité nom de la table primaire
	(100 . "AcDbLinetypeTableRecord")		; Type d'entité nom de la sous table
	(2 . "DISCONTINU")				; Nom
	(70 . 0)
	(3 . "_ _ _ _ _ _ _")				; Déscription
	(72 . 65)					; Code d'alignement, valeur toujours 65
	(73 . 2)					; Nombre d'éléments
	(40 . 96.0)					; Longueur total de l'élément
	(49 . 64.0)					; Longueur tirets, car valeur positive
	(74 . 0)					; Type d'élément(un par élément). Par défaut est 0 (pas de forme / texte intégré) Les codes suivants sont des valeurs de bits: 2 = chaîne de texte / 4 = forme
	(49 . -32.0)					; Longueur espace, car valeur négative
	(74 . 0)
	)
      )
    )
  ;; Création calque "A SUPPRIMER"
  (if (not (tblsearch "LAYER" "A SUPPRIMER"))
    (entmake
      (list
	'(0 . "LAYER")
	'(100 . "AcDbSymbolTableRecord")
	'(100 . "AcDbLayerTableRecord")
	(cons 2 "A SUPPRIMER")				; Nom calque
	(cons 70 0) 					; 0 on / 1 off
	(cons 62 1)					; Couleur
	(cons 6 "DISCONTINU")				; Ligne type
	)
      )
    )
  (if (setq sélection (ssget '((0 . "insert") (-4 . "<OR") (2 . "TABLEAU*") (2 . "GRILLE*") (2 . "_*") (-4 . "OR>"))))
    (progn
      (setq compteur 0)
      (repeat (sslength sélection)
	(if (setq nom-caneco (cdr (assoc 360 (entget (ssname sélection compteur)))))
	  (progn
	    (setq info-liste-entité (CANECO-INFO-ENTITE nom-caneco))
	    (setq nom-recherché (cdr (assoc "NOM" info-liste-entité)))
	    (setq pt (cdr (assoc 10 (entget (ssname sélection compteur))))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas
	    (if (= (substr nom-recherché (strlen nom-recherché)) "-")
	      (setq noms-recherchés (cons (cons (strcat (substr nom-recherché 1 (- (strlen nom-recherché) 1)) "*") pt) noms-recherchés))
	      (setq noms-recherchés (cons (cons nom-recherché pt) noms-recherchés))
	      )
	    )
	  (progn
	    (setq problèmes (cons "Impossible de récupérer le nom caneco de l'équipement encadré en rouge-barré, il doit être renseigné avec une version caneco 2018" problèmes))
	    (setq pt (cdr (assoc 10 (entget (ssname sélection compteur))))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas
	    (setq liste-points (list (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt))))
	    (entmake
	      (append
		(list '(0 . "LWPOLYLINE")
		      '(100 . "AcDbEntity")
		      '(100 . "AcDbPolyline")
		      (cons 8 "A SUPPRIMER")
		      (cons 70 1)
		      (cons 90 (length liste-points))
		      )
		(mapcar '(lambda (x)(cons 10 x)) liste-points)
		)
	      )
	    (entmod (subst (cons 38 (caddr pt)) (assoc 38 (entget (entlast))) (entget (entlast))))
	    )
	  )
	(setq compteur (1+ compteur))
	)
      ;;;      (setq noms-recherchés (vl-sort noms-recherchés '(lambda (a b) (< (car a) (car b))))) ; Triage de la liste
      (if
	(or
	  (setq nom-fichier-exl (findfile "S:/ESPACE DE TRAVAIL/TECHNIQUE/E_Montage cablage/- Etudes phase 2 [Etat 0]/Plans 2D de cheminement/Plan 2D Caneco/Plan 3D 3.2/_Export maquette 3D/Export maquette complet.xlsm")) ; Inscrit le chemin pour éviter de le chercher
	  (setq nom-fichier-exl (getfiled "Indiquez le chemin du fichier excel Export maquette complet" "S:\\ESPACE DE TRAVAIL\\TECHNIQUE\\E_Montage cablage\\- Etudes phase 2 [Etat 0]\\Plans 2D de cheminement\\Plan 2D Caneco\\Plan 3D 3.2\\_Export maquette 3D\\" "" 8)) ; Si le nom de dossier ou du fichier a changé, il va falloir lui indiquer le chemin
	  )
	(progn
	  ;; Gestion excel
	  (if (not (setq exl (vlax-get-or-create-object "Excel.Application"))) ; Trouver l'application
	    (progn
	      (alert "      Aucune application excel trouvée\n             *** Fin du programme ***")
	      (exit)
	      )
	    )
	  (setq xl_fichier (vla-open (vlax-get-property exl "WorkBooks")  nom-fichier-exl))
	  (vla-put-visible exl 0)   		; Rendre Excel invisible
	  (if (not *librairie-excel*) 	; Importer les librairies pour communiquer avec Excel
	    (progn
	      (if
		(vlax-import-type-library
		  :tlb-filename "C:\\Program Files\\Microsoft Office\\root\\Office16\\Excel.exe" ;  "C:\\Program Files\\Microsoft Office\\root\\Office16\\Excel.exe" -----  "C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\Excel.exe"
		  :methods-prefix "xl-"
		  :properties-prefix "xlp-"
		  :constants-prefix "xlc-"
		  )
		(setq *librairie-excel* T)
		(progn
		  (alert "Les librairies pour communiquer avec excel n'ont pas pu être importées, vérifier version excel du PC\n\n\t\t         *** Fin du programme ***")
		  (exit)
		  )
		)
	      )
	    )
	  ;; Choisir la feuille du classeur
	  (setq xl_classeur (vlax-get xl_fichier "Sheets"))
	  (setq xl_feuille (xlp-get-item xl_classeur "Liste filtré"))
	  
	  (setq compteur 0)
	  (repeat (length noms-recherchés)
	    
	    ;; Recherche de l'équipement
	    
	    ;;;	    (vlax-variant-value (vlax-invoke-method exl "Run" "Filtre" (vlax-make-variant "nom_equipement*" vlax-vbString)))
	    (vlax-invoke-method exl "Run" "Filtre" (vlax-make-variant (car (nth compteur noms-recherchés)) vlax-vbString)) ; Lancer fonction  excel avec argument
	    (setq selectexcel (vlax-variant-value (vlax-invoke-method exl "run" "ligne")))
	    (if (/= selectexcel 0) ; Jo met 0 si pas d'équipement
	      (progn
		(setq x (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (strcat "B" (itoa selectexcel))))))
		(setq y (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (strcat "C" (itoa selectexcel))))))
		(setq z (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (strcat "E" (itoa selectexcel))))))
		(setq pt (list (cadr (nth compteur noms-recherchés)) (caddr (nth compteur noms-recherchés)) (cadddr (nth compteur noms-recherchés)))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas
		(entmake
		  (list
		    '(0 . "LINE")
		    '(100 . "AcDbEntity")
		    '(100 . "AcDbPolyline")
		    (cons 8 "A SUPPRIMER")
		    (cons 10 pt)
		    (cons 11 (list x y z))
		    )
		  )
		(setq rotation-txt (atoi (angtos (angle (list x y z) pt))))
		(cond
		  ((<= (atoi (angtos (angle (list x y z) pt))) 90) (setq justification-txt 0)(setq rotation-txt (angle (list x y z) pt)))
		  ((<= (atoi (angtos (angle (list x y z) pt))) 180) (setq justification-txt 2) (setq rotation-txt (- (angle (list x y z) pt) 3.14159)))
		  ((<= (atoi (angtos (angle (list x y z) pt))) 270) (setq justification-txt 2) (setq rotation-txt (- (angle (list x y z) pt) 3.14159)))
		  ((<= (atoi (angtos (angle (list x y z) pt))) 360) (setq justification-txt 0) (setq rotation-txt (angle (list x y z) pt)))
		  )
		(entmake
		  (list
		    (cons 0 "TEXT")
		    (cons 1 (car (nth compteur noms-recherchés)))	; Contenu texte
		    (cons 8 "A SUPPRIMER")
		    (cons 10 pt) 					; Point d'insertion
		    (cons 11 (list x y z))				; Direction
		    (cons 40 100)					; Hauteur texte
		    (cons 50 rotation-txt)				; Angle de rotation
		    (cons 72 justification-txt)				; Justification du texte gauche 0 ou droite 2
		    (cons 73 1) 					; Justification du texte en bas
		    )
		  )
		(entmod (subst (cons 38 (caddr pt)) (assoc 38 (entget (entlast))) (entget (entlast))))
		)
	      (progn
		(setq problèmes (cons (strcat (car (nth compteur noms-recherchés)) " ne se trouve pas dans la liste " (substr (car (nth compteur noms-recherchés)) 1 3)) problèmes))
		(setq pt (list (cadr (nth compteur noms-recherchés)) (caddr (nth compteur noms-recherchés)) (cadddr (nth compteur noms-recherchés)))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas
		(setq liste-points (list (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt))))
		(entmake
		  (append
		    (list '(0 . "LWPOLYLINE")
			  '(100 . "AcDbEntity")
			  '(100 . "AcDbPolyline")
			  (cons 8 "A SUPPRIMER")
			  (cons 62 2)
			  (cons 70 1)
			  (cons 90 (length liste-points))
			  )
		    (mapcar '(lambda (x)(cons 10 x)) liste-points)
		    )
		  )
		(entmod (subst (cons 38 (caddr pt)) (assoc 38 (entget (entlast))) (entget (entlast))))
		)
	      )
	    (setq compteur (1+ compteur))
	    )
	  (vlax-invoke-method (vlax-get-property exl "ActiveWorkbook") "Close" :vlax-False) ; Fermer Excel sans sauvegarder
	  (vlax-release-object exl) ; S'assurer de la fermeture d'excel (not (vlax-object-released-p exl))
	  (gc) ; Force une récupération de place, ce qui libère de la mémoire inutilisée
	  )
	)
      (setvar "cmdecho" 1)
      (princ "CARRES ROUGE = Base caneco à maj // CARRES JAUNE = Pas encore dans la maquette")
      (princ)
      )
    )
  )

Sur excel en créant un module et en ajoutant ces lignes :

Option Explicit


Sub Filtre(repère As String)
Dim derligne As Long
derligne = Cells.Find("*", , , , xlByRows, xlPrevious).Row
ActiveSheet.Range("$A$1:$A$" & derligne).AutoFilter Field:=1, Criteria1:=repère
End Sub


Function ligne() As Long
Dim boucle1 As Long
Dim derligne As Long
ligne = 0
derligne = Cells.Find("*", , , , xlByRows, xlPrevious).Row
For boucle1 = 2 To derligne
    If Not Rows(boucle1).Hidden Then
        ligne = boucle1
        Exit Function
    End If
Next boucle1
End Function

Je préférai savoir récupérer la valeur d'une variable plus proprement que de faire une fonction pour récupérer une valeur donc je suis toujours preneur de cette info si quelqu'un l'a ;).

A bientôt,

Vincent

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @vins13007

Je ne suis pas concerné par ce sujet, mais je tiens à te félicite pour l'échange de la solution trouvée.

Merci beaucoup de respecter l'esprit d'échange qui a fait de ce forum ce qu'il est : une mine de solutions dans toutes les directions.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour @didier

Merci pour tes encouragements. C'est nous qui devont vous remercier pour toutes les réponses que vous nous apportées ainsi que pour vos sites ou pages perso. Je ne poste pas beaucoup car souvent je trouve les réponses grâce aux questions déjà posées sur ce forum ou sur internet mais pour le coup le contrôle d'excel par autocad est très peu abordée quand on sort de la récupération d'une info dans une cellule. Je vais continuer à chercher pour ne même plus avoir à faire une fonction excel afin de récupérer le numéro de ligne d'un filtre.

Amicalement,

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é